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")

 

建議大家還是先看看官方文檔,直接明了,不用瞎百度幾個小時。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM