1 votes

Compter le nombre de nouvelles lignes avec intervalle dans le journal

Existe-t-il un moyen/outil pour tail o watch un fichier journal et signaler le nombre de lignes qu'il contient ?

Par exemple, je veux voir le nombre de nouvelles entrées dans mysql.log toutes les 3 secondes.

watch wc -l /path/to/log.log1 ne montre que le montant cumulé. Je préfère ne pas truncate le journal entre les deux.

1voto

jason saldo Points 5036

Tout ce que vous avez à faire est de rediriger le fichier dans wc et il ne montrera que ce qui a été ajouté plutôt que le total.

watch wc -l < /path/to/log.log1

El < fait toute la différence.

0voto

Curt Hagenlocher Points 12432

Voici un peu de perl rapide et sale pour faire ce que vous voulez :

#!/usr/bin/perl

open(I, "<$ARGV[0]") || die "Can't open $ARGV[0]: $!\n";

while (1) {
  my $count = 0;
  while (<I>) { $count++; }
  print scalar(localtime()), ": $count lines\n";
  sleep(3);
  seek(I, 0, 1); # clear the EOF on I
}

close(I);

Voici le résultat de l'exécution dans une fenêtre :

[root@g3 tmp]# perl tt.pl FILE
Thu Dec  9 13:18:38 2010: 0 lines
Thu Dec  9 13:18:41 2010: 0 lines
Thu Dec  9 13:18:44 2010: 0 lines
Thu Dec  9 13:18:47 2010: 0 lines
Thu Dec  9 13:18:50 2010: 0 lines
Thu Dec  9 13:18:53 2010: 1 lines
Thu Dec  9 13:18:56 2010: 0 lines
Thu Dec  9 13:18:59 2010: 1 lines
Thu Dec  9 13:19:02 2010: 0 lines
Thu Dec  9 13:19:05 2010: 0 lines
Thu Dec  9 13:19:08 2010: 0 lines
Thu Dec  9 13:19:11 2010: 0 lines
Thu Dec  9 13:19:14 2010: 0 lines
Thu Dec  9 13:19:17 2010: 0 lines
Thu Dec  9 13:19:20 2010: 100 lines

Et voici les commandes que j'ai exécutées dans une autre fenêtre pour générer le résultat ci-dessus :

[root@g3 ~]# cd /tmp
[root@g3 tmp]# echo foo > FILE
[root@g3 tmp]# echo foo >> FILE
[root@g3 tmp]# for i in `seq 1 100`
> do
> echo $i >> FILE
> done
[root@g3 tmp]# 

J'espère que cela vous aidera...

0voto

nicob Points 84

Je ne connais pas d'outil standard mais vous pourriez utiliser le script Python suivant :

import sys, time

if not len(sys.argv) >= 2:
    print 'usage: %s FILENAME FREQUENCY' % (sys.argv\[0\])
    sys.exit(1)

fd=open(sys.argv\[1\])
freq=int(sys.argv\[2\])
fd.seek(0, 2)
while True:
    current = fd.tell()
    nlines = len(fd.readlines())
    if nlines:
        print nlines
    time.sleep(freq)

A tester :

$ (while true; do echo test; sleep 0.2; done) > log &
$ python watchandcount.py log 3

Il n'est pas parfait car il ne peut pas "surveiller" STDIN ou détecter quand le fichier a été remplacé (la fonction --follow=name option de la queue.

0voto

Eureka Points 101

Et voici un bash script :

TOTAL=0
while true; do
  NEW_TOTAL=$(wc -l /path/to/log.log1 | cut -f1 -d' ')
  echo $(($NEW_TOTAL - $TOTAL))
  TOTAL=$NEW_TOTAL
  sleep 3
done

Il a l'avantage d'être utilisable directement dans le Shell, à condition de ne pas être allergique aux " ;" ;)

TOTAL=0; while true; do NEW_TOTAL=$(wc -l TOTAL=0; while true; do NEW_TOTAL=$(wc -l big | cut -f1 -d' '); echo $(($NEW_TOTAL - $TOTAL)); TOTAL=$NEW_TOTAL; sleep 3; done | cut -f1 -d' '); echo $(($NEW_TOTAL - $TOTAL)); TOTAL=$NEW_TOTAL; sleep 3; done

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X