跳转到主要内容

于 2025年04月22日 摘录自 Postfix logging to file or stdout

概述

Postfix 支持其自己的日志记录系统,作为 syslog 的替代方案(syslog 仍为默认设置)。此功能自 Postfix 3.4 版本起可用。

本文档涵盖的主题:

配置文件日志记录 ;

文件日志记录解决了MacOS的可用性问题,并消除了基于systemd系统的多个问题。

  1. 如果 master.cf 中不存在以下行,请添加(注意:行首不能有空格):

    postlog unix-dgram n - n - 1 postlogd
    

    注意:服务类型 "unix-dgram" 在 Postfix 3.4 中引入。在回滚到较旧的 Postfix 版本之前,请删除上述行。

  2. 配置 Postfix 以将日志写入指定位置,例如 /var/log/postfix.log。请参阅下文的 "日志文件轮换" 部分以管理日志文件。

    在下面的示例中,指定 maillog_file_permissions 是可选的(Postfix 3.9 及更高版本)。默认值为 0600,即仅超级用户可访问该文件;值 0644 还添加了"组"和"其他"读取权限。

    # postfix stop
    # postconf maillog_file=/var/log/postfix.log
    # postconf maillog_file_permissions=0644 # (Postfix 3.9 及更高版本)
    # postfix start
    

    默认情况下,日志文件名必须以 "/var" 或 "/dev/stdout" 开头(允许的前缀列表通过 maillog_file_prefixes 参数配置)。此安全机制可限制单个配置错误造成的损害。

配置将日志输出到标准输出 ;

将日志输出到标准输出在 Postfix 运行在容器中时非常有用,因为它消除了对 syslogd 的依赖。

  1. 如果 master.cf 中不存在以下行,请添加(注意:行首不能有空格):

    postlog unix-dgram n - n - 1 postlogd
    

    注意:服务类型 "unix-dgram" 是在 Postfix 3.4 中引入的。在回滚到较旧的 Postfix 版本之前,请删除上述行。

  2. 配置 main.cf 文件,将 "maillog_file" 设置为 "/dev/stdout"。
  3. 使用 "postfix start-fg" 启动 Postfix。

日志轮换 ;

命令 "postfix logrotate" 可手动执行或通过 cron 任务运行。它会记录所有错误,并在终端执行时将错误报告到 stderr。该命令实现以下步骤:

注意事项:

  • 此命令不会旋转路径位于 /dev 目录下的日志文件,例如 /dev/stdout。
  • 此命令目前不会删除旧日志文件。

限制

背景:

  • Postfix 由多个在后台运行的守护进程以及用于本地邮件提交或 Postfix 管理的不守护进程组成。
  • 将日志记录到 Postfix 日志文件或 stdout 需要 Postfix 的 postlogd(8) 服务。这确保了来自不同程序的并发日志记录不会混淆。
  • 所有 Postfix 程序均可记录到 syslog,但并非所有程序都具备使用 Postfix 日志服务所需的权限,且许多非守护进程程序不得将日志记录到 stdout,否则会破坏其输出。

限制:

  • 非守护进程的 Postfix 程序会在处理命令行选项和 main.cf 参数之前,将错误日志记录到 syslogd(8)。
  • 如果 Postfix 服务不可用,非守护进程程序 postfix(1)postsuper(1)postmulti(1)postlog(1) 将直接将日志记录到 $maillog_file。这些程序需要以 root 权限运行,例如在 Postfix 启动、重新加载或关闭时。
  • 其他非守护进程的 Postfix 程序绝不会直接写入 $maillog_file(此外,将日志写入标准输出会干扰某些程序的运行)。这些程序可以在以超级用户身份运行时,或其可执行文件具有 set-gid 权限时,将日志记录到 postlogd(8)。请勿在其他程序上设置此权限,除非这些程序是 postdrop(1)postqueue(1) 以及(Postfix ≥ 3.7)postlog(1) 之外的程序。