使用Python向远程syslog服务器发送消息时的自定义异常处理

时间:2018-12-20 08:44:40

标签: python syslog

此刻,我正在编写一个syslog客户端,它将向远程syslog服务器发送消息。到目前为止,一切正常,但我遇到了以下问题。

当syslog服务器由于某种原因而关闭时,我需要捕获此错误,以便程序停止发送syslog消息,我们可以调查问题。

不幸的是,该程序继续运行,并且没有看到TCP套接字已关闭并引发异常。

我仅在终端收到回溯

ConnectionError: Cannot send requests while disconnected

相关代码:

--- Logging error --- Traceback (most recent call last):
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\logging\handlers.py", line 941, in emit
    self.socket.sendall(msg) ConnectionAbortedError: [WinError 10053]  Call stack:
File "c:\Users\Administrator\.vscode\extensions\ms-python.python-2018.12.1\pythonFiles\ptvsd_launcher.py", line 45, in <module>
    main(ptvsdArgs)
File "c:\Users\Administrator\.vscode\extensions\ms-python.python-2018.12.1\pythonFiles\lib\python\ptvsd\__main__.py", line 265, in main
    wait=args.wait)
File "c:\Users\Administrator\.vscode\extensions\ms-python.python-2018.12.1\pythonFiles\lib\python\ptvsd\__main__.py", line 258, in handle_args
    debug_main(addr, name, kind, *extra, **kwargs)
File "c:\Users\Administrator\.vscode\extensions\ms-python.python-2018.12.1\pythonFiles\lib\python\ptvsd\_local.py", line 45, in debug_main
    run_file(address, name, *extra, **kwargs)
File "c:\Users\Administrator\.vscode\extensions\ms-python.python-2018.12.1\pythonFiles\lib\python\ptvsd\_local.py", line 79, in run_file
    run(argv, addr, **kwargs)
File "c:\Users\Administrator\.vscode\extensions\ms-python.python-2018.12.1\pythonFiles\lib\python\ptvsd\_local.py", line 140, in _run
    _pydevd.main()
File "c:\Users\Administrator\.vscode\extensions\ms-python.python-2018.12.1\pythonFiles\lib\python\ptvsd\_vendored\pydevd\pydevd.py", line 1925, in main
    debugger.connect(host, port)
File "c:\Users\Administrator\.vscode\extensions\ms-python.python-2018.12.1\pythonFiles\lib\python\ptvsd\_vendored\pydevd\pydevd.py", line 1283, in run
    return self._exec(is_module, entry_point_fn, module_name, file, globals, locals)
File "c:\Users\Administrator\.vscode\extensions\ms-python.python-2018.12.1\pythonFiles\lib\python\ptvsd\_vendored\pydevd\pydevd.py", line 1290, in _exec
    pydev_imports.execfile(file, globals, locals)  # execute the script       
File "c:\Users\Administrator\.vscode\extensions\ms-python.python-2018.12.1\pythonFiles\lib\python\ptvsd\_vendored\pydevd\_pydev_imps\_pydev_execfile.py", line 25, in execfile
    exec(compile(contents+"\n", file, 'exec'), glob, loc)
File "c:\Users\Administrator\OneDrive\Documents\Python Scripts\testlogger.py", line 71, in <module>
    my_logger.info(i) Message: 'test4' Arguments: ()

我如何确保程序停止并且可以进行适当的异常处理?

谢谢!

2 个答案:

答案 0 :(得分:0)

SysLogHandler类(以及所有正在使用TCP的类)的默认行为是重试连接,这在createSocket()方法的文档中进行了解释:

  

尝试创建套接字;失败时,使用指数补偿   算法。最初失败时,处理程序将丢弃该消息   正在尝试发送。当后续消息由同一消息处理时   实例,直到一段时间后它才会尝试连接。的   默认参数是初始延迟为一秒,并且   如果在此延迟后仍无法建立连接,则处理程序   每次都会将延迟增加一倍,最多30秒。

     

此行为由以下处理程序属性控制:

retryStart (initial delay, defaulting to 1.0 seconds).
retryFactor (multiplier, defaulting to 2.0).
retryMax (maximum delay, defaulting to 30.0 seconds).

因为似乎没有您想要的“不重试”行为的选项,所以如果您确实希望,可以通过将其子类化并使用以下方法覆盖createSocket()方法来创建自己的处理程序像这样:

class MySysLogHandler(logging.handlers.SysLogHandler):
    def createSocket(self):
        try:
            self.sock = self.makeSocket()
        except OSError:
            # do your own error handling here ...

您可以通过查看the source code of createSocket() in CPython Github repo来进行更多挖掘(请注意,这是从master分支来的,可能不是您所使用的Python的确切版本)

答案 1 :(得分:0)

我切换到另一个解决方案,并停止使用SyslogHandler类。

我现在使用以下类,即我通过套接字编写了自己的syslog发送器。

function convertData(rawDataArray) {
    var keys = ['open', 'close', 'high', 'low', 'time'],
        result = Object.assign(...keys.map(k => ({ [k]: [] })));

    rawDataArray.forEach(a => keys.forEach((k, i) => result[k].push(a[i])));
    return result;
}

这很好用,并且在syslog服务器意外关闭时遇到异常。现在,我在调试时发现的唯一问题如下:

当我关闭系统日志服务器时,尝试发送消息时不会立即引发异常。

请参见以下示例:

1。)syslog服务器启动,我从for循环成功发送了第一条消息“ test1”。

2。)我关闭了系统日志服务器,现在我从for循环发送第二条消息“ test2”。什么都没有发生,也不例外!

3。)我发送了第三条消息“ test3”,现在引发了异常。

这怎么可能?