此刻,我正在编写一个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: ()
我如何确保程序停止并且可以进行适当的异常处理?
谢谢!
答案 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”,现在引发了异常。
这怎么可能?