今天使用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")
建议大家还是先看看官方文档,直接明了,不用瞎百度几个小时。