6
votes

Comment suivre un fichier journal dans TCL

dise il y a un fichier log.txt code> et une sorte de journal est annexé de manière permanente.

Je veux suivre ce fichier dans l'environnement TCL. P>

J'ai essayé ceci mais cela n'a pas fonctionné. P>

set log [open log.txt a]

for { } { true } { update; after 1000 } {

    # expected to get here the appended part
    read $log

    seek $log 0 end

}


1 commentaires

Peut-être que cela peut aider - http://code.activestate.com/recipes/65437-tail-a-file/


3 Réponses :


4
votes

Il suffit d'utiliser queue . Il en sait plus que vous sur la manière de gérer les cas complexes (vous pouvez regarder sa source).

Dans l'un de mes projets, j'ai quelque chose comme ça pour surveiller un fichier de trace produit par un outil propriétaire: < pré> xxx

L'idée générale est que vous reprochez queue sur un fichier donné puis entrez la boucle d'événement et le processus la ligne de sortie ligne.


3 commentaires

Tout en exploitant d'autres outils est généralement un excellent moyen de faire des choses, votre solution prend plus de code et nécessite un programme externe que de simplement mettre en œuvre une solution pure TCL.


@ Bryan Oakley, je vous invite honnêtement à regarder dans les sources de la queue GNU pour savoir que la tâche de regarder un fichier étant ajoutée de manière externe n'est pas aussi facile que celle qui semble être sur le premier coup d'œil. Bien sûr, il peut être fait à l'aide de TCL (à condition que vous tiriez d'abord un appel FCNTL () pertinent dans le niveau de script), mais pourquoi?


Même si vous avez besoin de la fonctionnalité -Seillle = nom de nom, ce n'est pas trop difficile à faire dans TCL - par exemple. Voir mon Flog .



0
votes

Vous n'êtes pas loin, juste quelques choses à réparer:

  1. Dans ce code, vous lisez à partir du fichier, qui ne l'ajoutez pas, d'autres processus le feront, afin d'ouvrir le fichier en mode lecture, pas en mode ajouté, c'est-à-dire. Déposez l'option "A" de la commande ouverte. LI>
  2. Vous ne devez rechercher que la fin du fichier une fois, avant de commencer à lire, sinon vous sauterez des trucs qui sont ajoutés plus tard, alors déplacez la commande de recherche devant la boucle. Li>
  3. Dans le code Publié, vous ne faites rien avec le texte que vous avez lu - je vais donner un exemple de simplement l'écrire à STDOUT. LI>
  4. Vous n'avez besoin que de la commande de mise à jour si votre traitement de la boucle consiste à mettre à jour une interface graphique ou autre chose qui nécessite la boucle d'événement - ce n'est pas nécessaire pour le code posté. Tout à fait cela donne: p>

    set log [open log.txt]
    seek $log 0 end
    
    for { } { true } { after 1000 } {
    
        # expected to get here the appended part
        puts -nonewline [read $log]
    }
    


0 commentaires

0
votes

J'ai réussi à écrire queue -f code> équivalent sur pure tcl. Le code est ci-dessous:

proc readHandler {handle} {
    puts -nonewline [read $handle]
    flush stdout
    # to reduce CPU overhead...
    after 1000
}

set hFile [open "file.log" "r"]
# seek to the end of file if needed
# seek $hFile 0 end 

fconfigure $hFile -buffering none -eofchar "" -blocking no
fileevent $hFile readable [subst {readHandler $hFile}]

#just for exiting into main event loop
vwait forever


2 commentaires

Je pense que vous constaterez que le fichier semble toujours lisible lorsque vous êtes à sa fin, le gestionnaire incendie continuellement et mâche tout votre CPU inutilement.


D'accord. Ensuite, vous pouvez toujours insérer la commande de sommeil (c'est-à-dire après 1000 ) dans le gestionnaire pour réduire les frais généraux de la CPU.