2013-08-21 7 views
1

Nous essayons d'écrire un script en Perl qui fait un journal circulaire. Un programme génère un très gros fichier journal et nous voulons le séparer en 5,6 fichiers.Comment écrire un script de journal circulaire en Perl?

use Log::Dispatch::FileRotate; 

    my $file = Log::Dispatch::FileRotate->new(name  => 'file1', 
             min_level => 'info', 
             filename => 'C:\Test\Log.txt', 
             dir => 'C:\Test', 
             mode  => 'write' , 
             size  => 5, 
             max  => 6, 
            ); 


    $file->log(level => 'info', message => 'Comment'); 

Nous avons trouvé ce code en ligne, mais il se comporte de manière erratique. Ce script est-il supposé écrire un nouveau fichier à chaque fois que le fichier journal principal augmente de 5 Mo et dans 6 fichiers? Comment pouvons-nous accomplir cela? Merci.

+1

Avez-vous envisagé de consulter la documentation de Log :: Dispatch :: FileRotate? C'est sur CPAN. – simbabque

+0

Oui c'est la première chose que nous avons essayé. L'exemple provient de leur documentation. – Mefhisto1

Répondre

2

J'ai testé ce code, et je pense que size est en octets, donc si vous voulez écrire des journaux de 5 Mo, vous devez définir la taille à 5*1024*1024 ou quelque chose comme ça. Mon code de test, qui écrit 6 fichiers chaque 5 Mo.:

#!/usr/bin/perl 

use strict; 
use warnings; 
use Log::Dispatch::FileRotate; 

my $file = Log::Dispatch::FileRotate->new(
              name => 'file1', 
              min_level => 'info', 
              filename => '/tmp/log/some.log', 
              mode => 'append', 
              size => 5*1024*1024, 
              max => 6, 
              newline => 1 
             ); 

while (1) { 
     $file->log(level => 'info', message => time); 
     $file->log(level => 'debug', message => time." debug ".time); #this will not be logged, because of log level 
} 
+0

Salut, Merci pour la réponse, c'était très utile. Pensez-vous qu'il existe une méthode qui peut spécifier où copier les fichiers journaux, comme dir 'un chemin'? – Mefhisto1

+1

Je ne vois pas de telles options dans ce module. Il copie toujours les journaux tournés dans le même répertoire avec le journal d'origine. vous pouvez utiliser d'autres modules de journalisation si vous en avez réellement besoin, par exemple Logfile :: Rotate, comme le dit Borodin dans sa réponse – Suic

+0

Salut, pensez-vous qu'il est possible d'utiliser quelque chose comme move ($ file, "temp \ Logs \") ; Nous avons un peu modifié votre code, et nous avons eu exactement ce que nous cherchions. Cependant, étant donné que nous sommes encore en train de tester nous ne savons pas où le fichier journal cible sera situé, c'est pourquoi nous essayons de le réparer à partir d'ici et de placer automatiquement les journaux dans un répertoire séparé. Merci. – Mefhisto1

2

Je vous suggère d'utiliser quelque chose comme Log::Rolling ou Logfile::Rotate.

Ces deux modules sont des solutions prêtes à l'emploi pour votre problème et nous espérons que tous les bogues ont déjà été corrigés.

Questions connexes