随着时间的推移,我编写了一堆脚本,我正在重新编写脚本以保留代码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)
不是在每个脚本(即“模块”)中重复这个,我想在某个地方完成这个记录器初始化并通过各种脚本访问(嗯,可能包装在单例类中?)。
如果我不能这样做(即将记录器初始化代码放在一个核心模块中),我假设通过在 logging.FileHandler()调用中使用相同的日志文件名,各种脚本将写入同一文件。
这个假设是否正确?
最后但并非最不重要的是,解决此问题的最佳做法(即Pythonic)是什么?
答案 0 :(得分:2)
鉴于您使用的是if __name__ == __main__
,我假设这些脚本将作为不同的进程运行。如果是这种情况,那么您应该使用单独的配置文件。
此配置可以以文档中指定的格式存储在文件中。然后,您可以使用logging.config.fileConfig
加载文件。您还可以将配置存储为JSON / YAML格式,将其转换为字典并使用logging.config.dictConfig
加载它。后者是目前推荐的方法,虽然我发现前者更直接。有关详细信息,请阅读this。
使用配置文件方法的优点很多:
答案 1 :(得分:0)
在你的python模块中创建一个函数,如下所示:
def createLogHandler(job_name,log_file):
logger = logging.getLogger(job_name)
## create a file handler ##
handler = logging.FileHandler(log_file)
## create a logging format ##
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
return logger
现在调用你的程序中的函数:
job_name = 'dbinit'
log_file = '/var/logs/tmp/foo.log'
logger = createLogHandler(job_name ,log_file )
logger.info('Logger has been created')
答案 2 :(得分:-1)
(...) addHandler() will not add a handler if the handler already exist所以在许多地方都有这样的初始化代码会受到伤害。
如果我不能这样做(即将记录器初始化代码放在一个中) 核心模块)
如果您想确保初始化代码运行一次,您可以执行此操作。