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()