python 日志器
方式一(推荐使用):
import os
import logging.config
PROJECT_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
log_path_dir = os.path.join(PROJECT_DIR, 'output', 'logs')
if not os.path.exists(log_path_dir):
os.makedirs(log_path_dir)
LOGGING_DICT = {
'version': 1,
'disable_existing_loggers': False, # 是否禁用已经存在的日志器
'formatters': { # 日志信息显示的格式
'verbose': {
'format': '%(levelname)s %(asctime)s %(filename)s line:%(lineno)d %(message)s'
}
},
'handlers': { # 日志处理方法
'console': { # 向终端中输出日志
'level': 'INFO',
'filters': [],
'class': 'logging.StreamHandler',
'formatter': 'verbose'
},
'debug': { # 向文件中输出日志
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler',
'filename': os.path.join(log_path_dir, "debug.log"), # 日志文件的位置
'maxBytes': 50 * 1024 * 1024,
'backupCount': 100,
'formatter': 'verbose'
},
'info': { # 向文件中输出日志
'level': 'INFO',
'class': 'logging.handlers.RotatingFileHandler',
'filename': os.path.join(log_path_dir, "info.log"), # 日志文件的位置
'maxBytes': 50 * 1024 * 1024,
'backupCount': 100,
'formatter': 'verbose'
},
'error': { # 向文件中输出日志
'level': 'ERROR',
'class': 'logging.handlers.RotatingFileHandler',
'filename': os.path.join(log_path_dir, "error.log"), # 日志文件的位置
'maxBytes': 50 * 1024 * 1024,
'backupCount': 100,
'formatter': 'verbose'
},
},
'loggers': { # 日志器
'info': { # 定义了一个名为info的日志器
'handlers': ['console', 'debug', 'info', 'error'], # 可以同时向终端与文件中输出日志
'propagate': True, # 是否继续传递日志信息
'level': 'DEBUG', # 日志器接收的最低日志级别
},
}
}
logging.config.dictConfig(LOGGING_DICT)
logger = logging.getLogger('info')
if __name__ == '__main__':
logger.info("信息%s" % "info")
logger.error("error message")
logger.debug("debug test message")
方式二:
import logging
from logging.handlers import RotatingFileHandler
import os
import logging.config
PROJECT_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
log_path_dir = os.path.join(PROJECT_DIR, 'output', 'logs')
if not os.path.exists(log_path_dir):
os.makedirs(log_path_dir)
class Logger:
def __init__(self):
# 创建自己的日志收集器
self.logger = logging.getLogger("logger")
# 设置收集的日志等级,设置为DEBUG等级
self.logger.setLevel("DEBUG")
# 日志输出渠道
# 创建一个日志输出渠道(输出到控制台),并且设置输出的日志等级为DEBUG以上
self.stream_out = logging.StreamHandler()
self.stream_out.setLevel("DEBUG")
# 创构建一个日志输出渠道(输出到文件)
self.error = RotatingFileHandler(filename="../output/error.log", maxBytes=1000 * 1024 * 1024, backupCount=8, encoding='utf8')
self.error.setLevel("ERROR") #设置输出的日志等级为ERROR以上
self.debug = RotatingFileHandler(filename="../output/debug.log", maxBytes=100 * 1024 * 1024, backupCount=8, encoding='utf-8')
self.debug.setLevel("DEBUG") #设置输出的日志等级为DEBUG以上
self.info = RotatingFileHandler(filename="../output/info.log", maxBytes=500 * 1024 * 1024, backupCount=8, encoding='utf-8')
self.info.setLevel("INFO") #设置输出的日志等级为INFO以上
#将日志输出渠道添加到日志收集器中
self.logger.addHandler(self.stream_out)
self.logger.addHandler(self.error)
self.logger.addHandler(self.debug)
self.logger.addHandler(self.info)
# 设置日志输出的格式
# 可以通过logging.Formatter指定日志的输出格式,这个参数可以输出很多有用的信息,如下:
# % (levelname)s: 打印日志级别名称
# % (filename)s: 打印当前执行程序名
# % (funcName)s: 打印日志的当前函数
# % (lineno)d: 打印日志的当前行号
# % (asctime)s: 打印日志的时间
# % (message) s: 打印日志信息
ft = "%(asctime)s - %(filename)s - line:%(lineno)d - %(levelname)s: %(message)s"
ft = logging.Formatter(ft)
# 设置控制台和日志文件输出日志的格式
self.stream_out.setFormatter(ft)
self.error.setFormatter(ft)
self.debug.setFormatter(ft)
self.info.setFormatter(ft)
if __name__ == '__main__':
logger = Logger().logger
logger.info("info信息%s"%"info messages")
logger.debug("debug信息")
logger.error("error信息")