You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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的目标文件名,可在配置中使用环境变量:
    :msg, contains, "my_python_app:" /var/log/remote/${env:MY_LOG_FILE}
    
    需确保rsyslog服务能读取到该环境变量(可通过systemctl edit rsyslog添加环境变量配置)。

内容的提问来源于stack exchange,提问作者Poori

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 21:47:25