从 python 脚本将日志写入 /var/log 的最佳实践?

Best practice to write logs in /var/log from a python script?

我想将 python 主脚本中的一些日志信息写入 /var/log 中的文件。

当我调用 logger.info("Starting") 时,我在文件上得到一个 PermissionError,这是很正常的,因为 /var/log 中的文件属于 root 而我的程序不是 运行 作为 root。

我当然可以设置/var/log/my.log的权限,让我的应用写入它。 (例如设置相同的组)。但这对我来说似乎不是一个好习惯:如果我在另一台计算机上安装 myapp 怎么办?然后我应该在安装过程中更改日志文件的权限吗?还是有另一种更通用的方法来做到这一点? (就像将日志发送到 "the system" 的通用方式一样?我所说的通用方式是指也可移植,可以在 linux、freebsd 等上运行)

虽然我不确定它是否相关,但作为参考,这里是我的代码的一些部分:

主要脚本:

import logging, logging.config

from lib import settings
settings.init()

logging.config.fileConfig(settings.logging_conf_file)
logger = logging.getLogger(__name__)

在日志记录配置文件中与 settings.logging_conf_file 匹配的处理程序:

[handler_mainHandler]
class=FileHandler
level=INFO
formatter=defaultFormatter
filemode=w
args=('/var/log/myapp.log',)

如果 syslogd 在您的盒子上 运行,您可以尝试使用 SysLogHandler 来避免文件夹权限问题 (https://docs.python.org/2/library/logging.handlers.html#sysloghandler)。

要指定您的类别,您需要将设施参数设置为所需的,例如LOG_LOCAL5。在这种情况下,它将对应于 syslogd 的 local5.* 类别。

当您将设施指定为处理程序参数,而不是文件名时,您需要调整 syslog 配置以使用 syslogd 将日志记录写入特定文件。在 FreeBSD 中,syslog conf 文件是 /etc/syslog.conf (syslog.conf(5))。

您还可以将 . 之类的系统日志映射添加到 /var/log/all.log 以处理来自所有系统日志生产者的所有日志。如果有疑问,这有助于确定日志记录是否有效以及您的应用程序类别是什么。

对于 rsyslogd,可以在此处获取更多信息: