Python-daemon:保持记录

4 投票
2 回答
4541 浏览
提问于 2025-04-17 14:37

我有一个脚本,可以把一些数据记录到磁盘上:

logging.basicConfig(filename='davis-debug.log',level=logging.DEBUG) logging.basicConfig(filename='davis-error.log',level=logging.ERROR) logging.basicConfig(filename='davis-error.log',level=logging.WARNING) logging.basicConfig(filename='davis-error.log',level=logging.CRITICAL)

但是,当我像这样使用python-daemon时,记录就停止了。

try:
  with daemon.DaemonContext():
  station = VantageProStation()
  station.run()

except KeyboardInterrupt:
  logging.critical('Stopping user aborted with CTRL+C')
pass

我试过使用file_preserve,但logging.basicConfig并不会返回一个流。
而且我也不能通过files_preserve传递多个流……
当然,我希望我的记录能继续,我尝试把日志的定义放在我的类的init里面,但这也没有帮助。

2 个回答

1

守护进程的上下文会关闭所有的文件处理器,以确保它是一个“行为良好的守护进程”,除了在 files_preserve 中指定的那些文件处理器。你之前的思路是对的。

虽然可以从 logging 中获取文件处理器,但我建议你还是明确地创建一个文件日志记录器。

#!/usr/bin/env python

import daemon
import logging
import logging.handlers
from time import sleep
from datetime import datetime

logging.basicConfig()

file_logger = logging.FileHandler("/tmp/aaa.log", "w")

logger = logging.getLogger()
logger.addHandler(file_logger)
logger.setLevel(logging.INFO)

with daemon.DaemonContext(files_preserve=[file_logger.stream.fileno()]):
    while True:
        logger.info(datetime.now())
        sleep(1)
7

你有没有想过在你的守护进程里配置日志记录器呢?这样做对我来说是有效的:

#!/usr/bin/env python

import daemon
import logging
import logging.handlers
from time import sleep
from datetime import datetime

def time_logging_daemon():
    logger = logging.getLogger('time_logging_daemon')
    logger.addHandler(logging.handlers.SysLogHandler(address='/dev/log'))
    logger.setLevel(logging.INFO)
    while True:
        logger.info(datetime.now())
        sleep(1)

with daemon.DaemonContext():
    time_logging_daemon()

撰写回答