Python日志模塊之你還在用PRINT打印日志嗎


 

import logging

logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
                    datefmt='%a, %d %b %Y %H:%M:%S',
                    filename='test.log',
                    filemode='w')

logging.debug('debug level')
logging.info('info level')
logging.warning('warning level')
logging.error('error level')
logging.critical('critical level')

 

我們知道在日常寫Python程序的時候開業用print來打印一些日志,當然在小的程序里不用出現什么問題,但是你有沒有想過當你的代碼量到成千上萬行的時候,還是用print來打印,那就是災難,今天就給大家介紹下python中的日志模塊 logging模塊。

 

logging可以分成兩部分來講

1.logging, 重點在於logging.basicConfig

2.logger對象,重點在於FileHandler(用於向文件輸出)和StreamHandler(用於向控制台輸出)

 

下面看看案例

方法一logging (注意我們新建py文件的時候,py文件名不要和包的名稱一樣,就是py文件名字不要建成logging.py, 不然會報錯)

import logging
logging.debug('debug level')
logging.info('info level')
logging.warning('warning level')
logging.error('error level')
logging.critical('critical level')

 
結果:

WARNING:root:warning level
ERROR:root:error level
CRITICAL:root:critical level

 

我們會發現下面2個沒有輸出到控制台,這是因為我們python里面的默認日志級別是warning

logging.debug('debug level')
logging.info('info level')
 

下面我們自己設置下日志級別看看,也就是logging模塊的重點logging.basicConfig

import logging

logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
datefmt='%a, %d %b %Y %H:%M:%S',
filename='test.log',
filemode='w')

logging.debug('debug level')
logging.info('info level')
logging.warning('warning level')
logging.error('error level')
logging.critical('critical level')
 

我們會發現控制台沒有輸出,但是py文件的同路徑出現一個test.log的日志文件

 

或者我們不加filename='test.log'

import logging

logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
datefmt='%a, %d %b %Y %H:%M:%S',
# filename='test.log',
filemode='w')

logging.debug('debug level')
logging.info('info level')
logging.warning('warning level')
logging.error('error level')
logging.critical('critical level')
 

結果

Sun, 24 Mar 2019 11:37:26 log.py[line:9] DEBUG debug level
Sun, 24 Mar 2019 11:37:26 log.py[line:10] INFO info level
Sun, 24 Mar 2019 11:37:26 log.py[line:11] WARNING warning level
Sun, 24 Mar 2019 11:37:26 log.py[line:12] ERROR error level
Sun, 24 Mar 2019 11:37:26 log.py[line:13] CRITICAL critical level
 

 

控制台完整輸出了從debug到critical的日志,而且是按照我們要想的格式

是不是更賞心悅目了呢

 

下面是basicConfig的參數介紹,來源於網絡截取(https://www.cnblogs.com/yuanchenqi/articles/6766020.html)

侵權刪

 

logging.basicConfig()函數中可通過具體參數來更改logging模塊默認行為,可用參數有:

filename:用指定的文件名創建FiledHandler,這樣日志會被存儲在指定的文件中。
filemode:文件打開方式,在指定了filename時使用這個參數,默認值為“a”還可指定為“w”。
format:指定handler使用的日志顯示格式。
datefmt:指定日期時間格式。
level:設置rootlogger(后邊會講解具體概念)的日志級別
stream:用指定的stream創建StreamHandler。可以指定輸出到sys.stderr,sys.stdout或者文件(f=open(‘test.log’,’w’)),默認為sys.stderr。若同時列出了filename和stream兩個參數,則stream參數會被忽略。

format參數中可能用到的格式化串:
%(name)s Logger的名字
%(levelno)s 數字形式的日志級別
%(levelname)s 文本形式的日志級別
%(pathname)s 調用日志輸出函數的模塊的完整路徑名,可能沒有
%(filename)s 調用日志輸出函數的模塊的文件名
%(module)s 調用日志輸出函數的模塊名
%(funcName)s 調用日志輸出函數的函數名
%(lineno)d 調用日志輸出函數的語句所在的代碼行
%(created)f 當前時間,用UNIX標准的表示時間的浮 點數表示
%(relativeCreated)d 輸出日志信息時的,自Logger創建以 來的毫秒數
%(asctime)s 字符串形式的當前時間。默認格式是 “2003-07-08 16:49:45,896”。逗號后面的是毫秒
%(thread)d 線程ID。可能沒有
%(threadName)s 線程名。可能沒有
%(process)d 進程ID。可能沒有
%(message)s用戶輸出的消息
 

 

那說到這里有人是不是就發現了,上面的方式要不就是把日志輸出到控制台,要不就是輸出到日志文件,那么如果我即想輸出到控制台也想輸出到文件, 那怎么辦呢?那就要用我們今天說的第二種方法 logger對象。

 

 

2. logger對象,這樣就可以同時向文件和控制台打印日志了,解釋都在代碼里。

 

import logging

#固定寫法
# logger = logging.getLogger()
logger = logging.getLogger('mylogger')

#設置日志級別
logger.setLevel(logging.DEBUG)


# 創建一個FileHandler,用於寫入日志文件
File = logging.FileHandler('test.log')

# 再創建一個StreamHandler,用於輸出到控制台
consle = logging.StreamHandler()

#定義輸出格式,可以自己定
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

#綁定格式和FileHandler,StreamHandler
File.setFormatter(formatter)
consle.setFormatter(formatter)

#logger對象可以添加多個FileHandler和consle對象
logger.addHandler(File)
logger.addHandler(consle)


#輸出
logger.debug('logger debug level')
logger.info('logger info level')
logger.warning('logger warning level')
logger.error('logger error level')
logger.critical('logger critical level')

 

 

好了今天的日志模塊就介紹這么多吧,至於日志模塊也可以通過配置文件來操作,原理其實一樣,只是換成文件來存儲配置信息。
————————————————
版權聲明:本文為CSDN博主「yrg5101」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/yrg5101/java/article/details/88825141

 


免責聲明!

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



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