Python日志动态文件名
我想设置我的Python日志记录器,让每个日志记录器的实例都能把日志记录到一个文件里,这个文件的名字和日志记录器的名字是一样的。
比如:
log_hm = logging.getLogger('healthmonitor')
log_hm.info("Testing Log") # Should log to /some/path/healthmonitor.log
log_sc = logging.getLogger('scripts')
log_sc.debug("Testing Scripts") # Should log to /some/path/scripts.log
log_cr = logging.getLogger('cron')
log_cr.info("Testing cron") # Should log to /some/path/cron.log
我想让这个设置更通用,不想把所有可能的日志记录器名字都写死。这样做可以吗?
4 个回答
2
上面这个解决方案的方法是对的,但它有个问题,就是如果调用多次,会添加重复的处理程序。下面是改进后的版本。
import os
def getLogger(name):
# logger.getLogger returns the cached logger when called multiple times
# logger.Logger created a new one every time and that avoids adding
# duplicate handlers
logger = logging.Logger(name)
logger.setLevel(logging.DEBUG)
handler = logging.FileHandler(os.path.join('/some/path/', name + '.log'), 'a')
logger.addHandler(handler)
return logger
def test(i):
log_hm = getLogger('healthmonitor')
log_hm.info("Testing Log %s", i) # Should log to /some/path/healthmonitor.log
test(1)
test(2)
22
可以把处理代码放在一个函数里,这样做会更简单:
import os
def myLogger(name):
logger = logging.getLogger(name)
logger.setLevel(logging.DEBUG)
handler = logging.FileHandler(os.path.join('/some/path/', name + '.log'), 'w')
logger.addHandler(handler)
return logger
log_hm = myLogger('healthmonitor')
log_hm.info("Testing Log") # Should log to /some/path/healthmonitor.log
为了避免创建重复的处理程序,我们需要确保 myLogger(name)
每个 name
只被调用一次。通常这意味着要把 myLogger(name)
放在
if __name__ == '__main__':
log_hm = myLogger('healthmonitor')
主脚本里面。
9
在编程中,有时候我们会遇到一些问题,尤其是在使用某些工具或库的时候。这些问题可能会让我们感到困惑,因为它们涉及到的概念可能比较复杂。比如,有人可能在使用某个库时,发现它的某个功能没有按照预期工作,这时候就需要去查找原因。
通常,我们可以在网上找到很多相关的讨论,比如在StackOverflow这样的论坛上。这里有很多开发者分享他们的经验和解决方案,帮助其他人解决类似的问题。
在这些讨论中,大家会提到一些代码示例,像
import os
import logging
class MyFileHandler(object):
def __init__(self, dir, logger, handlerFactory, **kw):
kw['filename'] = os.path.join(dir, logger.name)
self._handler = handlerFactory(**kw)
def __getattr__(self, n):
if hasattr(self._handler, n):
return getattr(self._handler, n)
raise AttributeError, n
logger = logging.getLogger('test')
logger.setLevel(logging.INFO)
handler = MyFileHandler(os.curdir, logger, logging.FileHandler)
logger.addHandler(handler)
logger.info('hello mylogger')
这样的占位符就是用来表示代码的地方。通过这些代码示例,我们可以更清楚地理解问题所在,以及如何去解决它。
总之,遇到问题时,查找资料和向社区求助是非常重要的,这样可以帮助我们更快地找到解决方案,提升我们的编程技能。