zoukankan      html  css  js  c++  java
  • 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")

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

  • 相关阅读:
    bzoj 1076
    CF1000G
    CF979E
    bzoj 3129
    CF451E
    CF939F
    CF1065D
    CF1015F
    Enum与最佳単例设计
    悲观锁 vs 乐观锁 vs Redis
  • 原文地址:https://www.cnblogs.com/shiyuheng/p/9935254.html
Copyright © 2011-2022 走看看