一麦轰、介紹
- 通過log分析可獲取程序的運(yùn)行情況,也可快速定位問題蒂培;
- 調(diào)試階段:一般需要所有的運(yùn)行日志來分析积糯;
發(fā)布階段:日志僅需要記錄程序的異常信息和錯(cuò)誤信息等,若仍記錄所有的日志就會(huì)導(dǎo)致服務(wù)器的I/O壓力铝宵;
故在不同的階段打掘,我們需要設(shè)置不的日志等級(jí)(通常可通過配置文件來指定日志等級(jí))鹏秋。 - 日志包含的主要字段:事件發(fā)生的時(shí)間胧卤、日志的等級(jí)、事件發(fā)生的位置拼岳、事件內(nèi)容......
二、日志等級(jí)介紹
- 日志等級(jí)一般包括5個(gè)等級(jí)况芒,依次為:DEBUG惜纸、INFO、WARNING绝骚、ERROR耐版、CRITICAL;
- 等級(jí)詳解
- DEBUG:記錄調(diào)試的詳細(xì)日志信息压汪,一般在調(diào)試時(shí)開啟粪牲;
- INFO:記錄普通的日志信息,包括錯(cuò)誤止剖、警告等等腺阳;
- WARNING:記錄不影響程序正常運(yùn)行,但存在不期望的事件時(shí)的信息(記錄一些警告信息)穿香;
- ERROR:嚴(yán)重問題亭引,影響某些功能正常運(yùn)行的信息
- CRITICAL:致命問題,導(dǎo)致程序無法繼續(xù)運(yùn)行的信息
- 等級(jí)排序
(1)日志等級(jí):DEBUG < INFO < WARNING < ERROR < CRITICAL皮获,從左到右日志信息依次減小焙蚓。
(2)當(dāng)程序指定一個(gè)等級(jí)后,程序會(huì)記錄所有日志等級(jí) ≥ 指定等級(jí)的日志信息洒宝,而不是僅僅記錄指定級(jí)別的日志信息购公;小于指定等級(jí)的日志信息會(huì)被丟棄。 - logging模塊不同等級(jí)日志對(duì)應(yīng)的值
def get_log_level_value():
"""
獲取log不同等級(jí)值
:return:
"""
log_level = {
'debug_value': logging.DEBUG,
'info_value': logging.INFO,
'warning_value': logging.WARNING,
'error_value': logging.ERROR,
'critical_value': logging.CRITICAL}
return log_level
diff_level_value = get_log_level_value()
print(diff_level_value)
"""
{'debug_value': 10, 'info_value': 20, 'warning_value': 30, 'error_value': 40, 'critical_value': 50}
"""
三雁歌、logging模塊不同等級(jí)的函數(shù)
- 模塊導(dǎo)入方式:import logging
- logging.debug(msg, *args, **kwargs)
創(chuàng)建一條等級(jí)為DEBUG的日志記錄 - logging.info(msg, *args, **kwargs)
創(chuàng)建一條等級(jí)為INFO的日志記錄 - logging.warning(msg, *args, **kwargs)
創(chuàng)建一條等級(jí)為WARNING的日志記錄 - logging.error(msg, *args, **kwargs)
創(chuàng)建一條等級(jí)為ERROR的日志記錄 - logging.critical(msg, *args, **kwargs)
創(chuàng)建一條等級(jí)為CRITICAL的日志記錄
def sample_log_output():
"""
最簡單的日志輸出記錄
:return:
"""
logging.info("This is a info log.")
logging.debug("This is a debug log.")
logging.warning("This is a warning log.")
logging.error("This is a error log.")
logging.critical("This is a critical log.")
sample_log_output()
"""結(jié)果
WARNING:root:This is a warning log.
ERROR:root:This is a error log.
CRITICAL:root:This is a critical log.
"""
- 分析結(jié)果
(1)輸出的結(jié)果字段代表: 日志級(jí)別:日志器名稱:日志內(nèi)容
(2)僅輸出有WARNING宏浩、ERROR和CRITICAL三個(gè)日志等級(jí),原因是logging模塊提供的日志記錄函數(shù)所使用的日志器設(shè)置的日志級(jí)別是WARNING将宪,所有只有≥此級(jí)別的日志才會(huì)被輸出绘闷,<此級(jí)別的日志被丟棄橡庞;
四、logging模塊log函數(shù)
- logging.log(level, msg, *args, **kwargs)
創(chuàng)建一條等級(jí)為level的日志記錄
Eg:使用log函數(shù)分別輸出一條不同日志級(jí)別的日志記錄
def log_function_output():
"""
logging.log函數(shù)輸出
:return:
"""
logging.log(level=logging.INFO, msg="This is a info log.")
logging.log(level=logging.DEBUG, msg="This is a debug log.")
logging.log(level=logging.WARNING, msg="This is a warning log.")
logging.log(level=logging.ERROR, msg="This is a error log.")
logging.log(level=logging.CRITICAL, msg="This is a critical log.")
log_function_output()
"""結(jié)果
WARNING:root:This is a warning log.
ERROR:root:This is a error log.
CRITICAL:root:This is a critical log.
"""
五印蔗、logging模塊basicConfig函數(shù)
- logging.basicConfig(**kwargs)
1. 函數(shù)介紹
basicConfig函數(shù)可對(duì)root logger進(jìn)行一次性配置扒最,即第一次調(diào)用此函數(shù)時(shí)起作用,之后再調(diào)用此函數(shù)不會(huì)起作用华嘹。
2.參數(shù)介紹
basicConfig函數(shù)參數(shù)
- filename:指定日志文件名
- filemode:指定日志文件打開模式(‘w’或‘a(chǎn)’)吧趣,默認(rèn)為a
- datefmt:指定時(shí)間格式
- level:指定日志級(jí)別
- format:指定日志輸出的格式和內(nèi)容
%(levelno)s:打印日志級(jí)別的數(shù)值(如10、20耙厚、30强挫、40、50)
%(levelname)s:打印日志級(jí)別名稱(如DEBUG薛躬、INFO俯渤、WARNING、ERROR型宝、CRITICAL)
%(pathname)s:打印當(dāng)前執(zhí)行程序的路徑
%(filename)s:打印當(dāng)前執(zhí)行程序名八匠,包括后綴
%(module)s:打印當(dāng)前執(zhí)行程序名,不包含后綴
%(funcName)s:打印日志的當(dāng)前函數(shù)
%(lineno)d:打印日志的當(dāng)前行號(hào)
%(asctime)s:打印日志的時(shí)間
%(thread)d:打印線程ID
%(threadName)s:打印線程名稱
%(process)d:打印進(jìn)程ID
%(processName)s:打印進(jìn)程名稱
%(message)s:打印日志信息
%(name)s:打印所使用的日志器名稱趴酣,默認(rèn)為root- stream:指定日志的輸出流梨树,可輸出到sys.stderr、sys.stdout或文件岖寞,默認(rèn)輸出到sys.stderr抡四;
- style:指定format格式字符串的風(fēng)格,默認(rèn)為%(可取值為%仗谆、{指巡、$)
- handlers:一個(gè)創(chuàng)建多個(gè)Handler的可迭代對(duì)象,Handler將會(huì)被添加到root logger中
注意事項(xiàng):
- handlers胸私、filename和stream不可同時(shí)存在厌处,否則報(bào)錯(cuò)(ValueError: 'stream' and 'filename' should not be specified together);
- datefmt需要format中包含有%(asctime)s時(shí)才會(huì)生效岁疼,否則無效阔涉;
def basicConfig_function():
"""
logging模塊基本配置函數(shù)
:return:
"""
log_format = '%(asctime)s %(filename)s [line:%(lineno)d] %(levelname)s %(message)s'
date_format = '%Y%m%d_%H:%M:%S'
file_mode = 'w'
file_name = "my.log"
logging.basicConfig(level=logging.DEBUG, format=log_format, datefmt=date_format, filemode=file_mode, filename=file_name)
logging.info("info_log")
logging.debug("debug_log")
logging.warning("warning_log")
# logger = logging.getLogger(__name__)
# logger.info("info_log")
# logger.debug("debug_log")
# logger.warning("warning_log")
basicConfig_function()
'''結(jié)果(logging方式或logger方式均可)
20190129_16:21:45 logging_operate.py [line:74] INFO info_log
20190129_16:21:45 logging_operate.py [line:75] DEBUG debug_log
20190129_16:21:45 logging_operate.py [line:76] WARNING warning_log
'''