今天使用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")
建議大家還是先看看官方文檔,直接明了,不用瞎百度幾個小時。