增加从 postfix 启动的脚本的日志文件的文件大小

增加从 postfix 启动的脚本的日志文件的文件大小

我正在使用 Postfix 在向特定地址发送消息时运行脚本。该脚本是一个 Perl 脚本,它使用以下方式将日志写入文件:Log4perl。日志文件每天都会由 Log4perl 轮换。

除了一个小的例外情况外,它运行良好。当日志文件大小超过 50MB 时,脚本无法写入日志文件。

在对 Postfix 进行一些研究后,似乎这可能是 Postfix 的限制设置。以下是postconf可能相关的部分输出。

$ postconf | grep size
berkeley_db_create_buffer_size = 16777216
berkeley_db_read_buffer_size = 131072
body_checks_size_limit = 51200
bounce_size_limit = 50000
header_size_limit = 102400
mailbox_size_limit = 51200000
message_size_limit = 10240000
tcp_windowsize = 0

$ postconf | grep virtual_mailbox_limit
virtual_mailbox_limit = 51200000

是否有任何选项可以更改为取消日志文件大小 50MB 的限制从脚本创建?

为了完整性,以下是 Log4perl 的设置。

$ cat /some/path/to/my/log4perlsettings.cfg
log4perl.logger.mylog = DEBUG,LOGGER
log4perl.appender.LOGGER = Log::Dispatch::FileRotate
log4perl.appender.LOGGER.TZ=PST
log4perl.appender.LOGGER.DatePattern=yyyy-MM-dd
log4perl.appender.LOGGER.filename = /some/path/to/my/logs/logfile.log
log4perl.appender.LOGGER.mode = append
log4perl.appender.LOGGER.max = 30
log4perl.appender.LOGGER.layout = PatternLayout
log4perl.appender.LOGGER.layout.ConversionPattern = [%d] %P %p %r %H %F %L %C - %m%n

这些可能不相关,但这里是 Postfix 别名设置:

$ grep -r myscript /etc/postfix/
/etc/postfix/virtual:[email protected]        myscript

$ grep -r myscript /etc/aliases
myscript:       "|/some/path/to/my/script.pl"

编辑

以下是 的输出/var/log/maillog。这重复了很多次。

Dec 13 10:59:22 mymachine postfix/cleanup[22052]: EB5EA80196: message-id=<[email protected]>
Dec 13 10:59:22 mymachine postfix/bounce[22431]: 7C11080190: sender non-delivery notification: EB5EA80196
Dec 13 10:59:22 mymachine postfix/qmgr[2109]: EB5EA80196: from=<>, size=3456, nrcpt=1 (queue active)
Dec 13 10:59:22 mymachine postfix/qmgr[2109]: 7C11080190: removed
Dec 13 10:59:23 mymachine postfix/smtp[22342]: EB5EA80196: to=<[email protected]>, relay=mail.example.net[192.168.1.11]:25, delay=0.04, delays=0.01/0/0/0.03, dsn=2.0.0, status=sent (250 ok 1418435963 qp 19340)
Dec 13 10:59:23 mymachine postfix/qmgr[2109]: EB5EA80196: removed
Dec 13 10:59:39 mymachine postfix/smtpd[21267]: connect from unknown[192.168.2.12]
Dec 13 10:59:39 mymachine postfix/smtpd[21267]: CA0AB80190: client=unknown[192.168.2.12]
Dec 13 10:59:39 mymachine postfix/cleanup[21893]: CA0AB80190: message-id=<[email protected]>
Dec 13 10:59:39 mymachine postfix/smtpd[21267]: disconnect from unknown[192.168.2.12]
Dec 13 10:59:39 mymachine postfix/qmgr[2109]: CA0AB80190: from=<[email protected]>, size=712, nrcpt=1 (queue active)
Dec 13 10:59:40 mymachine postfix/local[21269]: CA0AB80190: to=<[email protected]>, relay=local, delay=0.43, delays=0.02/0/0/0.4, dsn=5.3.0, status=bounced (Command died with status 27: "/some/path/to/my/script.pl". Command output: Cannot write to '/some/path/to/my/logs/logfile.log': File too large at /usr/local/share/perl5/Log/Dispatch/File.pm line 141. )
Dec 13 10:59:40 mymachine postfix/cleanup[22052]: 3B8FD80196: message-id=<[email protected]>
Dec 13 10:59:40 mymachine postfix/bounce[22431]: CA0AB80190: sender non-delivery notification: 3B8FD80196
Dec 13 10:59:40 mymachine postfix/qmgr[2109]: 3B8FD80196: from=<>, size=2897, nrcpt=1 (queue active)
Dec 13 10:59:40 mymachine postfix/qmgr[2109]: CA0AB80190: removed
Dec 13 10:59:40 mymachine postfix/smtp[21679]: 3B8FD80196: to=<[email protected]>, relay=mail.example.net[192.168.1.11]:25, delay=0.04, delays=0/0/0/0.03, dsn=2.0.0, status=sent (250 ok 1418435980 qp 19356)
Dec 13 10:59:40 mymachine postfix/qmgr[2109]: 3B8FD80196: removed

最重要的可能是这一行:

Dec 13 10:59:40 mymachine postfix/local[21269]: CA0AB80190: to=<[email protected]>, relay=local, delay=0.43, delays=0.02/0/0/0.4, dsn=5.3.0, status=bounced (Command died with status 27: "/some/path/to/my/script.pl". Command output: Cannot write to '/some/path/to/my/logs/logfile.log': File too large at /usr/local/share/perl5/Log/Dispatch/File.pm line 141. )

/some/path/to/my/logs/logfile.log当文件大小达到 50MB(51200000 字节)时,此错误就开始发生。

編輯2

从命令行调用时(即无需从 Postfix 调用),perl 脚本可以正确运行。

答案1

这确实是从 postfix 继承的一个限制。原因是,当您通过将交付定向到管道来写入脚本时,这将被视为邮箱,就像您直接写入文件一样。因此,在 postfix 交付代理上设置的任何限制都将由脚本继承。

我想到三种方法来解决这个问题:

  1. 您更改了后缀配置中的限制;您已经查明了限制的来源。
  2. 您更频繁地运行 logrotate,以便文件大小不超过 50 MB。
  3. 您可以更改脚本以使用日志::调度::文件旋转,这样当文件超过 50 MB 时就会自动旋转。

相关内容