例1:logging.FileHandler()和logging.StreamHandler()
import logging
import os
# 路径获取
root = os.path.dirname(os.path.realpath(__file__))
# log_path = os.path.join(root, "example.log")
# name = "example.log"
debug = False
# when debug is true, show DEBUG and INFO in screen
# when debug is false, show DEBUG in file and info in both screen&file
# INFO will always be in screen
# create a logger
logger = logging.getLogger() # logging.FileHandler()处再设置文件位置和文件名
# critical > error > warning > info > debug > notset
logger.setLevel(logging.DEBUG) # level=logging.DEBUG 表明所有>= DEBUG 这个level的都会被输出
# define the formate
formatter = logging.Formatter('%(asctime)s: %(message)s', "%Y-%m-%d %H:%M")
# create another handler for output log to console
console_handler = logging.StreamHandler()
if debug:
console_handler.setLevel(logging.DEBUG)
else:
console_handler.setLevel(logging.INFO)
# create a handler for write log to file
logfile = os.path.join(root, 'run.log')
print('Creat Log File in: ', logfile)
file_handler = logging.FileHandler(logfile, mode='w')
file_handler.setLevel(logging.DEBUG)
file_handler.setFormatter(formatter)
console_handler.setFormatter(formatter)
# add Handler to logger
logger.addHandler(console_handler)
logger.addHandler(file_handler)
# test
logger.debug('this is a {} debug message'.format(1))
logger.info('this is an info message')
logger.debug('this is a debug message')
logger.info('this is an info message')
logger.debug('this is a debug message')
logger.info('this is an info message')
功能:直接看代码理解的更快,以上代码主要实现:同时在控制台和日志文件输出日志内容,并根据不同的日志等级输出日志。若debug为False,则在控制台只输出debug级别的日志,日志文件中输出debug和info级别的日志;若debug为True,则控制台和日志文件均输出debug和info级别的日志。因此,若想控制台输出和日志文件的输出保持一致,设置debug即可。ps:仔细看代码的注释,理解起来很容易的。
代码运行结果:
console:
log file :
封装版:
# logger.py
import os
import logging
from datetime import datetime
def get_logger(root, name=None, debug=True):
# when debug is true, show DEBUG and INFO in screen
# when debug is false, show DEBUG in file and info in both screen&file
# INFO will always be in screen
# create a logger
logger = logging.getLogger(name)
# critical > error > warning > info > debug > notset
logger.setLevel(logging.DEBUG)
# define the formate
formatter = logging.Formatter('%(asctime)s: %(message)s', "%Y-%m-%d %H:%M")
# create another handler for output log to console
console_handler = logging.StreamHandler()
if debug:
console_handler.setLevel(logging.DEBUG)
else:
console_handler.setLevel(logging.INFO)
# create a handler for write log to file
logfile = os.path.join(root, 'run.log')
print('Creat Log File in: ', logfile)
file_handler = logging.FileHandler(logfile, mode='w')
file_handler.setLevel(logging.DEBUG)
file_handler.setFormatter(formatter)
console_handler.setFormatter(formatter)
# add Handler to logger
logger.addHandler(console_handler)
logger.addHandler(file_handler)
return logger
# mian.py
import os
import logger
root = os.path.dirname(os.path.realpath(__file__))
dataset = "log"
log_path = os.path.join(root, dataset)
if not os.path.isdir(log_path):
os.makedirs(log_path, exist_ok=True)
logger = logger.get_logger(log_path,'run.txt')
logger.debug("this is test")
例2:简单版
from loguru import logger
logger.add("log/file_{time}.log", level="TRACE", rotation="100 MB")
logger.info("test")
结果:
控制台
日志文件
参考: