python - 有没有人有一个工作的 WatchedFileHandler 和 StreamHandler 被配置为使用 Python 的日志记录?
问题描述
我正在尝试设置一个日志处理程序,它不仅将消息发送到屏幕,还发送到记录的文件。由于这是一个运行 3 个独立程序的事件驱动模拟器,因此我想配置一个 WatchedFileHandler。为了提供最小的工作集,这里是 dictConfig 设置:
# this is the sub_test.py logger setup
import os
import logging, logging.handlers, logging.config
def setup_logging(name, fname, args, mode='a', idtag=""):
log_file = os.path.splitext(fname)[0]+".log"
level = 'ERROR'
if any(x in ["-v","--verbose"] for x in args):
level = 'INFO'
if any(x in ["-d","--debug"] for x in args):
level = 'DEBUG'
conf = {
'version': 1,
'disable_existing_loggers': True,
'formatters': {
'default': {'format':name+' (default): %(levelname)s - %(message)s',
'datefmt':'%Y-%m-%d %H:%M:%S'},
'SH': {'format':name+' ('+idtag+'SH): %(levelname)s - %(message)s',
'datefmt':'%Y-%m-%d %H:%M:%S'},
'FH': {'format':name+' ('+idtag+'FH): %(levelname)s - %(message)s',
'datefmt':'%Y-%m-%d %H:%M:%S'},
},
'handlers': {
'console': {
'level': level,
'class': 'logging.StreamHandler',
'formatter': 'SH',
'stream': 'ext://sys.stdout'
},
'file': {
'level': 'DEBUG',
'class': 'logging.handlers.WatchedFileHandler',
'formatter': 'FH',
'filename': log_file,
'mode': mode,
# more?
},
},
'loggers': {
'': { # the root logger
'level': level,
'handlers': ['console'],
'propegate': False
},
name: {
'level': 'DEBUG',
'handlers': ['file'],
'propegate': True
},
},
#'propagate': True
}
logging.config.dictConfig(conf)
logger = logging.getLogger(name)
return logger
使用一个简单的服务程序“sub_srv.py”:
#!/usr/bin/env python3
# a simple service example with some logging.
import sub_test
from time import sleep
import logging
LOG_NAME="test_log"
logger = sub_test.setup_logging(LOG_NAME, "test.log", ["-d"], mode='a', idtag="srv:")
logger.debug(" inside of the server")
sleep(1)
exit(1)
和一个简单的测试程序驱动它:
from subprocess import Popen, PIPE
import sys
import sub_test
from time import sleep
import logging
LOG_NAME="test_log"
logger = sub_test.setup_logging(LOG_NAME, "test.log", sys.argv, mode='w', idtag="main:")
logger.info("here we go")
r = Popen("./sub_srv.py")
while True:
if r.poll():
break
print("ok...")
sleep(0.5)
logger.info("done...")
logging.shutdown()
我从 StreamHandler 得到以下输出:
test_log (main:SH): INFO - here we go
ok...
test_log (srv:SH): DEBUG - inside of the server
ok...
ok...
test_log (main:SH): INFO - done...
但我将以下输出写入“test.log”文件:
test_log (main:FH): INFO - here we go
test_log (main:FH): INFO - done...
of the server
对我来说很明显,输出没有按预期刷新和重新打开。我也尝试了设置传播变量的各种组合,但我无法解决这个问题。任何建议表示赞赏。
解决方案
备查。我让它工作了。日志的 WatchedFileHandler 似乎存在错误(我将报告)。解决方法是简单地将上面示例中的 'mode'= mode(其中子例程 mode='w')更改为 'mode'='a' 并在第一次执行 os.remove(log_file) 以清除文件。
希望这是有用的。
推荐阅读
- flutter - 如何绘制一个 3 个四分之一圆用作颤动中的边框?
- html - EJS IF 语句内的 HTML 标记
- mysql - HIVE / SPARK SQL 中的 QUALIFY 等效项
- c# - 实体框架与 IdentityUser 的关系未解决
- mariadb - Mariadb 复制主到主问题
- flutter - Stripe 不显示付款单
- qgis - 在虚拟层查询中获取层名
- amazon-web-services - 是否有针对 Binderhub 的 AWS 支持?
- n-queens - 找到第一个解决方案后如何停止递归?
- python - 如何在 VSCode 中显示/预览 python 文档字符串?