『無為則無心』Python日誌 — 69、補充:logging.basicConfig()函式說明

繁華似錦Fighting發表於2022-03-06

1、basicConfig()函式說明

  • 此函式,通過建立一個帶有預設Formatter(格式器)的StreamHandler(處理器),並將其新增到根日誌記錄器中來初始化基本配置。
  • 如果根日誌記錄器沒有定義處理器,則logger.debug()logger.info()logger.warning()logger.error()logger.critical()函式會自動呼叫 basicConfig()函式中的配置 。
  • 如果根日誌記錄器已經配置了處理器,則此函式不起作用。

說明:

  • 此函式應該在主執行緒中呼叫,且在其他執行緒開始之前。
  • 在Python2.7.1和3.2之前,此函式被多執行緒呼叫。
  • 有可能(極少數)處理器會被多次新增到根日誌記錄器,導致意外結果比如日誌中資訊重複。

支援以下關鍵字引數:

格式 描述
filename 使用指定的檔名
filemode 如果指定filename引數,則以此模式開啟檔案(‘r’、‘w’、‘a’),預設為“a”
format 使用指定字串格式輸出。
datefmt 指定時間格式,同time.strftime()函式.
style I如果指定了format,請對該格式字串使用此樣式。 '%''{''$'可以分別使用在 printf-style, str.format() or string.Template 中,預設 '%'
level 指定根日誌記錄器級別,預設為logging.WARNING
stream 指定將日誌的輸出流,可以指定輸出到sys.stderr(重定向日誌資訊,也就是把日誌資訊不輸出到控制檯,改為其他地方),sys.stdout或者檔案,預設輸出到sys.stderr,當streamfilename同時指定時,stream被忽略或者報錯ValueError。(一般不用)
handlers 指定日誌處理器,如果根日誌器沒有執行新的日誌處理器,預設使用此處配置。所有尚未設定格式器的處理程式,都將被分配此函式中建立的預設格式器。 請注意,此引數與filenamestream不相容,如果兩者都存在,則會引發ValueError。(一般不用)

2、應用

注意:這種方式對中文日誌資訊處理不友好,編碼錯亂,我們一般也很少用,都使用定義好的日誌處理來輸入日誌。

# coding=utf8
import logging

"""
引數含義:
level:指定日誌級別,預設為logging.INFO
format:指定日誌輸出格式。
datefmt:指定時間格式。
filename:指定寫入日誌檔名。
filemode:指定寫入方式,'w'或'a'

輸出格式挺好看的:
format = 'levelname:%(levelname)s filename: %(filename)s '
'outputNumber: [%(lineno)d]  thread: %(threadName)s output msg:  %(message)s'
' - %(asctime)s',
"""

# 配置basicConfig函式
logging.basicConfig(level=logging.INFO,

                    datefmt='[%d/%b/%Y %H:%M:%S]',
                    filename='../log/info.log')

# 建立一個日誌器,就是一個logger物件
logger = logging.getLogger('logger')


logger.debug('logger debug message')
logger.info('logger info message')
logger.warning('logger warning message')
logger.error('logger error message')
logger.critical('logger critical message')

# 或者
logging.debug('debug message')
logging.info('info message')
logging.warning('warning message')
logging.error('error message')
logging.critical('critical message')

輸出結果為:info以上的日誌級別都輸出了。

[17/Jan/2021 01:02:13] demo_log.py[line:24] INFO logger info message
[17/Jan/2021 01:02:13] demo_log.py[line:25] WARNING logger warning message
[17/Jan/2021 01:02:13] demo_log.py[line:26] ERROR logger error message
[17/Jan/2021 01:02:13] demo_log.py[line:27] CRITICAL logger critical message
[17/Jan/2021 01:02:13] demo_log.py[line:31] INFO info message
[17/Jan/2021 01:02:13] demo_log.py[line:32] WARNING warning message
[17/Jan/2021 01:02:13] demo_log.py[line:33] ERROR error message
[17/Jan/2021 01:02:13] demo_log.py[line:34] CRITICAL critical message

當我們給日誌器定義一個處理器,在看看效果:

# coding=utf8
import logging

"""
引數含義:
level:指定日誌級別,預設為logging.INFO
format:指定日誌輸出格式。
datefmt:指定時間格式。
filename:指定寫入日誌檔名。
filemode:指定寫入方式,'w'或'a'
"""

logging.basicConfig(level=logging.INFO,
                    format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
                    datefmt='[%d/%b/%Y %H:%M:%S]',
                    filename='../log/info.log')

# 建立一個日誌器,就是一個logger物件
logger = logging.getLogger('logger')

# 1.建立日誌處理器
fh = logging.StreamHandler()

# 2.設定日誌處理器輸出級別
fh.setLevel(logging.ERROR)

# 3.把處理器新增到日誌器中
logger.addHandler(fh)

logger.debug('logger debug message')
logger.info('logger info message')
logger.warning('logger warning message')
logger.error('logger error message')
logger.critical('logger critical message')

# 或者
logging.debug('debug message')
logging.info('info message')
logging.warning('warning message')
logging.error('error message')
logging.critical('critical message')

輸出結果:

logger error message
logger critical message

說明:新定義的處理器,代替了basicConfig函式中定義的內容。同時logging.debug('debug message')這種直接呼叫的方式也不執行了。

相關文章