一个用于多个python进程的简单记录器。
multilog的Python项目详细描述
一个简单的、多进程安全的python记录器
为什么
python的内置记录器非常方便-它们很容易定制,并带有有用的功能 包括文件旋转之类的。这些文件处理程序是线程安全的,但不是进程安全的,因此,如果 你在一个预先分叉的环境中运行一个web服务器,例如,你冒着被你的工人践踏的风险 在写入公共日志文件时相互覆盖。文件锁定是一种可能的解决方法,但这很糟糕。
为了避免这种情况,建议使用基于套接字的记录器(a code sample is helpfully provided in the Logging Cookbook)。然而,它只是一个代码片段。 multilog是示例套接字记录器的无依赖性实现,具有一些细节,如fileconfig 支持和参数化。
如何
安装后,可以通过以下方式调用multilog守护程序:
mutlilog
用法:
usage: multilog [-h] [-s SERVER] [-p PORT] [-c CONFIG_PATH]
A simple logger for multiple Python processes.
optional arguments:
-h, --help show this help message and exit
-s SERVER, --server SERVER
The server hostname (default: localhost)
-p PORT, --port PORT The port to listen on. (default: 9020)
-c CONFIG_PATH, --config CONFIG_PATH
The log configuration to load. (default: logging.ini)
默认情况下,它将在当前目录中查找logging.ini文件。如果找不到,multilog将 对你大喊大叫。服务器的示例配置文件:
[loggers]keys=root[handlers]keys=multilogServerHandler[formatters]keys=simpleFormatter[logger_root]level=NOTSEThandlers=multilogServerHandler[handler_multilogServerHandler]class=handlers.TimedRotatingFileHandlerlevel=DEBUGformatter=simpleFormatterargs=('/var/log/appName/appName.log', 'midnight')[formatter_simpleFormatter]class=logging.Formatterformat=%(asctime)s %(levelname)7s: PID: %(process)5s | %(message)s [in %(pathname)s:%(lineno)d]
对于您的应用程序:
[loggers]keys=root[handlers]keys=multilogClientHandler[formatters]keys=simpleFormatter[logger_root]level=NOTSEThandlers=multilogClientHandler[handler_multilogClientHandler]class=handlers.SocketHandlerlevel=DEBUGformatter=simpleFormatterargs=('localhost', handlers.DEFAULT_TCP_LOGGING_PORT)[formatter_simpleFormatter]class=logging.Formatterformat=%(asctime)s %(levelname)7s: PID: %(process)5s | %(message)s [in %(pathname)s:%(lineno)d]
重要的字段是handler_multilogClientHandler部分中的args块-这些参数应该与多日志守护进程监听的服务器和端口相对应。默认情况下,守护进程使用localhost和logging.handlers.DEFAULT_TCP_LOGGING_PORT。
对于电力用户
如果要让multilog共享应用程序的配置,可以执行以下操作:
[loggers]keys=root,appName[handlers]keys=multilogClientHandler,multilogServerHandler[formatters]keys=simpleFormatter[logger_root]level=NOTSEThandlers=%(root_handler)s[logger_appName]level=INFOhandlers=propagate=1qualname=appName[handler_multilogClientHandler]class=handlers.SocketHandlerlevel=DEBUGformatter=simpleFormatterargs=('localhost', handlers.DEFAULT_TCP_LOGGING_PORT)[handler_multilogServerHandler]class=handlers.TimedRotatingFileHandlerlevel=DEBUGformatter=simpleFormatterargs=('/var/log/appName/appName.log', 'midnight')[formatter_simpleFormatter]class=logging.Formatterformat=%(asctime)s %(levelname)7s: PID: %(process)5s | %(message)s [in %(pathname)s:%(lineno)d]
然后,在应用程序中,将根处理程序名称传递到日志配置:
importlogginglogging.config.fileConfig(config_path,defaults={"root_handler":"multilogClientHandler"})
multilog将始终加载multilogServerHandler处理程序。如果不想运行multilog(例如,如果运行的是单线程本地dev服务器),只需将root_handler值更改为multilogServerHandler即可写入处理程序。
支架
multilog与python 2.6、2.7和3.3+兼容。