如何用Perl编写循环日志脚本?

如何用Perl编写循环日志脚本?,perl,logging,Perl,Logging,我们正试图用Perl编写一个脚本来生成循环日志。一个程序生成一个非常大的日志文件,我们想把它分成5,6个左右的文件 use Log::Dispatch::FileRotate; my $file = Log::Dispatch::FileRotate->new( name => 'file1', min_level => 'info',

我们正试图用Perl编写一个脚本来生成循环日志。一个程序生成一个非常大的日志文件,我们想把它分成5,6个左右的文件

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');
我们在网上找到了这段代码,但它的行为有点不稳定。当主日志文件增加5MB并最多增加6个文件时,该脚本是否应该编写一个新文件?我们如何才能做到这一点?
谢谢。

我测试了这段代码,认为大小是以字节为单位的,所以如果你想写5MB的日志,你需要将大小设置为5*1024*1024或者类似的东西。我的测试代码,每个5 MB写6个文件:

#!/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
}

我测试了这段代码,认为大小是以字节为单位的,所以如果您想写5MB日志,需要将大小设置为5*1024*1024或类似的值。我的测试代码,每个5 MB写6个文件:

#!/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
}

我建议你用或之类的东西


这两个模块都是您问题的现成解决方案,希望所有的bug都已经解决。

我建议您使用或之类的工具


这两个模块都是您问题的现成解决方案,希望所有的bug都已经解决。

您是否考虑过查看日志::调度::文件旋转的文档?是的,这是我们尝试的第一件事。示例来自他们的文档。您是否考虑过查看日志::调度::文件旋转的文档?是的,这是我们尝试的第一件事。这个例子来自他们的文档。嗨,谢谢你的回答,非常有用。您认为有没有一种方法可以指定在何处复制日志文件,比如dir'somepath'?我在这个模块中没有看到这样的选项。它总是在与原始日志相同的目录中复制旋转日志。如果您确实需要,您可以使用其他日志模块,例如Logfile::Rotate,正如Borodin在他的回答中所说,您是否可以使用move$file、temp\Logs之类的工具;我们对你的代码做了一些修改,得到了我们想要的东西。然而,由于我们仍在测试,我们不知道目标日志文件将位于何处,这就是为什么我们尝试从这里修复它,并自动将日志放入单独的目录中。谢谢。嗨,谢谢你的回答,非常有帮助。您认为有没有一种方法可以指定在何处复制日志文件,比如dir'somepath'?我在这个模块中没有看到这样的选项。它总是在与原始日志相同的目录中复制旋转日志。如果您确实需要,您可以使用其他日志模块,例如Logfile::Rotate,正如Borodin在他的回答中所说,您是否可以使用move$file、temp\Logs之类的工具;我们对你的代码做了一些修改,得到了我们想要的东西。然而,由于我们仍在测试,我们不知道目标日志文件将位于何处,这就是为什么我们尝试从这里修复它,并自动将日志放入单独的目录中。谢谢