动态更改日志级别而不重新启动应用程序

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (47)

是否可以在python中使用fileConfig更改日志级别而无需重新启动应用程序。如果无法通过fileConfig实现,还有其他方法可以获得相同的结果吗?

更新:这是针对在服务器上运行的应用程序,我希望系统管理员能够更改应用程序在运行时选择的配置文件,并动态更改日志级别。我当时正在使用gevent,因此我添加了我的代码作为使用inotify选择配置文件更改的答案之一。

提问于
用户回答回答于

fileConfig是一种基于文件为您配置日志级别的机制; 您可以在程序中随时动态更改它。

调用.setLevel()要更改日志级别的日志记录对象。通常你会在root上做到这一点:

logging.getLogger().setLevel(logging.DEBUG)
用户回答回答于

我最终决定使用inotify和gevent来检查文件写入操作,一旦我知道文件已被更改,那么我就根据配置设置每个记录器的级别。

import gevent
import gevent_inotifyx as inotify
from gevent.queue import Queue

class FileChangeEventProducer(gevent.Greenlet):
    def __init__(self, fd, queue):
        gevent.Greenlet.__init__(self)
        self.fd = fd
        self.queue = queue

    def _run(self):
        while True:
            events = inotify.get_events(self.fd)
            for event in events:
                self.queue.put(event)
                gevent.sleep(0)


class FileChangeEventConsumer(gevent.Greenlet):
    def __init__(self, queue, callBack):
        gevent.Greenlet.__init__(self)
        self.queue = queue
        self.callback = callBack

    def _run(self):
        while True:
            _ = self.queue.get()
            self.callback()
            gevent.sleep(0)


class GeventManagedFileChangeNotifier:
    def __init__(self, fileLocation, callBack):
        self.fileLocation = fileLocation
        self.callBack = callBack
        self.queue = Queue()
        self.fd = inotify.init()
        self.wd = inotify.add_watch(self.fd, self.fileLocation, inotify.IN_CLOSE_WRITE)


    def start(self):
        producer = FileChangeEventProducer(self.fd, self.queue)
        producer.start()
        consumer = FileChangeEventConsumer(self.queue, self.callBack)
        consumer.start()
        return (producer, consumer)

上面的代码使用如下,

    def _setUpLoggingConfigFileChangeNotifier(self):
        loggingFileNameWithFullPath = self._getFullPathForLoggingConfig()
        self.gFsNotifier = GeventManagedFileChangeNotifier(loggingFileNameWithFullPath, self._onLogConfigChanged)
        self.fsEventProducer, self.fsEventConsumer = self.gFsNotifier.start()


    def _onLogConfigChanged(self):
        self.rootLogger.info('Log file config has changed - examining the changes')
        newLoggingConfig = Config(self.resourcesDirectory, [self.loggingConfigFileName]).config.get('LOG')
        self.logHandler.onLoggingConfigChanged(newLoggingConfig)

一旦我有了新的日志文件配置,我就可以从config为每个记录器连接正确的日志记录级别。我只是想分享答案,如果他们试图将它与gevent一起使用,它可能会有所帮助。

扫码关注云+社区

领取腾讯云代金券