【问题标题】:Python Persist Log File Stream with PyInotifyPython 使用 PyInotify 持久化日志文件流
【发布时间】:2017-03-08 14:12:23
【问题描述】:

我在通过pyinotify 和它的线程保持日志文件写入流时遇到问题。我正在使用pyinotify 监视目录中的CLOSE_WRITE 文件事件。在初始化pyinotify 之前,我使用内置的logging 模块创建一个日志流,如下所示:

import os, logging
from logging import handlers
from logging.config import dictConfig


log_dir = './var/log'
name = 'com.sadmicrowave.tesseract'
LOG_SETTINGS = { 'version' : 1
                ,'handlers': { 'core': {
                                    # make the logger a rotating file handler so the file automatically gets archived and a new one gets created, preventing files from becoming too large they are unmaintainable. 
                                    'class'     : 'logging.handlers.RotatingFileHandler'
                                    # by setting our logger to the DEBUG level (lowest level) we will include all other levels by default
                                    ,'level'        : 'DEBUG'
                                    # this references the 'core' handler located in the 'formatters' dict element below
                                    ,'formatter'    : 'core'
                                    # the path and file name of the output log file
                                    ,'filename'     : os.path.join(log_dir, "%s.log" % name)
                                    ,'mode'         : 'a'
                                    # the max size we want to log file to reach before it gets archived and a new file gets created
                                    ,'maxBytes'     : 100000
                                    # the max number of files we want to keep in archive
                                    ,'backupCount'  : 5 }
                            }
                             # create the formatters which are referenced in the handlers section above
                            ,'formatters': {'core': {'format': '%(levelname)s %(asctime)s %(module)s|%(funcName)s %(lineno)d: %(message)s' 
                                            }
                            }
                            ,'loggers'   : {'root': {
                                                        'level'     : 'DEBUG' # The most granular level of logging available in the log module
                                                        ,'handlers' : ['core']
                                            }
                            }
                        }

# use the built-in logger dict configuration tool to convert the dict to a logger config
dictConfig(LOG_SETTINGS)

# get the logger created in the config and named root in the 'loggers' section of the config
__log = logging.getLogger('root')

所以,在我的__log 变量初始化后,它会立即工作,允许写入日志。我想接下来启动pyinotify 实例,并希望使用以下类定义传递__log

import asyncore, pyinotify

class Notify (object):
    def __init__ (self, log=None, verbose=True):
        wm = pyinotify.WatchManager()
        wm.add_watch( '/path/to/folder/to/monitor/', pyinotify.IN_CLOSE_WRITE, proc_fun=processEvent(log, verbose) )

        notifier = pyinotify.AsyncNotifier(wm, None)
        asyncore.loop()

class processEvent (pyinotify.ProcessEvent):
    def __init__ (self, log=None, verbose=True):
        log.info('logging some cool stuff')

        self.__log              = log
        self.__verbose          = verbose

    def process_IN_CLOSE_WRITE (self, event):
        print event

在上述实现中,我的process_IN_CLOSE_WRITE 方法完全按照pyinotify.AsyncNotifier 的预期触发;但是,logging some cool stuff 的日志行从不写入日志文件。

我觉得这与通过 pyinotify 线程进程持久化文件流有关;但是,我不确定如何解决这个问题。

有什么想法吗?

【问题讨论】:

    标签: python logging pyinotify


    【解决方案1】:

    我可能找到了一个似乎可行的解决方案。不确定这是否是最好的方法,所以我暂时将 OP 保持打开状态,看看是否发布了任何其他想法。

    我认为我处理我的pyinotify.AsyncNotifier 设置错误。我将实现更改为:

    class Notify (object):
        def __init__ (self, log=None, verbose=True):
            notifiers = []
            descriptors = []
            wm = pyinotify.WatchManager()
            notifiers.append ( pyinotify.AsyncNotifier(wm, processEvent(log, verbose)) )
            descriptors.append( wm.add_watch( '/path/to/folder/to/monitor/', pyinotify.IN_CLOSE_WRITE, proc_fun=processEvent(log, verbose), auto_add=True )
    
            asyncore.loop()
    

    现在,当我的包装类 processEvents 在侦听器的实例化时被触发,并且当从 CLOSE_WRITE 事件触发事件时,log 对象将得到维护和适当传递,并且可以接收写入事件。

    【讨论】:

    • 不幸的是,一旦我使用 python-daemonfiles_preserve 添加了妖魔化组件,我的日志流又消失了,我的 pyinotify 事件无法登录到它
    猜你喜欢
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-04
    • 1970-01-01
    • 2019-01-29
    • 2020-06-02
    相关资源
    最近更新 更多