python 3.6 logger 日志格式

  今天使用python3.6来实例化logging,但是发现logger = logging.getLogger(__name__)记录中文时日志会显示乱码;发现python3.6需要设置下logging.handler才可以正常显示中文,没仔细研究,先贴上代码,后续补充原因

 设置这样格式中文还是会显示乱码

logging.basicConfig(level=logging.INFO,
                    format='%(asctime)s [%(levelname)s] %(message)s (%(filename)s:L%(lineno)d)',
                    datefmt='%Y-%m-%d %H:%M:%S',
                    filename='spider.log',
                    filemode='a')

 设置handler然后添加encoding='utf-8'格式,中文显示正常

import logging,logging.handler

handler = logging.handlers.RotatingFileHandler('../logs/kaola.log',maxBytes=1024*1024,backupCount=5,encoding='utf-8')
fmt = '%(asctime)s-%(levelname)s-%(message)s' #日志输出的格式
formatter = logging.Formatter(fmt)  #设置格式
handler.setFormatter(formatter) 
logger = logging.getLogger('kaola') #设置日志名称
logger.addHandler(handler) #添加刚设置的handler
logger.setLevel(logging.INFO) #设置级别为info以上记录到日志

      

这个Handler类似于上面的FileHandler,但是它可以管理文件大小。当文件达到一定大小之后,它会自动将当前日志文件改名,然后创建 一个新的同名日志文件继续输出。比如日志文件是chat.log。当chat.log达到指定的大小之后,RotatingFileHandler自动把 文件改名为chat.log.1。不过,如果chat.log.1已经存在,会先把chat.log.1重命名为chat.log.2。。。最后重新创建 chat.log,继续输出日志信息。
它的构造函数是:RotatingFileHandler( filename[, mode[, maxBytes[, backupCount]]])其中filename和mode两个参数和FileHandler一样。maxBytes用于指定日志文件的最大文件大小。如果maxBytes为0,意味着日志文件可以无限大,这时上面描述的重命名过程就不会发生。
backupCount用于指定保留的备份文件的个数。比如,如果指定为2,当上面描述的重命名过程发生时,原有的chat.log.2并不会被更名,而是被删除。

 下面这种属于基本格式,基本项目都会用到这种格式

 1 import logging,logging.config
 2 
 3 
 4 log_config = {
 5     "version": 1,
 6     'disable_existing_loggers': False,  # 是否禁用现有的记录器
 7 
 8     # 日志管理器集合
 9     'loggers': {
10         # 管理器
11         'default': {
12             'handlers': ['console', 'log'],
13             'level': 'DEBUG',
14             'propagate': True,  # 是否传递给父记录器
15         },
16     },
17 
18     # 处理器集合
19     'handlers': {
20         # 输出到控制台
21         'console': {
22             'level': 'INFO',  # 输出信息的最低级别
23             'class': 'logging.StreamHandler',
24             'formatter': 'standard',  # 使用standard格式
25             'filters': ['require_debug_true', ],  # 仅当 DEBUG = True 该处理器才生效
26         },
27         # 输出到文件
28         'log': {
29             'level': 'INFO',
30             'class': 'logging.handlers.RotatingFileHandler',
31             'formatter': 'standard',
32             'filename': '日志文件路径',  # 输出位置
33             'maxBytes': 1024 * 1024 * 5,  # 文件大小 5M
34             'backupCount': 5,  # 备份份数
35             'encoding': 'utf8',  # 文件编码
36         },
37     },
38     # 过滤器
39     'filters': {
40         'require_debug_true': {
41             '()': RequireDebugTrue,
42         }
43     },
44 
45     # 日志格式集合
46     'formatters': {
47         # 标准输出格式
48         'standard': {
49             # [具体时间][线程名:线程ID][日志名字:日志级别名称(日志级别ID)] [输出的模块:输出的函数]:日志内容
50             'format': '[%(asctime)s][%(name)s:%(levelname)s(%(lineno)d)]--[%(module)s]:%(message)s'
51         }
52     }
53 }
54 
55 logging.config.dictConfig(log_config)
56 logger = logging.getLogger("default")

建议大家还是先看看官方文档,直接明了,不用瞎百度几个小时。

原文地址:https://www.cnblogs.com/shiyuheng/p/9935254.html