如何配置 rsyslog 以与 SysLogHandler 日志记录一起使用 class?
How to configure rsyslog for use with SysLogHandler logging class?
为了将 "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
输出,因为它有点长,但是提到 "local" 行:
# 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) 似乎已经过时,我无法找到适合自己的方式。不确定那是找到如何解决我的问题的地方。
编辑:
- 无法定义 "personal" 设施,例如 "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)提供的文档与安装的版本匹配,当然,并提供了我在网上没有找到的提示文档。
为了将 "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
输出,因为它有点长,但是提到 "local" 行:
# 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) 似乎已经过时,我无法找到适合自己的方式。不确定那是找到如何解决我的问题的地方。
编辑:
- 无法定义 "personal" 设施,例如 "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)提供的文档与安装的版本匹配,当然,并提供了我在网上没有找到的提示文档。