json配置文件
{
"version":1,
"disable_existing_loggers":false,
"formatters":{
"simple":{
"format":"%(asctime)s - %(filename)s - [line:%(lineno)d] - %(name)s - %(levelname)s - %(message)s",
"datefmt":"%Y-%m-%d %H:%M:%S"
}
},
"handlers":{
"console":{
"class":"logging.StreamHandler",
"level":"DEBUG",
"formatter":"simple",
"stream":"ext://sys.stdout"
},
"info_file_handler":{
"class":"logging.handlers.RotatingFileHandler",
"level":"INFO",
"formatter":"simple",
"filename":"logs/info.log",
"maxBytes":10485760,
"backupCount":10,
"encoding":"utf8"
},
"warn_file_handler":{
"class":"logging.handlers.RotatingFileHandler",
"level":"WARN",
"formatter":"simple",
"filename":"logs/warn.log",
"maxBytes":10485760,
"backupCount":10,
"encoding":"utf8"
},
"error_file_handler":{
"class":"logging.handlers.RotatingFileHandler",
"level":"ERROR",
"formatter":"simple",
"filename":"logs/errors.log",
"maxBytes":10485760,
"backupCount":10,
"encoding":"utf8"
},
"fatal_file_handler":{
"class":"logging.handlers.RotatingFileHandler",
"level":"FATAL",
"formatter":"simple",
"filename":"logs/fatal.log",
"maxBytes":10485760,
"backupCount":10,
"encoding":"utf8"
}
},
"loggers":{
"my_module":{
"level":"INFO",
"handlers":["info_file_handler"],
"propagate":"no"
}
},
"root":{
"level":"INFO",
"handlers":["console","info_file_handler","warn_file_handler","error_file_handler","fatal_file_handler"]
}
}
customlogger
import logging.config
import os
import json
def setup_logging(default_path="logging.json", default_level=logging.INFO, env_key="LOG_CFG"):
"""
自定义日志模块
:param default_path: 配置文件路径
:param default_level: 默认开始记录的日志等级
:param env_key:
:return:
"""
currentdir = os.path.dirname(__file__).replace('\\', '/') # 获取当前文件的路径
dirName = currentdir + '/logs/' # 拼接形成日志记录文件存放地址
if dirName is not None:
if not os.path.exists(dirName):
try:
os.makedirs(dirName) # 如果不存在,则创建文件夹
except Exception as e:
print(e)
path = default_path
value = os.getenv(env_key, None) # os.getenv() 不会引发异常,但返回None。os.getenv() 读取环境变量。比如,os.getenv('PATH'),可从环境变量中配置logging.json的地址
if value:
path = value
if os.path.exists(path):
with open(path, "r") as f:
config = json.load(f)
logging.config.dictConfig(config) # 配置logging
else:
logging.basicConfig(level=default_level)
# 日志文件分级输出,给每个handler添加过滤器
loggers = logging.getLogger()
for handler in loggers.root.handlers:
if handler.name == 'console':
continue
log_filter = logging.Filter()
log_filter.filter = get_filter(handler.level)
handler.addFilter(log_filter)
def get_filter(level): # 配置过滤器日志文件分级导出
if logging.DEBUG == level:
return lambda record: record.levelno < logging.INFO
elif level == logging.INFO:
return lambda record: record.levelno < logging.WARN
elif level == logging.WARN:
return lambda record: record.levelno < logging.ERROR
elif level == logging.ERROR:
return lambda record: record.levelno < logging.FATAL
else:
return lambda record: record.levelno <= logging.FATAL
setup_logging() #执行logging配置
测试代码
from customlogger import *
logging.info("test info")
logging.warning("test warning")
logging.error("test error")
logging.fatal("test fatal")
若有错误,敬请指正……