logging日志模块,四种方式 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.自定义日志格式 日志基本设置 只能设置显示的信息格式,并不能设置日志级别和输出(屏幕或文件) logging.basicConfig(format="%(levelno)s-%(asctime)s-%(message)s") logging.error("hah") logging.info("hah") logging.debug("hah") logging.warning("hah") logging.critical(

logging日志模块,四种方式
1.最简单的用法
import logging
logging.error(

import logging

info,debug并不会显示,默认级别为30

级别debug(10)

级别info(20)

级别warning(30)

级别error(40)

级别critical(50)

2.自定义日志格式

import logging

日志基本设置

只能设置显示的信息格式,并不能设置日志级别和输出(屏幕或文件)

3.自定义日志

设置级别,之前两种方法都是warning级别以上输出

设置输出,之前两种方法都是输出到屏幕

四个重要组件

1.Logger 日志生成器 负责产生一条完整的日志

2.Filter 过滤器 负责对日志进行过滤(不常用,可以通过格式或级别过滤输出)

3.Handler 处理器 负责将日志输出到指定位置

4.Formater 格式化 负责处理日志显示的格式

import logging

# 1.创建1个logger:

# 2.创建handler(负责输出,输出到屏幕streamhandler,输出到文件filehandler)

sh = logging.StreamHandler()

# 3.创建formatter:

# 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.调用日志

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

以上我们可以放入一个mylog.py文件,当做一个模块导入使用

1.可以发现模块在最后帮我们定义了一个函数

我们导入模块from log(项目文件夹log) import mylog

logger = mylog.load_my_logging_cfg 这个函数名太长,搞个变量指向下

使用这个函数存在一个问题,就是我们输出的级别被固定死为info

2.如果我们要记录不同级别的日志,还得手动导入字典

import logging

import logging.config

from log import mylog

logging.config.dicConfig(mylog.LOGGING_DIG)从mylog模块导入配置字典