from __future__ import absolute_import
import logging
logger = logging.getLogger()
def init_logger(log_file=None, log_file_level=logging.NOTSET):
log_format = logging.Formatter("[%(asctime)s %(levelname)s] %(message)s")
logger = logging.getLogger()
logger.setLevel(logging.INFO)
console_handler = logging.StreamHandler()
console_handler.setFormatter(log_format)
logger.handlers = [console_handler]
if log_file and log_file != '':
file_handler = logging.FileHandler(log_file)
file_handler.setLevel(log_file_level)
file_handler.setFormatter(log_format)
logger.addHandler(file_handler)
return logger
if __name__ == '__main__':
init_logger('log.log') # 相当于在配置logging
logger.info('it works')
# logger = logging.getLogger(),这行代码实际上获取了 Python logging 模块的全局 logger 对象。
# 当您在 init_logger 函数内部使用 logging.getLogger() 时,无论您是否接收返回值,您都在操作同一个全局 logger 对象。
# 这意味着,即使在 init_logger 函数之外没有显式地接收返回值,init_logger 函数内部对 logger 所做的配置仍然会影响到全局 logger 对象。
# 调用 logger.info('it works') 时,您实际上是在使用经过 init_logger 函数配置的全局 logger 对象。