如何用Python将日志按指定文件名发送至远程Rsyslog服务器
解决方案
你的代码核心问题是误用了FileHandler:它只能操作本地文件系统(或已挂载到本地的远程共享目录),这并非通过rsyslog传输日志的正确方式。要实现「将日志以指定文件名存储到远程rsyslog服务器」,需要分两步完成:Python端通过SysLogHandler发送日志到rsyslog服务器,再在rsyslog服务器上配置规则,将特定来源的日志写入目标文件。
1. 修正Python代码
保留SysLogHandler并为日志添加唯一标识,方便rsyslog服务器识别过滤:
import logging from logging.handlers import SysLogHandler logger = logging.getLogger('my_logger') logger.setLevel(logging.INFO) # 配置SysLogHandler,指向远程rsyslog服务器的514端口(默认UDP协议) syslog_handler = SysLogHandler(address=('192.168.1.105', 514)) # 格式化日志,添加自定义标识"my_python_app:",用于rsyslog过滤 syslog_formatter = logging.Formatter('my_python_app: %(asctime)s %(levelname)s %(message)s') syslog_handler.setFormatter(syslog_formatter) logger.addHandler(syslog_handler) # 测试日志发送 logger.info('This is a log message.')
2. 配置远程rsyslog服务器
步骤1:开启rsyslog的远程接收功能
编辑rsyslog主配置文件(通常为/etc/rsyslog.conf或/etc/rsyslog.d/50-default.conf),取消对应协议的注释:
- 若使用UDP:
module(load="imudp") input(type="imudp" port="514") - 若使用TCP:
module(load="imtcp") input(type="imtcp" port="514")
步骤2:添加自定义日志存储规则
在/etc/rsyslog.d/目录下新建配置文件(如90-my-python-app.conf),写入过滤规则:
# 过滤包含"my_python_app:"标识的日志,写入指定文件 :msg, contains, "my_python_app:" /var/log/remote/filehandler.log # 可选:阻止该日志重复写入其他默认日志文件 & stop
步骤3:重启rsyslog服务生效
sudo systemctl restart rsyslog
补充说明
- 若需要更精准的过滤(比如基于来源IP),可修改rsyslog规则:
if $fromhost-ip == '你的Python服务器IP' and $msg contains 'my_python_app:' then /var/log/remote/filehandler.log & stop - 若要通过环境变量指定rsyslog的目标文件名,可在配置中使用环境变量:
需确保rsyslog服务能读取到该环境变量(可通过:msg, contains, "my_python_app:" /var/log/remote/${env:MY_LOG_FILE}systemctl edit rsyslog添加环境变量配置)。
内容的提问来源于stack exchange,提问作者Poori
相关产品推荐
相关产品推荐

