1. 程式人生 > >logging日誌模組,四種方式

logging日誌模組,四種方式

1.最簡單的用法

import logging

logging.error("hah")

logging.info("hah")

logging.debug("hah")

logging.warning("hah")

logging.critical("hah")

info,debug並不會顯示,預設級別為30

級別debug(10)

級別info(20)

級別warning(30)

級別error(40)

級別critical(50)

2.自定義日誌格式

import logging

日誌基本設定

只能設定顯示的資訊格式,並不能設定日誌級別和輸出(螢幕或檔案)

logging.basicConfig(format="%(levelno)s-%(asctime)s-%(message)s")

logging.error("hah")

logging.info("hah")

logging.debug("hah")

logging.warning("hah")

logging.critical("hah")

3.自定義日誌

設定級別,之前兩種方法都是warning級別以上輸出

設定輸出,之前兩種方法都是輸出到螢幕

四個重要元件

1.Logger 日誌生成器 負責產生一條完整的日誌

2.Filter 過濾器 負責對日誌進行過濾(不常用,可以通過格式或級別過濾輸出)

3.Handler 處理器 負責將日誌輸出到指定位置

4.Formater 格式化 負責處理日誌顯示的格式

import logging

# 1.建立1個logger:

lg = logging.getLogger("zb")

# 2.建立handler(負責輸出,輸出到螢幕streamhandler,輸出到檔案filehandler)

fh = logging.FileHandler(filename="a.log",mode="a",encoding="utf-8")#預設mode 為a模式,預設編碼方式為utf-8

sh = logging.StreamHandler()

# 3.建立formatter:

formatter=logging.Formatter(fmt="%(asctime)s-%(name)s-%(levelname)s-%(message)s")

# 4.繫結關係:①logger繫結handler

lg.addHandler(fh)

lg.addHandler(sh)

# ②為handler繫結formatter

fh.setFormatter(formatter)

sh.setFormatter(formatter)

# 5.設定日誌級別(日誌級別兩層關卡必須都通過,日誌才能正常記錄)

lg.setLevel(10)

fh.setLevel(10)

sh.setLevel(10)

# 6.呼叫日誌

lg.debug("haha")

4.匯入模組,不用重複造輪子,已經有寫好的模組可以直接呼叫

(以下內容老男孩egon老師部落格複製來的)

import os
import logging.config

定義三種日誌輸出格式 開始

standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' '[%(levelname)s][%(message)s]' #其中name為getlogger指定的名字

simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'

id_simple_format = '[%(levelname)s][%(asctime)s] %(message)s'

定義日誌輸出格式 結束

logfile_dir = os.path.dirname(os.path.abspath(file)) # log檔案的目錄

logfile_name = 'all2.log' # log檔名

如果不存在定義的日誌目錄就建立一個

if not os.path.isdir(logfile_dir):
os.mkdir(logfile_dir)

log檔案的全路徑

logfile_path = os.path.join(logfile_dir, logfile_name)

log配置字典

LOGGING_DIC = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'standard': {
'format': standard_format
},
'simple': {
'format': simple_format
},
},
'filters': {},
'handlers': {
#列印到終端的日誌
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler', # 列印到螢幕
'formatter': 'simple'
},
#列印到檔案的日誌,收集info及以上的日誌
'default': {
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler', # 儲存到檔案
'formatter': 'standard',
'filename': logfile_path, # 日誌檔案
'maxBytes': 102410245, # 日誌大小 5M
'backupCount': 5,
'encoding': 'utf-8', # 日誌檔案的編碼,再也不用擔心中文log亂碼了
},
},
'loggers': {
#logging.getLogger(name)拿到的logger配置
'': {
'handlers': ['default', 'console'], # 這裡把上面定義的兩個handler都加上,即log資料既寫入檔案又列印到螢幕
'level': 'DEBUG',
'propagate': True, # 向上(更高level的logger)傳遞
},
},
}

def load_my_logging_cfg(msg):
logging.config.dictConfig(LOGGING_DIC) # 匯入上面定義的logging配置
logger = logging.getLogger(name) # 生成一個log例項
logger.info(msg) # 記錄該檔案的執行狀態

if name == 'main':
load_my_logging_cfg()

以上我們可以放入一個mylog.py檔案,當做一個模組匯入使用

1.可以發現模組在最後幫我們定義了一個函式

我們匯入模組from log(專案資料夾log) import mylog

logger = mylog.load_my_logging_cfg 這個函式名太長,搞個變數指向下

使用這個函式存在一個問題,就是我們輸出的級別被固定死為info

2.如果我們要記錄不同級別的日誌,還得手動匯入字典

import logging

import logging.config

from log import mylog

logging.config.dicConfig(mylog.LOGGING_DIG)從mylog模組匯入配置字典

logger = logging.getLogger("zb")生成一個日誌生成器

logging.error("hah")

logging.info("hah")

logging.debug("hah")

logging.warning("hah")

logging.critical("hah")