- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个进程使用 logging.SyslogHandler 通过 TCP 将日志发送到系统日志服务器。不幸的是,如果系统日志服务器由于某种原因重新启动,进程将停止发送日志并且无法重新建立连接。
我想知道是否有人知道克服这种行为并强制 logging.SyslogHandler 重新建立连接的方法。
使用处理程序的代码类似于:
import logging
import logging.handlers
import logging.config
logging.config.fileConfig('logging.cfg')
logging.debug("debug log message")
logging.cfg:
[loggers]
keys=root,remote
[handlers]
keys=local,remote
[logger_remote]
qualname=remote
level=INFO
handlers=remote
[logger_root]
qualname=root
level=DEBUG
handlers=local
[handler_local]
class=handlers.StreamHandler
level=DEBUG
formatter=local
args=(sys.stdout,)
[handler_remote]
class=handlers.SysLogHandler
level=DEBUG
formatter=remote
args=(('localhost', 514), handlers.SysLogHandler.LOG_USER, 1)
[formatters]
keys=local,remote
[formatter_local]
format=%(module)s %(levelname)s %(message)s
[formatter_remote]
format=%(asctime)s %(message)s
系统日志服务器重启后我不断收到的错误是:
Traceback (most recent call last):
File "/usr/local/lib/python2.7/logging/handlers.py", line 866, in emit
self.socket.sendall(msg)
File "/usr/local/lib/python2.7/socket.py", line 228, in meth
return getattr(self._sock,name)(*args)
error: [Errno 32] Broken pipe
如果有任何见解,我将不胜感激。谢谢!
最佳答案
我遇到了同样的问题。我必须编写一个自定义处理程序来处理损坏的管道异常并重新创建套接字。
class ReconnectingSysLogHandler(logging.handlers.SysLogHandler):
"""Syslog handler that reconnects if the socket closes
If we're writing to syslog with TCP and syslog restarts, the old TCP socket
will no longer be writeable and we'll get a socket.error of type 32. When
than happens, use the default error handling, but also try to reconnect to
the same host/port used before. Also make 1 attempt to re-send the
message.
"""
def __init__(self, *args, **kwargs):
super(ReconnectingSysLogHandler, self).__init__(*args, **kwargs)
self._is_retry = False
def _reconnect(self):
"""Make a new socket that is the same as the old one"""
# close the existing socket before getting a new one to the same host/port
if self.socket:
self.socket.close()
# cut/pasted from logging.handlers.SysLogHandler
if self.unixsocket:
self._connect_unixsocket(self.address)
else:
self.socket = socket.socket(socket.AF_INET, self.socktype)
if self.socktype == socket.SOCK_STREAM:
self.socket.connect(self.address)
def handleError(self, record):
# use the default error handling (writes an error message to stderr)
super(ReconnectingSysLogHandler, self).handleError(record)
# If we get an error within a retry, just return. We don't want an
# infinite, recursive loop telling us something is broken.
# This leaves the socket broken.
if self._is_retry:
return
# Set the retry flag and begin deciding if this is a closed socket, and
# trying to reconnect.
self._is_retry = True
try:
__, exception, __ = sys.exc_info()
# If the error is a broken pipe exception (32), get a new socket.
if isinstance(exception, socket.error) and exception.errno == 32:
try:
self._reconnect()
except:
# If reconnecting fails, give up.
pass
else:
# Make an effort to rescue the recod.
self.emit(record)
finally:
self._is_retry = False
关于Python SysLogHandler 通过 TCP : handling connection loss,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40091456/
我正在尝试使用 python 日志记录模块将消息记录到远程 rsyslog 服务器。消息已收到,但它会将每条消息的消息连接在一行中。这是我的代码示例: to_syslog_priority: dict
已关注 advice ,我计划将多个时间关键的 python 进程(客户端)的错误记录到单个日志记录进程(服务器)。 SysLogHandler似乎是正确的选择,因为它使用 UDP(我宁愿与系统无关)
我尝试使用 logging.handlers.SysLogHandler 进行日志记录并将其发送到 logstash。 Python代码: import logging from logging im
我试图理解为什么 Python 的日志记录框架 (logging.handlers) 中的 SyslogHandler 类没有实现 RFC 6587 描述的任何框架机制: 八位字节计数:它将消息长度“
我正在编写一个应用程序,它使用 logging 模块和 logging.StreamHandler( ) 和 logging.handlers.SysLogHandler(address='/dev/
我正在研究如何从我的 Python 应用程序中登录到 syslog,我发现有两种方法: 使用 syslog.syslog()例行公事 使用记录器模块SysLogHandler 哪个是最好的选择,每个的
我正在使用 python sysloghander 将日志发送到集中式系统日志服务器。该代码正在运行,但我在自定义格式时遇到了一些问题。下面是我写的代码。 #!/usr/bin/python impo
此代码使用 syslog 模块记录到 syslog: import syslog syslog.syslog(syslog.LOG_ERR, 'a') 下面是使用 logging 模块的等效代码: i
我无法让 SysLogHandler 工作,这让我抓狂。 这是我的代码: import logging import logging.handlers logger = loggin
为了将“myapp”的日志消息写入/var/log/local5.log,我使用SysLogHandler . 问题 “myapp”运行良好,没有错误,但没有记录任何内容,/var/log/local
我正在尝试配置 Python 应用程序以使用标准 Linux 系统日志记录到/var/log/messages。但是,当我尝试创建系统日志处理程序时,出现错误 socket.error: [Errno
我有一个进程使用 logging.SyslogHandler 通过 TCP 将日志发送到系统日志服务器。不幸的是,如果系统日志服务器由于某种原因重新启动,进程将停止发送日志并且无法重新建立连接。 我想
我使用 logging.fileConfig() 配置了日志记录。我有一个根记录器转到使用 SysLogHandler('/dev/log', handlers.SysLogHandler.LOG_U
当我在我的 mac 上运行它时: import logging.handlers logger = logging.getLogger(__name__) logger.setLevel(loggin
我使用 SysLogHandler 配置了一个 Python 记录器,并作为测试使用所有级别记录了一些消息:调试、信息、警告、错误、严重。如果我运行“syslog”或查看 Console.app 显示
在 OS X 10.10.4 上使用 Python 3.5,我在输出系统日志消息中得到虚假的 ] 字符。这可以通过以下示例程序看到: #!/usr/bin/env python3 import log
我在 SO 上遵循了几个答案,但无济于事。 我正在 Macbook (Yosemite) 上开发,但我们的测试/生产机器是 Debian 7(使用 rsyslog)。我正在尝试以一种既可以在本地工作又
我是一名优秀的程序员,十分优秀!