我正在使用python logger.以下是我的代码:
import os
import time
import datetime
import logging
class Logger :
def myLogger(self):
logger = logging.getLogger('ProvisioningPython')
logger.setLevel(logging.DEBUG)
now = datetime.datetime.now()
handler=logging.FileHandler('/root/credentials/Logs/ProvisioningPython'+ now.strftime("%Y-%m-%d") +'.log')
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
return logger
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是我在每个logger.info调用的日志文件中都有多个条目.我怎么解决这个问题?
正如AWS文档所示:
import logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)
def my_logging_handler(event, context):
logger.info('got event{}'.format(event))
logger.error('something went wrong')
Run Code Online (Sandbox Code Playgroud)
现在我做了:
import logging
logging.basicConfig(level = logging.INFO)
logging.info("Hello World!")
Run Code Online (Sandbox Code Playgroud)
第一段代码在Cloud Watch控制台中打印,但第二段没有.
我没有看到任何差异,因为两个片段正在使用根记录器.
我随着时间的推移编写了一堆脚本,我正在重新编写脚本以保持代码DRY.我目前在各种脚本中使用这些内容:
if __name__ == '__main__':
logger = logging.getLogger('dbinit')
hdlr = logging.FileHandler('/var/logs/tmp/foo.log')
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
hdlr.setFormatter(formatter)
logger.addHandler(hdlr)
logger.setLevel(logging.WARNING)
Run Code Online (Sandbox Code Playgroud)
我想在每个脚本(即"模块")中重复这个,而不是在某个地方完成这个记录器初始化,并通过各种脚本访问(嗯,可能包装在单个类中?).
如果我不能这样做(即将记录器初始化代码放在一个核心模块中),我假设通过在logging.FileHandler()调用中使用相同的日志文件名,各种脚本将写入同一文件.
这个假设是否正确?
最后但并非最不重要的是,解决这个问题的最佳实践(即Pythonic)方法是什么?