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

如何为Python向远程Syslog服务器发送日志添加超时机制?

解决Python2.7 SysLogHandler TCP连接无限等待问题

Python2.7官方的SysLogHandler未提供TCP连接超时参数,当远程Syslog服务器宕机时,使用TCP模式(socktype=socket.SOCK_STREAM)会出现无限阻塞的情况。我们可以通过子类化SysLogHandler,重写其createSocket方法来添加超时控制。

自定义带超时的SysLogHandler

import socket
import logging.handlers

class TimeoutSysLogHandler(logging.handlers.SysLogHandler):
    def __init__(self, address=('localhost', logging.handlers.SYSLOG_UDP_PORT),
                 facility=logging.handlers.SysLogHandler.LOG_USER,
                 socktype=socket.SOCK_DGRAM, timeout=5.0):
        self.timeout = timeout
        super(TimeoutSysLogHandler, self).__init__(address, facility, socktype)
    
    def createSocket(self):
        super(TimeoutSysLogHandler, self).createSocket()
        # 为socket设置超时时间
        self.socket.settimeout(self.timeout)

修改日志发送函数

将原代码中的SysLogHandler替换为自定义的TimeoutSysLogHandler,并指定超时时间(示例设为5秒):

import sys
import logging
import socket

loggers = {}
SyslogServer = "your-syslog-server"
SyslogPort = 514

def writeSyslog(mtype, msg):
    """
    Send messages/log to Syslog server
    """
    try:
        global loggers
        if loggers.get('SplunkLogger'):
            splunk_logger = loggers.get('SplunkLogger')
        else:
            # 使用自定义带超时的Handler
            handler = TimeoutSysLogHandler(address=(SyslogServer, SyslogPort), 
                                          socktype=socket.SOCK_STREAM,
                                          timeout=5.0)
            handler.setFormatter(logging.Formatter('%(asctime)s %(levelname)s %(message)s'))
            splunk_logger = logging.getLogger('SplunkLogger')
            splunk_logger.addHandler(handler)
            loggers['SplunkLogger'] = splunk_logger
        # 用字典映射简化日志级别判断
        level_map = {
            "emerg": splunk_logger.emergency,
            "alert": splunk_logger.alert,
            "crit": splunk_logger.critical,
            "err": splunk_logger.error,
            "warn": splunk_logger.warning,
            "notice": splunk_logger.notice,
            "info": splunk_logger.info
        }
        log_method = level_map.get(mtype, splunk_logger.debug)
        log_method(msg)
    except Exception as e:
        sys.stdout.write("\t\tSyslog failed sending to %s:%d, error: %s\n" % (SyslogServer, SyslogPort, str(e)))

说明

  • 自定义Handler在创建socket后会设置指定超时,当服务器无响应时,socket会在超时后抛出异常,被except块捕获,避免无限等待。
  • 优化了原代码的日志级别判断逻辑,用字典映射替代多分支elif,代码更简洁易维护。
  • 可根据实际需求调整timeout参数的数值(单位:秒)。

内容的提问来源于stack exchange,提问作者Prateek Kumar Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 06:33:20