python-daemon日志记录的一个小问题

最近用到了python-daemon这个库来使一个进程成为daemon进程,代码大致如下:

#!env python
#coding=utf-8
import logging
import multiprocessing
import logging.config

import daemon

from test import wrapper2

logger = None
pool   = None

def main():
    global pool
    logger.info('@@@@@@@@@@@@@@@@@@@@@@')
    pool.map(wrapper2, [1, 2, 3, 4, 5])
    logger.info('######################')

if __name__ == '__main__':
    global logger, pool
    logging.config.fileConfig("logging.cfg")
    logger = logging.getLogger('analysis.main')
    preserve_fds = [handler.stream for handler in logger.handlers]
    with daemon.DaemonContext(files_preserve = preserve_fds):
        logger.info('start main function')
        pool = multiprocessing.Pool(processes = 10)
        main()

test.py的代码如下:

#!env python
#coding=utf-8
import logging

logger = logging.getLogger('analysis.test')
def wrapper2(i):
    logger.info('wrapper2 %s' % (i))

然后就出现了一个问题:test.py中的logger.info('wrapper2 %s' % (i))的这一条日志记录死活也不会生成日志记录,一开始我以为是multiprocessing导致的,但是当我改成单进程形式也还是同样的问题,折腾了一阵没有找到原因,这个时候就只能静下心来看代码了(哈哈,这个好像一直是我的法宝)。
当我看到with daemon.DaemonContext(files_preserve = preserve_fds)这一行的时候我好像找到了原因,那就是除了files_preserve以外的文件IO都会在daemon中被关闭,我代码中只把analysis.main这个对应的日志文件IO给保留了,其它的日志文件IO都会被关闭。
为了验证我的想法,我把analysis.test对应的日志IO也保留,然后再运行就一切OK了,但是此时还没有完全结束,因为我的logging.cfg中配置了上十个的日志文件,我可不想在main中都一个个都过一遍然后再保留,有没有办法能够把logging.cfg中所有的日志文件都列出来呢?当然是有的,就是用loggers = logging.Logger.manager.loggerDict.values(),修改后的代码如下:

#!env python
#coding=utf-8
import logging
import multiprocessing
import logging.config

import daemon

from test import wrapper2

logger = None
pool   = None

def main():
    global pool
    logger.info('@@@@@@@@@@@@@@@@@@@@@@')
    pool.map(wrapper2, [1, 2, 3, 4, 5])
    logger.info('######################')

if __name__ == '__main__':
    global logger, pool
    logging.config.fileConfig("logging.cfg")
    logger = logging.getLogger('analysis.main')
    preserve_fds  = []
    loggers = logging.Logger.manager.loggerDict.values()
    for log in loggers:
        try:
            p_fds = [handler.stream for handler in log.handlers]
            preserve_fds.extend(p_fds)
        except Exception,e:
            pass
    with daemon.DaemonContext(files_preserve = preserve_fds):
        logger.info('start main function')
        pool = multiprocessing.Pool(processes = 10)
        main()
`python-daemon` 是一个Python库,用于将你的应用程序转换为守护进程(daemon)。它提供了一种简单的方法,可以让你的应用程序在后台运行,并且具有守护进程的特性,如自动重启、日志记录等。 下面是使用 `python-daemon` 库的基本步骤: 1. 安装 `python-daemon` 库:使用 `pip` 命令安装 `python-daemon` 库: ```bash pip install python-daemon ``` 2. 导入必要的模块:在你的Python代码中,导入 `daemon` 模块和其他需要使用的模块。 ```python import daemon import time ``` 3. 编写你的应用程序逻辑:在你的代码中编写应用程序的逻辑。这可以是一个函数或一个类。 ```python def my_application_logic(): while True: # 在这里编写你的应用程序逻辑 print("Running...") time.sleep(1) ``` 4. 使用 `daemon.DaemonContext` 转换为守护进程:在主程序中使用 `daemon.DaemonContext` 上下文管理器将你的应用程序转换为守护进程。 ```python with daemon.DaemonContext(): my_application_logic() ``` 这将使你的应用程序在后台以守护进程的形式运行。当你运行这段代码时,它将在后台持续运行,并且你的终端会立即返回。 5. 运行你的代码:运行你的Python脚本,将其转换为守护进程。 ```bash python your_script.py ``` 现在,你的应用程序将在后台作为守护进程运行,并且你可以通过日志文件或其他机制来记录输出和错误。 请注意,守护进程转换后,不会再有终端输出。你可以使用日志记录或其他方法来捕获和处理输出。同时,确保在你的应用程序中正确处理异常,并在必要时进行重启等操作。 这只是一个简单的示例,你可以根据自己的需求和应用程序的逻辑进行更复杂的设置和优化。详细了解 `python-daemon` 库的文档可以帮助你更好地使用和配置守护进程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值