Python标准日志记录

3

我喜欢使用Python日志模块,因为它标准化了我的应用程序并且更容易获取指标。但我面临的问题是,对于每个应用程序(或file.py),我都需要把这段代码放在代码顶部。

logger = logging.getLogger(__name__)
if not os.path.exists('log'):
    os.makedirs('log')

logName=time.strftime("%Y%m%d.log")    
hdlr = logging.FileHandler('log/%s'%(logName))

logger.setLevel(logging.INFO)
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(funcName)s %(levelname)s - %(message)s')

ch.setFormatter(formatter)
hdlr.setFormatter(formatter)

logger.addHandler(ch)
logger.addHandler(hdlr)

这很繁琐而且重复。是否有更好的方法来处理这个问题? 当一个应用程序具有多个模块时,人们如何记录日志?


1
你为什么要在每个文件中都放置那个? - jonrsharpe
1
我现在创建了一个名为'mylogging.py'的文件,然后执行"import mylogging"。 - NinjaGaiden
这正是我想的...为什么不把所有共享代码推到一个文件中,并从不同的文件中调用它,如果可能的话,继承那个类。 - Zuko
注意:不要将记录器创建为模块全局变量,而是将它们保持在函数内部的本地变量中。请参见http://victorlin.me/posts/2012/08/26/good-logging-practice-in-python中的“不要在模块级别获取记录器”一节。 - jpkotta
2个回答

0

看一下logging.basicConfig()

如果你把basicConfig()放在一个函数里,那么你只需要导入你的函数并传入特定的参数(例如日志文件名格式级别等)。

这样做有助于精简代码并使其更易扩展。

例如 -

import logging

def test_logging(filename, format):
    logging.basicConfig(filename=filename, format=format, level=logging.DEBUG)

    # test
    logging.info('Info test...')
    logging.debug('Debug test...')

然后只需将test_logging()函数导入其他程序即可。

希望这可以帮到你。


0

阅读在多个模块中使用日志记录,来自日志记录手册

你需要做的是使用getLogger()函数获取一个预定义设置的记录器。

import logging
logger = logging.getLogger('some_logger')

在应用程序启动时,您只需设置这些设置一次。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接