最简单的logging用法
import logging
logging.error("hah")
logging.info("hah")
logging.debug("hah")
logging.warning("hah")
logging.critical("hah")
"""
#输出结果
#ERROR:root:hah
#WARNING:root:hah
#CRITICAL:root:hah
#info,debug并不会显示,默认级别为30
级别debug(10)
级别info(20)
级别warning(30)
级别error(40)
级别critical(50)
"""
自定义输出样式
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")
"""
40-2018-12-25 16:24:22,772-hah
30-2018-12-25 16:24:22,772-hah
50-2018-12-25 16:24:22,772-hah
"""
输出级别 和 文件or屏幕
日志的四个重要组件
很重要
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")
日志文件的使用,字典配置文件
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)
logfile_path = os.path.join(logfile_dir,'logs',logfile_name)
# 日志配置文件
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(name,msg):
logging.config.dictConfig(LOGGING_DIC) # 导入上面定义的logging配置
logger = logging.getLogger(name) # 生成一个log实例
logger.info(msg) # 记录该文件的运行状态
if __name__ == '__main__':
load_my_logging_cfg('console',"hahaha")
# 真实使用
import logging
import logging.config
from 上一个配置文件.py import LOGGING_DIC
logging.config.dictConfig(LOGGING_DIC)
logger = logging.getLogger("aaa")
logging.error("hah")
logging.info("hah")
logging.debug("hah")
logging.warning("hah")
logging.critical("hah")
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: 打印日志信息