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

Python 如何配置rsyslog以便与SysLogHandler日志类一起使用?,python,python-3.x,logging,rsyslog,Python,Python 3.x,Logging,Rsyslog,为了将“myapp”的日志消息写入/var/log/local5.log,我使用 问题 “myapp”运行良好,没有错误,但没有记录任何内容,/var/log/local5.log保持为空 日志记录配置 日志配置文件的相关部分: handlers: mainHandler: class: logging.handlers.SysLogHandler level: INFO formatter: defaultFormatter

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

问题 “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”的主脚本中编写日志:

我在
/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)
  • /etc/rsyslog.d/40 local.conf

    local5.*                        /var/log/local5.log
    
    $template MyappTpl,"%$now% %timegenerated:12:23:date-rfc3339% %syslogtag%%msg%\n"
    
    local5.*                        /var/log/local5.log;MyappTpl
    
  • rsyslog试验 根据
    lsof
    输出,看起来
    rsyslogd
    正在收听
    /dev/log
    (还是我错了?)

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

    我不明白我错过了什么。与我使用的版本(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
    中添加了一个自定义模板:

    local5.*                        /var/log/local5.log
    
    $template MyappTpl,"%$now% %timegenerated:12:23:date-rfc3339% %syslogtag%%msg%\n"
    
    local5.*                        /var/log/local5.log;MyappTpl
    
    并相应地修改了
    /etc/rsyslog.d/40 local.conf

    local5.*                        /var/log/local5.log
    
    $template MyappTpl,"%$now% %timegenerated:12:23:date-rfc3339% %syslogtag%%msg%\n"
    
    local5.*                        /var/log/local5.log;MyappTpl
    
    我还想提到的是,匹配包(
    rsyslog doc
    forubuntu)提供的文档当然与安装的版本相匹配,并且提供了在线文档中没有的提示