如何在将日志发送到远程系统日志服务器时添加超时?

问题描述 投票:0回答:1

我有 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

我尝试添加超时,但它不期望任何超时参数。

我希望它放弃,以防远程系统日志服务器没有响应。

python logging timeout syslog python-logging
1个回答
0
投票

大多数日志记录模块处理程序都可以通过子类化来配置。 SysLogHandler 有一个用于此目的的

createSocket
方法。您需要做的是编写此方法的实现,以添加超时。这在一定程度上取决于您的确切设置/配置,但您的代码最终应该看起来与此有些类似:

import logging.handlers

class SysLogHandlerCustomTimeout(logging.handlers.SysLogHandler):
    def createSocket(self):
        super().createSocket()
        self.socket.settimeout(10)

# other code ...

handler = SysLogHandlerCustomTimeout(...)
© www.soinside.com 2019 - 2024. All rights reserved.