1.python之logger日誌通用配置文件 2.放入項目即可直接使用 ...
閱讀須知⚠️
1.示例代碼可直接放在項目py文件中即可使用
2.project_name,logfile_name變數需根據你的項目進行修改
3.日誌輸出格式format選擇(可根據你的需要替換或修改示例代碼中的format)
%(levelno)s: 列印日誌級別的數值
%(levelname)s: 列印日誌級別名稱
%(pathname)s: 列印當前執行程式的路徑,其實就是sys.argv[0]
%(filename)s: 列印當前執行程式名
%(funcName)s: 列印日誌的當前函數
%(lineno)d: 列印日誌的當前行號
%(asctime)s: 列印日誌的時間
%(thread)d: 列印線程ID
%(threadName)s: 列印線程名稱
%(process)d: 列印進程ID
%(message)s: 列印日誌信息
示例代碼
import os
import re
import logging.config
# 定義三種日誌輸出格式
# 其中name為make_logger的參數name
standard_format = '[%(levelname)s][%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s]' \
'\n[%(filename)s:%(lineno)d][%(message)s]'
simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
id_simple_format = '[%(levelname)s][%(asctime)s] %(message)s'
# 項目名
project_name = 'dev'
# 日誌文件名
logfile_name = 'logs'
# 日誌配置
LOGGING_DIC = {
'version': 1,
# 禁用已經存在的logger實例
'disable_existing_loggers': False,
# 日誌格式化(負責配置log message 的最終順序,結構,及內容)
'formatters': {
'distinct': {
'format': standard_format
},
'simple': {
'format': simple_format
},
'less_simple': {
'format': id_simple_format
},
},
# 過濾器,決定哪個log記錄被輸出
'filters': {},
# 負責將Log message 分派到指定的destination
'handlers': {
# 列印到終端的日誌
'console': {
'level': 'INFO',
'class': 'logging.StreamHandler', # 列印到屏幕
'formatter': 'distinct'
},
# 列印到common文件的日誌,收集info及以上的日誌
'common': {
'level': 'INFO',
'class': 'logging.handlers.RotatingFileHandler', # 保存到文件
'formatter': 'simple',
'filename': './%s/access.log' % logfile_name, # 日誌文件路徑
'maxBytes': 1024*1024*5, # 日誌大小 5M
'backupCount': 5, # 備份5個日誌文件
'encoding': 'utf-8', # 日誌文件的編碼,再也不用擔心中文log亂碼了
},
# 列印到importance文件的日誌,收集error及以上的日誌
'importance': {
'level': 'ERROR',
'class': 'logging.handlers.RotatingFileHandler', # 保存到文件
'formatter': 'distinct',
'filename': './%s/importance.log' % logfile_name, # 日誌文件
# 'maxBytes': 1024*1024*5, # 日誌大小 5M
'maxBytes': 300, # 日誌大小 5M
'backupCount': 5, # 備份5個日誌文件
'encoding': 'utf-8', # 日誌文件的編碼,再也不用擔心中文log亂碼了
},
},
# logger實例
'loggers': {
# 預設的logger應用如下配置
'': {
'handlers': ['console'], # log數據列印到控制台
'level': 'DEBUG',
'propagate': True, # 向上(更高level的logger)傳遞
},
'default': {
'handlers': ['console', 'common', 'importance'],
'level': 'INFO',
'propagate': True, # 向上(更高level的logger)傳遞
},
'common': {
'handlers': ['console', 'common'], # 這裡把上面定義的兩個handler都加上,即log數據既寫入文件又列印到控制台
'level': 'INFO',
'propagate': True, # 向上(更高level的logger)傳遞
},
'importance': {
'handlers': ['console', 'importance'], # 這裡把上面定義的兩個handler都加上,即log數據既寫入文件又列印到控制台
'level': 'ERROR'
},
},
}
class Log(object):
@staticmethod
def isdir_logs():
"""
判斷日誌文件是否存在,不存在則創建
:return:
"""
# 當前文件的目錄
basedir = os.path.dirname(os.path.abspath(__file__))
pattern = '(.*/%s)' % project_name
project_dir = re.search(pattern, basedir).group()
# logs文件的路徑
log_path = os.path.join(project_dir, logfile_name)
# 判斷日誌文件夾是否在項目文件中
if not os.path.isdir(log_path):
os.mkdir(log_path)
@staticmethod
def make_logger(name=None):
"""
1. 如果不傳name,則根據__name__去loggers里查找__name__對應的logger配置(__name__為調用文件名)
獲取logger對象通過方法logging.getLogger(__name__),不同的文件__name__不同,這保證了列印日誌時標識信息不同,
2. 如果傳name,則根據name獲取loggers對象
3. 如果拿著name或者__name__去loggers里找key名時卻發現找不到,於是預設使用key=''的配置
:return: logger
"""
logging.config.dictConfig(LOGGING_DIC) # 導入上面定義的logging配置
if name:
logger = logging.getLogger(name)
else:
logger = logging.getLogger(__name__)
return logger
if __name__ == '__main__':
Log().isdir_logs()
importance_logger = Log.make_logger('default')
importance_logger.error('787878')