本地配置Python Syslog日志后访问日志缺失,求排查方案
我碰到过好几次类似的情况,结合你的配置和症状,大概率是这几个容易忽略的点导致的,一个个排查:
CherryPy访问日志未绑定到自定义Logger
CherryPy默认自带一套访问日志的输出逻辑,哪怕你配置了cherrypy_access这个Logger,如果没明确告诉CherryPy用它,访问日志还是会走默认渠道(比如控制台或者默认文件),根本不会到你配置的SysLogHandler。你需要在CherryPy的全局配置里加上这两行:cherrypy.config.update({ 'log.access_file': '', # 关闭默认的文件输出 'log.access_log': logging.getLogger('cherrypy_access') # 把访问日志绑定到你自定义的Logger })这是最常见的遗漏点,很多人只配置了logging模块的Handler,却忘了给CherryPy做这个绑定。
检查Formatter是否抛出异常
你给访问日志用了jsonacc这个自定义JSON formatter,会不会是这个Formatter在处理CherryPy访问日志的字段时出错了?比如访问日志里没有Formatter期望的某个字段,导致格式化失败,日志直接被丢弃。可以临时把formatter改成simple或者一个极简的字符串格式,测试访问日志能不能正常发送到UDP端口,如果能,就回去排查你的jsonaccFormatter的字段配置。尝试更换Syslog Facility
你给两个日志都用了auth这个facility,虽然用nc直接监听理论上不会过滤,但有些本地Syslog的前置配置(比如rsyslog的规则)可能会对auth类日志有特殊处理,哪怕你用nc监听,也可以试试把facility换成最通用的user,看看是不是这个原因导致访问日志被拦截。验证Logger是否真的收到了访问日志
可以给cherrypy_access临时加一个FileHandler,看看访问日志是不是真的生成了:"cherrypy_access": { "level": "INFO", "handlers": ["syslog_udp", "local_file"], "class": "logging.handlers.SysLogHandler", "address": ["localhost", 10003], "facility": "auth", "formatter": "jsonacc" }, "local_file": { "class": "logging.FileHandler", "filename": "/tmp/test_cherrypy_access.log" }如果
/tmp/test_cherrypy_access.log里有访问日志,说明问题出在SysLogHandler的UDP发送环节;如果没有,那还是CherryPy没把日志导到这个Logger,回到第一个排查点。
最后再确认下你的nc监听命令没问题:nc -l -u 10003是正确的UDP监听方式,也可以在另一个终端用echo "test access log" | nc -u localhost 10003测试下端口能不能收到消息,排除端口本身的问题。
内容的提问来源于stack exchange,提问作者noober

