一个用于多个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使用ContentExchange设置请求属性   java Spark/Hdfs/Hdfsclient兼容性   java springcloudstreamkafka配置:instanceCount和instanceIndex   Java中web服务序列化日期   java用动态数据替换占位符   java git gc似乎覆盖了一个packfile,留下了一个打开的文件描述符,其中包含对“oldxxx.pack”的引用   为什么Apache项目对Java版本敏感?   java Anylogic帮助如何在导入的3dobject通过输送机上的多个“站”时更改其颜色?   JavaEclipseNeonM2E可以导入一个大型项目,但似乎不能自动解决依赖关系   java@FindBy搜索具有满足条件的子元素的元素   java如何将ActionEvent e与键绑定一起使用?   java转换以集中方式从外部库抛出的异常   java中用户文件/数据文件与系统/程序文件的区别   java使用变量字符串或字符作为对象名   字体使用Java图形操纵字符串中每个字符的形状   JavaFX图表移动数据   java RandomAccessFile:将所有项设置为相同的字节数?   java Google Play inapp Billing onPurchasesUpdated()错误响应代码1   java在不知道属性名和属性数的情况下处理json对象   java是否可以一次从HazelcastInstance(映射和列表)中删除所有数据?