一崎岂、簡單的將日志打印到屏幕
默認情況下,會打印WARNING級別的日志
DEBUG:詳細信息址愿,調試信息该镣。
INFO:確認一切按預期運行。
WARNING:表明發(fā)生了一些意外,或者不久的將來會發(fā)生問題(如‘磁盤滿了')损合。軟件還是在正常工作省艳。
ERROR:由于更嚴重的問題,軟件已不能執(zhí)行一些功能了嫁审。
CRITICAL:嚴重錯誤跋炕,表明軟件已不能繼續(xù)運行了。
import logging
logging.debug('debug message') # 調試的時候
logging.info('info message')
logging.warning('warning message')
logging.error('error message')
logging.critical('critical message') # 批判的
以上代碼輸出:
屏幕快照 2018-12-23 下午8.53.42.png
二律适、通過basicConfig函數來對日志的輸入格式和方法進行配置
logging.basicConfig函數各參數:
- filename: 指定日志文件名
- filemode: 和file函數意義相同辐烂,指定日志文件的打開模式,'w'或'a'
- format: 指定輸出的格式和內容捂贿,format可以輸出很多有用信息:
%(levelno)s: 打印日志級別的數值
%(levelname)s: 打印日志級別名稱
%(pathname)s: 打印當前執(zhí)行程序的路徑纠修,其實就是sys.argv[0]
%(filename)s: 打印當前執(zhí)行程序名
%(funcName)s: 打印日志的當前函數
%(lineno)d: 打印日志的當前行號
%(asctime)s: 打印日志的時間
%(thread)d: 打印線程ID
%(threadName)s: 打印線程名稱
%(process)d: 打印進程ID
%(message)s: 打印日志信息
- datefmt: 指定時間格式,同time.strftime()
- level: 設置日志級別厂僧,默認為logging.WARNING
- stream: 指定將日志的輸出流扣草,可以指定輸出到sys.stderr,sys.stdout或者文件,默認輸出到sys.stderr颜屠,當stream和filename同時指定時辰妙,stream被忽略
import logging
logging.basicConfig(level=logging.INFO,#默認為logging.WARNING
filename="outlog.log",#指定日志輸出文件,
filemode="a",#和file函數意義相同,指定日志文件的打開式甫窟,'w'或'a'
datefmt='%Y-%m-%d %a %H:%M:%S',
# 指定輸出的格式和內容密浑,format可以輸出很多有用信息
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
# 聲明了一個 Logger 對象,它就是日志輸出的主類
logger = logging.getLogger(__name__)
logger.debug('debug message') # 調試的時候
logger.info('info message')
logger.warning('warning message')
logger.error('error message')
logger.critical('critical message') # 批判的
三粗井、同時將日志輸出到屏幕和日志文件
- 1尔破、創(chuàng)建一個對象:
logger = logging.getLogger()
- 2、創(chuàng)建一個handler背传,用于寫入日志文件:
fh = logging.FileHandler('test.log',encoding='utf-8')
- 3呆瞻、或創(chuàng)建一個handler,用于輸出到控制臺 :
ch = logging.StreamHandler()
- 4径玖、創(chuàng)建一個輸出格式:
fmt = logging.Formatter('%(asctime)s -%(filename)s- %(name)s - %(levelname)s - %(message)s')
- 5、給文件操作符設置一個格式:
fh.setFormatter(fmt)
- 6颤介、或給控制臺設置一個格式:
ch.setFormatter(fmt)
- 7梳星、給logger對象添加fh對象:
logger.addHandler(fh) 或給logger對象添加ch對象:logger.addHandler(ch)
import logging
#聲明了一個 Logger 對象,它就是日志輸出的主類
logger = logging.getLogger(__name__)
# 設置日志級別
logger.setLevel(logging.INFO)
# 創(chuàng)建一個handler滚朵,用于寫入日志文件
fh = logging.FileHandler(filename="outlog.log",encoding="utf-8")
# 創(chuàng)建一個handler冤灾,用于輸出到控制臺
sh = logging.StreamHandler()
# 創(chuàng)建一個輸出格式
fmt = logging.Formatter('%(asctime)s -%(filename)s- %(name)s - %(levelname)s - %(message)s')
# 文件操作符設置一個格式
fh.setFormatter(fmt=fmt)
#給控制臺設置一個格式
sh.setFormatter(fmt=fmt)
# 給logger對象添加fh和sh對象
logger.addHandler(fh)
logger.addHandler(sh)
logger.debug('debug message') # 調試的時候
logger.info('info message')
logger.warning('warning message')
logger.error('error message')
logger.critical('critical message') # 批判的
四、通過配置文件方式使用logging模塊
logger.conf配置文件
[loggers]
# 定義logger模塊辕近,root是父類韵吨,必需存在的,其它的是自定義移宅。
keys=root,infoLogger,errorlogger
# 實現上面定義的loggers模塊归粉,必需是[logger_xxxx]這樣的形式
[logger_root]
# level級別椿疗,級別有DEBUG、INFO糠悼、WARNING届榄、ERROR、CRITICAL
level=DEBUG
# handlers 處理類倔喂,可以有多個铝条,用逗號分開
handlers=infohandler,errorhandler
[logger_infoLogger]
# handlers 處理類
handlers=infohandler
# qualname logger名稱,應用程序通過 logging.getLogger獲取席噩。
# 對于不能獲取的名稱班缰,則記錄到root模塊。
qualname=infoLogger
# propagate 是否繼承父類的log信息悼枢,0:否 1:是
propagate=0
[logger_errorlogger]
handlers=errorhandler
qualname=errorlogger
propagate=0
###############################################
[handlers]
keys=infohandler,errorhandler
[handler_infohandler]
# 日志處理類埠忘,控制臺輸出類
class=StreamHandler
# 日志級別
level=INFO
# 設定日志格式
formatter=form02
# args handler初始化函數參數
args=(sys.stdout,)
[handler_errorhandler]
# 日志處理類,文件輸出類
class=FileHandler
# 日志級別
level=ERROR
# 設定日志格式
formatter=form01
# args handler初始化函數參數,日志存放路徑
args=('logging/outlog.log', 'a')
###############################################
[formatters]
keys=form01,form02
[formatter_form01]
format=%(asctime)s %(filename)s %(levelname)s %(message)s
datefmt=%Y-%m-%d %H:%M:%S
[formatter_form02]
format=%(asctime)s %(filename)s %(levelname)s %(message)s
datefmt=%Y-%m-%d %H:%M:%S
使用方式:
from logging.config import fileConfig
import logging
fileConfig('logger.conf') # 加載自定義的配置文件
logger=logging.getLogger('infoLogger') # 獲得對應的日志對象
logger.info('test1') #輸出對應的日志
logger_error=logging.getLogger('errorhandler') #獲的對應的日志對象
logger_error.error('test5') # 輸出對應的日志
使用這種方式配置日志萧芙,一定要在項目的入口函數中就調用 logging.config.fileConfig("logging.conf")函數给梅,因為 logging.conf 文件中,在handler中配置的是日志文件的相對地址双揪,如果在其他代碼文件中進行調用动羽,由于相對地址的原因,將導致日志文件會出現在意想不到的位置渔期。
進行以上配置后运吓,在項目中需要進行日志輸出的地方通過logging.getLogger()方式就可以獲取到對應的logger,然后就可以使用logger.info("xxx")進行日志輸出了疯趟。