python - 如何配置 rsyslog 以与 SysLogHandler 日志类一起使用?

标签 python python-3.x logging rsyslog

为了将“myapp”的日志消息写入/var/log/local5.log,我使用SysLogHandler .

问题

“myapp”运行良好,没有错误,但没有记录任何内容,/var/log/local5.log 保持为空。

日志配置

日志配置文件的相关部分:

handlers:
    mainHandler:
        class: logging.handlers.SysLogHandler
        level: INFO
        formatter: defaultFormatter
        address: '/dev/log'
        facility: 'local5'

loggers:
    __main__:
        level: INFO
        handlers: [mainHandler]

日志测试

以下是我尝试在“myapp”的主脚本中编写日志的方法:

with open('myconfig.yml') as f:
    logging.config.dictConfig(yaml.load(f))

log = logging.getLogger(__name__)
log.info("Starting")

我在 /usr/lib/python3.4/logging/handlers.py 中添加了一些 sys.stderr.write() 来查看发生了什么,我明白了:

$ myapp
[SysLogHandler._connect_unixsocket()] Sucessfully connected to socket: /dev/log
[SysLogHandler.emit()] called
[SysLogHandler.emit()] msg=b'<174>2016/04/23 07:17:00.453 myapp: main: Starting\x00'
[SysLogHandler.emit()] msg sent to unix socket (no OSError)

rsyslog配置

  • /etc/rsyslog.conf(相关部分;禁用 TCP 和 UDP 系统日志接收):

    $ModLoad imuxsock # provides support for local system logging
    $ModLoad imklog   # provides kernel logging support
    
    [...]
    
    $IncludeConfig /etc/rsyslog.d/*.conf
    
  • /etc/rsyslog.d/40-local.conf:

    local5.*                        /var/log/local5.log
    

rsyslog测试

根据 lsof 输出,看起来 rsyslogd 正在监听 /dev/log(或者我错了吗?):

# lsof | grep "/dev/log"
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
      Output information may be incomplete.
rsyslogd  28044           syslog    0u     unix 0xffff8800b4b9b100       0t0    3088160 /dev/log
in:imuxso 28044 28045     syslog    0u     unix 0xffff8800b4b9b100       0t0    3088160 /dev/log
in:imklog 28044 28046     syslog    0u     unix 0xffff8800b4b9b100       0t0    3088160 /dev/log
rs:main   28044 28047     syslog    0u     unix 0xffff8800b4b9b100       0t0    3088160 /dev/log

我没有放整个 rsyslogd -N1 输出,因为它有点长,但是提到“本地”行:

# rsyslogd -N1 | grep local
rsyslogd: version 7.4.4, config validation run (level 1), master config /etc/rsyslog.conf
3119.943361369:7f39080fc780: cnf:global:cfsysline: $ModLoad imuxsock # provides support for local system logging
3119.944034769:7f39080fc780: rsyslog/glbl: using '127.0.0.1' as localhost IP
3119.946084095:7f39080fc780: requested to include config file '/etc/rsyslog.d/40-local.conf'
3119.946135638:7f39080fc780: config parser: pushed file /etc/rsyslog.d/40-local.conf on top of stack
3119.946432390:7f39080fc780: config parser: resume parsing of file /etc/rsyslog.d/40-local.conf at line 1
3119.946678298:7f39080fc780: config parser: reached end of file /etc/rsyslog.d/40-local.conf
3119.946697644:7f39080fc780: Decoding traditional PRI filter 'local5.*'
3119.946723904:7f39080fc780: symbolic name: local5 ==> 168
3119.949560475:7f39080fc780: PRIFILT 'local5.*'
3119.949675782:7f39080fc780:   ACTION 0x224cda0 [builtin:omfile:/var/log/local5.log]
3119.953397587:7f39080fc780: PRIFILT 'local5.*'
3119.953806713:7f39080fc780:   ACTION 0x224cda0 [builtin:omfile:/var/log/local5.log]
rsyslogd: End of config validation run. Bye.

我不明白我错过了什么。 rsyslog's documentation与我使用的版本 (7.4.4) 相匹配似乎已经过时,我无法找到自己的方式。不确定那是找到如何解决我的问题的地方。

编辑:

  • 不可能定义“个人”工具,例如“myapp”(即使它是在 rsyslog.conf 中定义的,所以我改为使用“local5”。

最佳答案

问题原因

我终于发现我之前创建的/var/log/local5.log 拥有者和组不合适(root:root)。它们是不合适的,因为 /etc/rsyslog.conf 明确告诉所有者和组应该是 syslog:syslog:

#
# Set the default permissions for all log files.
#
$FileOwner syslog
$FileGroup adm
$FileCreateMode 0640
$DirCreateMode 0755
$Umask 0022
$PrivDropToUser syslog
$PrivDropToGroup syslog

不幸的是,其他日志文件 rsyslog 应该处理(如 auth.log)也是 root:root,所以,看到来自ls -lah,我的和别人没有什么不同...(什么也是空的,我想知道为什么默认安装这样一个非功能性配置)。

不幸的是,rsyslog 没有记录任何错误(或者至少我没有找到错误的位置)。

一些可能对完成 rsyslog 配置有用的更多细节

作为旁注,rsyslog 期望它收到的消息采用特殊格式,如果没有,它会添加一些信息,默认情况下(时间戳主机名)。可以修改它们。无论如何,从我的 python 脚本中,我决定只将消息发送到日志并让 rsyslog 格式化输出。所以最后,我的日志记录配置文件的相关部分是:

formatters:
    rsyslogdFormatter:
        format: '%(filename)s: %(funcName)s: %(message)s'

handlers:
    mainHandler:
        class: logging.handlers.SysLogHandler
        level: INFO
        formatter: rsyslogdFormatter
        address: '/dev/log'
        facility: 'local5'

loggers:
    __main__:
        level: INFO
        handlers: [mainHandler]

并且我在/etc/rsyslog.conf中添加了自定义模板:

$template MyappTpl,"%$now% %timegenerated:12:23:date-rfc3339% %syslogtag%%msg%\n"

并据此修改/etc/rsyslog.d/40-local.conf:

local5.*                        /var/log/local5.log;MyappTpl

我还想提一下,匹配包(rsyslog-doc for ubuntu)提供的文档与安装的版本匹配,当然,并提供了我在在线文档中没有找到的提示.

关于python - 如何配置 rsyslog 以与 SysLogHandler 日志类一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36793037/

相关文章:

python - 为什么 groupby().agg(list_funcs) 在 Pandas 中使用函数列表比单独使用它们要花费更多的时间?

python - 从函数返回表达式之和的 Python 方式是什么?

python - python logging.debug() 中长列表的性能损失

c# - Log4Net 在单独的配置文件中

java - 如何使用 Java8s lambdas 改进日志记录机制

python - Python中的Web Scraping表数据

python - 如何在 tensorflow 中的张量的某些索引处插入某些值?

python - 一起打印 4 个列表,元素数量不等

python - 如何在 python 中将 1970 年之前的日期转换为纪元?

python - 如何将一条推文输入分类器模型?