93 votes

Comment empiler un fichier journal en Python ?

J'aimerais mettre à ma disposition la sortie de tail -F ou quelque chose de similaire dans Python sans blocage ni verrouillage. J'ai trouvé un très vieux code pour faire cela aquí mais je pense qu'il doit y avoir un meilleur moyen ou une bibliothèque pour faire la même chose maintenant. Quelqu'un en connaît-il un ?

Idéalement, j'aurais quelque chose comme tail.getNewData() que je pouvais appeler chaque fois que je voulais plus de données.

15voto

Ijaz Ahmad Khan Points 3236

Toutes les réponses qui utilisent tail -f ne sont pas pythoniques.

Voici la méthode pythonique : ( sans utiliser d'outil ou de bibliothèque externe)

def follow(thefile):
     while True:
        line = thefile.readline()
        if not line or not line.endswith('\n'):
            time.sleep(0.1)
            continue
        yield line

if __name__ == '__main__':
    logfile = open("run/foo/access-log","r")
    loglines = follow(logfile)
    for line in loglines:
        print(line, end='')

12voto

Raymond Hettinger Points 50330

Idéalement, j'aurais quelque chose comme tail.getNewData() que je pourrais appeler chaque fois que je veux plus de données.

Nous en avons déjà un et il est très bien. Appelez simplement f.read() quand vous voulez plus de données. Il commencera à lire là où la lecture précédente s'est arrêtée et il lira jusqu'à la fin du flux de données :

f = open('somefile.log')
p = 0
while True:
    f.seek(p)
    latest_data = f.read()
    p = f.tell()
    if latest_data:
        print latest_data
        print str(p).center(10).center(80, '=')

Pour la lecture ligne par ligne, utilisez f.readline() . Parfois, le fichier en cours de lecture se termine par une ligne partiellement lue. Gérer ce cas avec f.tell() trouver la position actuelle du fichier et utiliser f.seek() pour déplacer le pointeur de fichier vers le début de la ligne incomplète. Voir cette recette ActiveState pour le code de travail.

7voto

Haroldo_OK Points 352

Vous pouvez utiliser la bibliothèque 'tailer' : https://pypi.python.org/pypi/tailer/

Il a une option pour obtenir les dernières lignes :

# Get the last 3 lines of the file
tailer.tail(open('test.txt'), 3)
# ['Line 9', 'Line 10', 'Line 11']

Et il peut aussi suivre un dossier :

# Follow the file as it grows
for line in tailer.follow(open('test.txt')):
    print line

Si l'on veut un comportement semblable à celui de la queue, celui-ci semble être une bonne option.

5voto

Kentzo Points 1684

Une autre option est le tailhead qui fournit les deux versions Python de de tail y head utilitaires et API qui peuvent être utilisés dans votre propre module.

Basé à l'origine sur le tailer Son principal avantage est la possibilité de suivre les fichiers par le chemin d'accès, c'est-à-dire qu'il peut gérer la situation lorsque le fichier est recréé. En outre, il comporte quelques corrections de bogues pour divers cas limites.

1voto

Peter Masiar Points 321

Python est "batteries incluses" - il a une belle solution pour cela : https://pypi.python.org/pypi/pygtail

Lit les lignes du fichier journal qui n'ont pas été lues. Se souvient de l'endroit où il a terminé la dernière fois, et continue à partir de là.

import sys
from pygtail import Pygtail

for line in Pygtail("some.log"):
    sys.stdout.write(line)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X