如何在Python中将日志loggingconfiguration到系统日志?
我无法理解Python的logging
模块。 我的需求非常简单:我只想将所有内容logging到系统日志中。 阅读文档后,我想出了这个简单的testing脚本:
import logging import logging.handlers my_logger = logging.getLogger('MyLogger') my_logger.setLevel(logging.DEBUG) handler = logging.handlers.SysLogHandler() my_logger.addHandler(handler) my_logger.debug('this is debug') my_logger.critical('this is critical')
但是这个脚本不会在syslog中产生任何日志logging。 怎么了?
将此行更改为:
handler = SysLogHandler(address='/dev/log')
这对我有用
import logging import logging.handlers my_logger = logging.getLogger('MyLogger') my_logger.setLevel(logging.DEBUG) handler = logging.handlers.SysLogHandler(address = '/dev/log') my_logger.addHandler(handler) my_logger.debug('this is debug') my_logger.critical('this is critical')
您应始终使用本地主机进行日志logging,无论是通过TCP堆栈/ dev / log还是localhost。 这使完全RFC兼容和有function的系统日志守护进程能够处理系统日志。 这消除了远程守护进程的function,并提供了syslog守护进程的增强function,例如rsyslog和syslog-ng。 SMTP也是一样的理念。 只要把它交给本地的SMTP软件。 在这种情况下,使用“程序模式”而不是守护进程,但它是一样的想法。 让function更强大的软件来处理它。 重试,排队,本地假脱机,使用TCP而不是UDP为syslog等等成为可能。 你也可以像应该那样从代码中单独configuration这些守护进程。
保存你的应用程序的编码,让其他软件一起工作。
我添加了一些额外的评论,以防万一它有助于任何人,因为我发现这个交stream有用,但需要这一点额外的信息,以使其工作。
要使用SysLogHandlerlogin到特定设施,您需要指定设施值。 比如说你已经定义了:
local3.* /var/log/mylog
在系统日志中,那么你会想要使用:
handler = logging.handlers.SysLogHandler(address = ('localhost',514), facility=19)
而且还需要在UDP上使用syslog监听来使用localhost而不是/ dev / log。
从这里和其他地方拼凑起来的东西,这就是我在unbuntu 12.04和centOS6上运行的东西
在/etc/rsyslog.d/
中创build一个以.conf结尾的文件并添加以下文本
local6.* /var/log/my-logfile
重新启动rsyslog
,重新加载似乎rsyslog
用于新的日志文件。 也许它只会重新加载现有的conf文件?
sudo restart rsyslog
然后你可以使用这个testing程序来确保它实际工作。
import logging, sys from logging import config LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'formatters': { 'verbose': { 'format': '%(levelname)s %(module)s P%(process)d T%(thread)d %(message)s' }, }, 'handlers': { 'stdout': { 'class': 'logging.StreamHandler', 'stream': sys.stdout, 'formatter': 'verbose', }, 'sys-logger6': { 'class': 'logging.handlers.SysLogHandler', 'address': '/dev/log', 'facility': "local6", 'formatter': 'verbose', }, }, 'loggers': { 'my-logger': { 'handlers': ['sys-logger6','stdout'], 'level': logging.DEBUG, 'propagate': True, }, } } config.dictConfig(LOGGING) logger = logging.getLogger("my-logger") logger.debug("Debug") logger.info("Info") logger.warn("Warn") logger.error("Error") logger.critical("Critical")
您的syslog.conf是否设置为处理facility = user?
您可以使用facility参数来设置Pythonlogging器使用的设施,如下所示:
handler = logging.handlers.SysLogHandler(facility=SysLogHandler.LOG_DAEMON)
我发现syslog模块可以很容易地获得你描述的基本的日志logging行为:
import syslog syslog.syslog("This is a test message") syslog.syslog(syslog.LOG_INFO, "Test message at INFO priority")
还有其他的事情你也可以做,但即使只是前两行,你会得到你所要求的,因为我明白了。
从https://github.com/luismartingil/per.scripts/tree/master/python_syslog
#!/usr/bin/python # -*- coding: utf-8 -*- ''' Implements a new handler for the logging module which uses the pure syslog python module. @author: Luis Martin Gil @year: 2013 ''' import logging import syslog class SysLogLibHandler(logging.Handler): """A logging handler that emits messages to syslog.syslog.""" FACILITY = [syslog.LOG_LOCAL0, syslog.LOG_LOCAL1, syslog.LOG_LOCAL2, syslog.LOG_LOCAL3, syslog.LOG_LOCAL4, syslog.LOG_LOCAL5, syslog.LOG_LOCAL6, syslog.LOG_LOCAL7] def __init__(self, n): """ Pre. (0 <= n <= 7) """ try: syslog.openlog(logoption=syslog.LOG_PID, facility=self.FACILITY[n]) except Exception , err: try: syslog.openlog(syslog.LOG_PID, self.FACILITY[n]) except Exception, err: try: syslog.openlog('my_ident', syslog.LOG_PID, self.FACILITY[n]) except: raise # We got it logging.Handler.__init__(self) def emit(self, record): syslog.syslog(self.format(record)) if __name__ == '__main__': """ Lets play with the log class. """ # Some variables we need _id = 'myproj_v2.0' logStr = 'debug' logFacilityLocalN = 1 # Defines a logging level and logging format based on a given string key. LOG_ATTR = {'debug': (logging.DEBUG, _id + ' %(levelname)-9s %(name)-15s %(threadName)-14s +%(lineno)-4d %(message)s'), 'info': (logging.INFO, _id + ' %(levelname)-9s %(message)s'), 'warning': (logging.WARNING, _id + ' %(levelname)-9s %(message)s'), 'error': (logging.ERROR, _id + ' %(levelname)-9s %(message)s'), 'critical': (logging.CRITICAL, _id + ' %(levelname)-9s %(message)s')} loglevel, logformat = LOG_ATTR[logStr] # Configuring the logger logger = logging.getLogger() logger.setLevel(loglevel) # Clearing previous logs logger.handlers = [] # Setting formaters and adding handlers. formatter = logging.Formatter(logformat) handlers = [] handlers.append(SysLogLibHandler(logFacilityLocalN)) for h in handlers: h.setFormatter(formatter) logger.addHandler(h) # Yep! logging.debug('test debug') logging.info('test info') logging.warning('test warning') logging.error('test error') logging.critical('test critical')
import syslog syslog.openlog(ident="LOG_IDENTIFIER",logoption=syslog.LOG_PID, facility=syslog.LOG_LOCAL0) syslog.syslog('Log processing initiated...')
上述脚本将使用我们自定义的“LOG_IDENTIFIER”login到LOCAL0设施…您可以使用LOCAL [0-7]作为本地用途。
您还可以添加一个文件处理程序或旋转文件处理程序来将您的日志发送到本地文件: http : //docs.python.org/2/library/logging.handlers.html