logging库日志级别:
假如设置为INFO级别,则DEBUG级别的日志不显示,会显示INFO及后面三种级别的日志
logging的高级应用:
loggers记录器:
Loggers:可以视为多支笔,并且可以同时向屏幕或文件等同时写日志
Handlers处理器:
Handlers:它们将日志分发到不同的目的地。可以是文件、标准输出、邮件、或者通过 socke、http等协议发送到任何地方
常见的处理器有:
Formatters格式化器:
Formatters对象用于最终设置日志信息的顺序、结构和内容
Filters过滤器:
可以控制过滤logger或者Handler
示例代码:
import logging
# ----------------------------日志级别----------------------------------------
print('this is a print log') # 最后打印
# 默认的日志级别的warning,所以只会打印warning,error和critical
logging.basicConfig(filename='demo.log', filemode='w', level=logging.DEBUG) # 设置日志级别,并将日志信息输出到指定文件中
logging.debug('this is a debug log')
logging.info('this is a info log')
logging.warning('this is a warning log')
logging.error('this is a error log')
logging.critical('this is a critical log')
# ----------------------------日志级别----------------------------------------
# ---------------------------向日志输入变量------------------------------------
logging.basicConfig(level=logging.DEBUG)
name = 'psj'
age = 23
logging.debug('姓名: %s 年龄: %d', name, age) # 字符拼接方式
logging.debug('姓名: %s 年龄: %d' % (name, age)) # %方式(多个变量要写出元组的格式)
logging.debug('姓名: {} 年龄: {}'.format(name, age)) # format方式
logging.debug(f'姓名: {name} 年龄: {age}') # fstring方式
# ---------------------------向日志输入变量------------------------------------
# ---------------------------调整输出格式和添加公共信息------------------------------------
logging.basicConfig(format='%(asctime)s-%(levelname)s-%(filename)s-%(lineno)s-%(message)s', level=logging.DEBUG)
name = 'psj'
age = 23
# 不在basicConfig中加format='...'则输出:DEBUG:root:姓名: psj 年龄: 23
logging.debug('姓名: %s 年龄: %d' % (name, age)) # 姓名: psj 年龄: 23(format='%(message)s')
logging.debug('姓名: %s 年龄: %d' % (name, age)) # 2021-07-20 16:22:38,292-姓名: psj 年龄: 23(format='%(asctime)s-%(message)s')
logging.warning('姓名: %s 年龄: %d' % (name, age)) # 2021-07-20 16:24:04,990-WARNING-姓名: psj 年龄: 23(format='%(asctime)s-%(levelname)s-%(message)s')
logging.warning('姓名: %s 年龄: %d' % (name, age)) # 2021-07-20 16:28:05,324-WARNING-日志.py-42-姓名: psj 年龄: 23(format='%(asctime)s-%(levelname)s-%(filename)s-%(lineno)s-%(message)s')
# ---------------------------调整输出格式和添加公共信息------------------------------------
# ---------------------------高级用法(编码方式)------------------------------------
# 1.记录器
logger = logging.getLogger('flt.myname') # 自定义记录器的名字
logger.setLevel(logging.DEBUG) # 设置记录器的级别,为了处理器可以任意设置级别,需要将此级别设别最低级的DEBUG
# 2.处理器
consoleHandler = logging.StreamHandler()
# 如果logger设置了级别则使用logger的级别,即使处理器额外设置了级别;并且如果logger没有设置为DEBUG,处理器设置的级别高于DEBUG也只能打印logger此时默认的WARNING
consoleHandler.setLevel(logging.DEBUG)
fileHandler = logging.FileHandler(filename='demo2.log', mode='w') # 没有指定日志输出级别会默认使用logger的日志级别
fileHandler.setLevel(logging.INFO)
# 3.Formatters格式器
formatter = logging.Formatter('%(asctime)s-%(levelname)8s-%(filename)s-%(lineno)s-%(message)s') # %(levelname)8s表示设置为8位并且对齐
# 4.定义一个过滤器
flt = logging.Filter('flt') # 只有前缀为flt的logger才可以使用
# 5.给处理器设置格式
consoleHandler.setFormatter(formatter)
fileHandler.setFormatter(formatter)
# 6.给记录器设置处理器
logger.addHandler(consoleHandler) # 给控制台写
logger.addHandler(fileHandler) # 给文件中写
# 7.关联过滤器
logger.addFilter(flt)
fileHandler.addFilter(flt) # 不仅可以给logger设置过滤器,还可以给Handler设置
# 8.打印日志代码(使用的是logger不是logging了)
logger.debug('this is a debug log')
logger.info('this is a info log')
logger.warning('this is a warning log')
logger.error('this is a error log')
logger.critical('this is a critical log')
# ---------------------------高级用法(编码方式)------------------------------------
# ---------------------------使用配置文件处理日志------------------------------------
# 配置文件中有中文,会报错,要么删除中文,要么修改fileConfig的源码
import logging.config
logging.config.fileConfig('logging.conf')
rootlogger = logging.getLogger() # 不加参数默认使用root的logger
rootlogger.debug('this is root logger debug')
logger = logging.getLogger('myname')
logger.debug('this is myname logger debug')
# ---------------------------使用配置文件处理日志------------------------------------
# ---------------------------实际运用------------------------------------
a = 'a'
try:
int(a)
except Exception as e:
logger.error(e) # 如果使用error不会打印具体的错误信息
logger.exception(e)
# ---------------------------实际运用------------------------------------
logging.conf:
[loggers]
keys=root,myname
[handlers]
keys=fileHandler,consoleHandler
[formatters]
keys=simpleFormatter
[logger_root]
level=DEBUG
handlers=consoleHandler
[logger_myname]
level=DEBUG
handlers=fileHandler,consoleHandler
qualname=myname
propagate=0
[handler_consoleHandler]
class=StreamHandler
args=(sys.stdout,)
level=DEBUG
formatter=simpleFormatter
[handler_fileHandler]
class=handlers.TimedRotatingFileHandler
args=('profile.log','midnight',1,0)
level=DEBUG
formatter=simpleFormatter
[formatter_simpleFormatter]
format=%(asctime)s|%(levelname)8s|%(filename)s[:%(lineno)d]|%(message)s
datefmt=%Y-%m-%d %H:%M:%S
参考视频:
https://www.bilibili.com/video/BV1sK4y1x7e1?from=search&seid=10952136950967006034