123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 |
- #!/usr/bin/python
- # -*- coding:utf-8 -*-
- # 1、日志默认的输出等级为:warning级别及以上的
- # 2、想修改日志的默认输出等级?通过logging.basicConfig(level="INFO")----info需要用大写
- # 3、想知道日志是什么时候打印出来的,以及其他参数?通过logging.basicConfig(format=console_fmt)
- # 4、如果要同时添加这2个参数,需要写在一行代码中,logging.basicConfig(level="INFO",format=console_fmt)
- # %(name)s:名字
- # %(levelname)s:日志级别
- # %(asctime)s:打印时间,年月日时分秒
- # %(message)s:日志中的信息
- # %(lineno)d:报错日志在代码中第几行
- # %(filename)s:文件名
- # %(thread)d:进程id
- # %(levelname)s:错误等级名称
- # '%(asctime)s - %(filename)s[line:%(lineno)d] %(thread)d- %(levelname)s: %(message)s'
- import logging
- import colorlog
- import os
- from logging.handlers import RotatingFileHandler
- from datetime import datetime
- log_colors_config = {
- # 终端输出日志颜色配置
- 'DEBUG': 'white',
- 'INFO': 'green',
- 'WARNING': 'yellow',
- 'ERROR': 'red',
- 'CRITICAL': 'bold_red',
- }
- default_formats = {
- # 终端输出格式
- 'console_format': '%(log_color)s%(asctime)s-id%(thread)d-%(filename)s[line:%(lineno)d]-%(levelname)s-[日志信息]: %(message)s',
- # 日志输出格式
- 'log_format': '%(asctime)s-id %(thread)d-%(filename)s[line:%(lineno)d]-%(levelname)s-[日志信息]: %(message)s'
- }
- class HandleLog:
- """
- 先创建日志记录器(logging.getLogger),然后再设置日志级别(logger.setLevel),
- 接着再创建日志文件,也就是日志保存的地方(logging.FileHandler),然后再设置日志格式(logging.Formatter),
- 最后再将日志处理程序记录到记录器(addHandler)
- """
- @staticmethod
- def __init_logfile_handler(log_path):
- """
- 创建日志记录器handler,用于收集日志
- :param log_path: 日志文件路径
- :return: 日志记录器
- """
- # 写入文件,如果文件超过 10M 大小时,切割日志文件,仅保留3个文件
- logfile_handler = RotatingFileHandler(filename=log_path, maxBytes=10 * 1024 * 1024, backupCount=3,
- encoding='utf-8')
- return logfile_handler
- @staticmethod
- def __init_console_handle():
- """创建终端日志记录器handler,用于输出到控制台"""
- console_handle = logging.StreamHandler()
- return console_handle
- @staticmethod
- def __set_handle(__logger, handle, level=logging.INFO):
- """
- 设置handler级别并添加到终端logger收集器
- :param handle: 终端日志记录器
- :param level: 日志记录器级别
- """
- handle.setLevel(level=level)
- __logger.addHandler(handle)
- @staticmethod
- def __set_logfile_formatter(file_handler):
- """
- 设置日志输出格式-日志文件
- :param file_handler: 日志记录器
- """
- formatter = logging.Formatter(default_formats["log_format"])
- file_handler.setFormatter(formatter)
- @staticmethod
- def __set_console_formatter(console_handle):
- """
- 设置输出格式-控制台
- :param console_handle: 终端日志记录器
- :return:
- """
- formatter = colorlog.ColoredFormatter(fmt=default_formats["console_format"], log_colors=log_colors_config)
- console_handle.setFormatter(formatter)
- @staticmethod
- def __close_handler(file_handler):
- """
- 关闭handler
- :param file_handler: 日志记录器
- """
- file_handler.close()
- @staticmethod
- def get_logger(log_path='.\\log', is_save=True):
- '''
- log_path: 日志文件夹路径
- is_save: 是否保存日志文件,默认保存
- '''
- __logger = logging.getLogger() # 创建日志记录器
- __logger.setLevel(logging.DEBUG) # 设置默认日志记录器记录级别
- # 创建终端日志记录器handler,用于输出到控制台
- console_handle = HandleLog.__init_console_handle()
- # 设置显示格式
- HandleLog.__set_console_formatter(console_handle)
- # 设置handler级别并添加到终端logger收集器
- HandleLog.__set_handle(__logger, console_handle)
- if is_save:
- # 保存日志文件
- cur_path = os.path.dirname(os.path.realpath(__file__)) # 当前项目路径
- log_path = os.path.join(os.path.dirname(cur_path), log_path) # log_path为存放日志的路径
- if not os.path.exists(log_path): os.mkdir(log_path) # 若不存在logs文件夹,则自动创建
- _all_log_path = os.path.join(log_path, datetime.now().strftime('%Y-%m-%d') + "-all" + ".log") # 收集所有日志信息文件
- _error_log_path = os.path.join(log_path, datetime.now().strftime('%Y-%m-%d') + "-error" + ".log") # 收集错误日志信息文件
- #创建日志记录器handler,用于收集日志
- all_logfile_handle = HandleLog.__init_logfile_handler(_all_log_path)
- error_logfile_handle = HandleLog.__init_logfile_handler(_error_log_path)
- # 设置显示格式
- HandleLog.__set_logfile_formatter(all_logfile_handle)
- HandleLog.__set_logfile_formatter(error_logfile_handle)
- # 设置handler级别并添加到终端logger收集器
- HandleLog.__set_handle(__logger, all_logfile_handle)
- HandleLog.__set_handle(__logger, error_logfile_handle,level=logging.ERROR)
- return __logger
- # if __name__ == '__main__':
- # log = HandleLog.get_logger()
- # log.info("这是日志信息")
- # log.debug("这是debug信息")
- # log.warning("这是警告信息")
- # log.error("这是错误日志信息")
- # log.critical("这是严重级别信息")
|