如何为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
相关产品推荐
相关产品推荐

