我有 python 代码将日志发送到远程系统日志服务器,工作正常,但如果远程系统日志服务器出现故障,下面的代码将无限期地等待。
代码:
def writeSyslog (mtype, msg):
"""
Send messages/log to Syslog server
"""
try:
global loggers
if loggers.get('SplunkLogger'):
splunk_logger = loggers.get('SplunkLogger')
else:
handler = logging.handlers.SysLogHandler(address = (SyslogServer,SyslogPort), socktype=socket.SOCK_STREAM)
handler.setFormatter(logging.Formatter('%(asctime)s %(levelname)s %(message)s'))
splunk_logger = logging.getLogger('SplunkLogger')
splunk_logger.addHandler(handler)
loggers['SplunkLogger'] = splunk_logger
if "emerg" in mtype:
splunk_logger.emergency(msg)
elif "alert" in mtype:
splunk_logger.alert(msg)
elif "crit" in mtype:
splunk_logger.critical(msg)
elif "err" in mtype:
splunk_logger.error(msg)
elif "warn" in mtype:
splunk_logger.warning(msg)
elif "notice" in mtype:
splunk_logger.notice(msg)
elif "info" in mtype:
splunk_logger.info(msg)
else:
splunk_logger.debug(msg)
except:
sys.stdout.write("\t\tSyslog failed sending to %s:%d\n" % (SyslogServer,SyslogPort))
python:v2.7
我尝试添加超时,但它不期望任何超时参数。
我希望它放弃,以防远程系统日志服务器没有响应。
大多数日志记录模块处理程序都可以通过子类化来配置。 SysLogHandler 有一个用于此目的的
createSocket
方法。您需要做的是编写此方法的实现,以添加超时。这在一定程度上取决于您的确切设置/配置,但您的代码最终应该看起来与此有些类似:
import logging.handlers
class SysLogHandlerCustomTimeout(logging.handlers.SysLogHandler):
def createSocket(self):
super().createSocket()
self.socket.settimeout(10)
# other code ...
handler = SysLogHandlerCustomTimeout(...)