Python的logging使用
2019-02-07 本文已影响0人
冬至是条狗
自己使用的配置:
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'
My_log_format = "[%(asctime)s][%(filename)s:%(lineno)d][%(levelname)s][%(message)s]"
# 定义日志输出格式 结束
# 定义日志文件夹
logfile_dir = os.path.dirname(os.path.abspath(__file__)) # log文件的目录
# 如果不存在定义的日志目录就创建一个
logfile_dir = os.path.join(logfile_dir, 'logs')
if not os.path.isdir(logfile_dir):
os.mkdir(logfile_dir)
logfile_name = 'My_log.log' # log文件名
# log文件的全路径
logfile_path = os.path.join(logfile_dir, logfile_name)
# log配置字典
LOGGING_DIC = {
'version': 1,
'disable_existing_loggers': False,
# 定义 格式
'formatters': {
'standard': {
'format': My_log_format
},
'simple': {
'format': simple_format
},
'id_simple': {
'format': id_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': 1024 * 1024 * 5, # 日志大小 5M
'backupCount': 5,
'encoding': 'utf-8', # 日志文件的编码,再也不用担心中文log乱码了
},
'boss': {
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler', # 保存到文件
'formatter': 'standard',
'filename': logfile_path, # 日志文件
'maxBytes': 1024 * 1024 * 5, # 日志大小 5M
'backupCount': 5,
'encoding': 'utf-8', # 日志文件的编码,再也不用担心中文log乱码了
},
'My_log': {
'level': 'DEBUG',
'class': 'logging.handlers.TimedRotatingFileHandler', # 保存到文件,使用时间轮转
'formatter': 'standard',
'filename': logfile_path, # 日志文件
'when': 'D', # 每天一个文件
'backupCount': 30, # 最大保存日期
'encoding': 'utf-8', # 日志文件的编码,再也不用担心中文log乱码了
},
},
'loggers': {
# logger1=logging.getLogger(__name__)拿到的logger配置
'': {
'handlers': ['default', 'console'], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
'level': 'DEBUG',
'propagate': True, # 向上(更高level的logger)传递
},
# logger1=logging.getLogger('collect')拿到的logger配置
'collect': {
'handlers': ['boss', ], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
'level': 'DEBUG',
'propagate': True, # 向上(更高level的logger)传递
},
},
}
def load_my_logging_cfg():
logging.config.dictConfig(LOGGING_DIC) # 导入上面定义的logging配置
my_log = logging.getLogger('My_log')
return my_log
if __name__ == '__main__':
load_my_logging_cfg()
import 此文件调用load_my_logging_cfg(); 返回一个打印日志的对象
import My_logging
logger = My_logging.load_my_logging_cfg()
logger.info(" info ")
logger.debug(" debug ")
logger.warning(" warning ")
logger.error(" debug ")
logger.critical(" critical ")
同时会在同级目录下创建一个logs文件夹,并创建log日志
此外,格式可以自己定制,可定制的内容如下:
%(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:打印日志信息