【问题标题】:Define pidfile in DaemonContext disable logger in python在 DaemonContext 中定义 pidfile 在 python 中禁用记录器
【发布时间】:2016-12-15 14:09:19
【问题描述】:

我正在尝试在 python 中创建一个守护程序服务,其中包含使用日志记录的日志到文件选项。 如果我将 pidfile 参数添加到 daemon.DaemonContext 构造函数,则 logger 不会将任何消息记录到 logger.log 文件中。但是,如果我删除该参数,一切正常。 运行没有任何错误。 谁能知道为什么 daemon.DaemonContext 中的 pidfile 参数禁用日志消息?我该如何解决?

任何帮助将不胜感激。谢谢

import signal
import daemon
import lockfile
import logging
import logging.handlers

def run():

    logger = logging.getLogger("DaemonLog")
    logger.setLevel(logging.INFO)
    handler = logging.FileHandler('logger.log')
    handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(message)s"))
    logger.addHandler(handler)

    daemon_context = daemon.DaemonContext(
        working_directory='/opt/myDaemon',
        umask=0o002,
        pidfile=lockfile.FileLock('/var/run/myDaemon.pid'),
        files_preserve=[handler.stream]
    )
    daemon_context.signal_map = {
        signal.SIGTERM: terminate_collector,
        signal.SIGHUP: terminate_collector,
        signal.SIGABRT: terminate_collector
    }

    with daemon_context as context:
        while True:
            logger.info("log")
            func()
            time.sleep(PARAM_SLEEP)

if __name__ == "__main__":
    run()

【问题讨论】:

    标签: python logging daemon lockfile


    【解决方案1】:

    我成功地解决了这个问题。问题是没有使用命令创建pidfile:

    pidfile=lockfile.FileLock('/var/run/myDaemon.pid')
    

    解决方案是使用 daemon.pidfile 模块而不是 lockfile 模块:

    pidfile=daemon.pidfile.PIDLockFile('/var/run/myDaemon.pid')
    

    完整代码解决方案:

    import signal
    import daemon
    import daemon.pidfile
    import lockfile
    import logging
    import logging.handlers
    
    def run():
    
        logger = logging.getLogger("DaemonLog")
        logger.setLevel(logging.INFO)
        handler = logging.FileHandler('logger.log')
        handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(message)s"))
        logger.addHandler(handler)
    
        daemon_context = daemon.DaemonContext(
            working_directory='/opt/myDaemon',
            umask=0o002,
            pidfile=daemon.pidfile.PIDLockFile('/var/run/myDaemon.pid'),
            files_preserve=[handler.stream]
        )
        daemon_context.signal_map = {
            signal.SIGTERM: terminate_collector,
            signal.SIGHUP: terminate_collector,
            signal.SIGABRT: terminate_collector
        }
    
        with daemon_context as context:
            while True:
                logger.info("log")
                func()
                time.sleep(PARAM_SLEEP)
    
    if __name__ == "__main__":
        run()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-18
      • 2012-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多