一个用于多个python进程的简单记录器。

multilog的Python项目详细描述


https://travis-ci.org/humangeo/multilog.svghttps://coveralls.io/repos/github/humangeo/multilog/badge.svg?branch=master

一个简单的、多进程安全的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块-这些参数应该与多日志守护进程监听的服务器和端口相对应。默认情况下,守护进程使用localhostlogging.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+兼容。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java Android Action_Edit Intent无法像以前一样调用App Gallery来编辑图片   确保JRE兼容性的java适当程序(32或64位)   java JSONArray。for循环中的add(JSONObject)正在替换for循环中的旧值,数组由循环中的最后一个值组成   java需要帮助创建一个返回数组的方法,该数组的元素是另一个数组的平方   使用SmbFile w/groovy XmlSluper()创建xml。解析()Java   检查大小后的java ArrayIndexOutOfBoundsException   乘法表中的第k个最小元素   java 401 on请求,其中指定了'permitAll()'   java如何附加ORC文件   java hibernate类模型   java IDEA没有看到由自定义注释处理器生成的方法   Servlet中未声明java SerialVersionId   java linkedlist到达列表末尾时   java如何正确对齐EditText光标?   java 6编译器1.6上的eclipse重写方法错误   java如何在基于Jersey的RESTful Web服务中读取post数据   java如何在活动中正确使用接口?   Java的JIT编译器的工作速度有多快?