一个用于多个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第三方库


热门话题
对来自asyn线程的信号使用静态布尔与原子布尔的java差异   雅加达ee为什么当我往树上推三个物体时,树上只能放一个物体?   Eclipse中项目设置中的java错误   java GWT在发送前在JSON中序列化POST参数   java将构造函数类与am主类相结合   单击字段顶部时,java JTextField插入符号在开始位置的定位   在企业Java/中。Net项目,每个开发人员的类路径中是否都有所有依赖项?   java Firebase向dabase添加数据   java com。微软sqlserver。jdbc。SQLServerException:索引8超出范围   java Why flyway的数据库驱动程序依赖项没有在maven的pom插件中声明。xml?   arraylist如何在java中根据用户输入对内存中匹配的行进行排序?   在Java中,如何将元素(元素、优先级)放在PriorityQueue中?   在Java中从一堆代码中提取方程