python 日志器
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信息")