记录pythonlogging模--使⽤⾃定义配置⽂件(conf)
⽂章⽬录
logging 的基本知识参照:
1、基本知识总结
1、⽇志等级
默认分为六种⽇志级别(括号为级别对应的数值)
⽇志等级(level)描述
NOTSET(0)
DEBUG(10)最详细的⽇志信息,典型应⽤场景是 问题诊断
INFO(20)信息详细程度仅次于DEBUG,通常只记录关键节点信息,⽤于确认⼀切都是按照我们预期的那样进⾏⼯作WARNING(30)当某些不期望的事情发⽣时记录的信息(如,磁盘可⽤空间较低),但是此时应⽤程序还是正常运⾏的
ERROR(40)由于⼀个更严重的问题导致某些功能不能正常运⾏时记录的信息
CRITICAL(50)当发⽣严重错误,导致应⽤程序不能继续运⾏时记录的信息
我们⾃定义⽇志级别时注意不要和默认的⽇志级别数值相同,logging 执⾏时输出⼤于等于设置的⽇志级别的⽇志信息,如设置⽇志级别是INFO,则 INFO、WARNING、ERROR、CRITICAL 级别的⽇志都会输出。
2、logging模块定义的模块级别的常⽤函数
函数说明
logging.debug(msg, *args, **kwargs)创建⼀条严重级别为DEBUG的⽇志记录
logging.info(msg, *args, **kwargs)创建⼀条严重级别为INFO的⽇志记录
logging.warning(msg, *args, **kwargs)创建⼀条严重级别为WARNING的⽇志记录
<(msg, *args, **kwargs)创建⼀条严重级别为ERROR的⽇志记录
logging.log(level, *args, **kwargs)创建⼀条严重级别为level的⽇志记录
logging.basicConfig(**kwargs)对root logger进⾏⼀次性配置
3、logging.basicConfig()函数包含参数说明
参数名
称
描述
filename 指定⽇志输出⽬标⽂件的⽂件名,可以写⽂件名也可以写⽂件的完整的绝对路径,写⽂件名⽇志放执⾏⽂件⽬录下,写完整路径按照完整路径⽣
成⽇志⽂件),指定该设置项后⽇志信⼼就不会被输出到控制台了
filemode指定⽇志⽂件的打开模式,默认为’a’。需要注意的是,该选项要在filename指定时才有效 【r[+]、w[+]、a[+]】
format 指定⽇志格式字符串,即指定⽇志输出时所包含的字段信息以及它们的顺序。logging模块定义
的格式字段下⾯会列出。
datefmt 指定⽇期/时间格式。需要注意的是,该选项要在format中包含时间字段%(asctime)s时才有效
level
指定⽇志器的⽇志级别
stream
指定⽇志输出⽬标stream,如sys.stdout、sys.stderr以及⽹络stream。需要说明的是,stream和filename不能同时提供,否则会引发
ValueError异常
handles
定义处理器,⽤来创建 Handler 对象,不能和 filename 、stream 参数⼀起使⽤,否则也会抛出 ValueError 异常
参数名称描述
4、logging 定义好的formmat 格式
字段/属性名称
使⽤格式描述
asctime %(asctime)s 将⽇志的时间构造成可读的形式,默认情况下是‘2016-02-08 12:00:00,123’精确到毫秒
name %(name)s 所使⽤的⽇志器名称,默认是’root’,因为默认使⽤的是 rootLogger filename %(filename)s 调⽤⽇志输出函数的模块的⽂件名; pathname的⽂件名部分,包含⽂件后缀
funcName %(funcName)s 由哪个function发出的log, 调⽤⽇志输出函数的函数名
levelname %(levelname)s ⽇志的最终等级(被filter修改后的)message %(message)s ⽇志信息, ⽇志记录的⽂本内容
lineno %(lineno)d 当前⽇志的⾏号, 调⽤⽇志输出函数的语句所在的代码⾏levelno %(levelno)s 该⽇志记录的数字形式的⽇志级别(10, 20, 30, 40, 50)pathname %(pathname)s 完整路径 ,调⽤⽇志输出函数的模块的完整路径名,可能没有
process
%(process)s
当前进程, 进程ID。可能没有
processName %
(processName)s 进程名称,Python 3.1新增
thread %(thread)s 当前线程, 线程ID。可能没有
threadName %(thread)s 线程名称
module
%(module)s
调⽤⽇志输出函数的模块名, filename的名称部分,不包含后缀即不包含⽂件后缀的⽂件名
created %(created)f
当前时间,⽤UNIX标准的表⽰时间的浮点数表⽰; ⽇志事件发⽣的时间–时间戳,就是当时调⽤time.time()函
数返回的值
relativeCreated
%
easyui combox 不可编辑(relativeCreated)d
输出⽇志信息时的,⾃Logger创建以 来的毫秒数; ⽇志事件发⽣的时间相对于logging模块加载时间的相对毫
秒数
msecs %(msecs)d
⽇志事件发⽣事件的毫秒部分。logging.basicConfig()中⽤了参数datefmt,将会去掉asctime中产⽣的毫秒部
分,可以⽤这个加上
5、⽇志输出格式
⽇志的输出格式可以认为设置,默认格式为下图所⽰。
6、loggin 的四⼤组件
组件名称对应类名功能描述
⽇志器Logger提供了应⽤程序可⼀直使⽤的接⼝
处理器Handler将logger创建的⽇志记录发送到合适的⽬的输出
过滤器Filter提供了更细粒度的控制⼯具来决定输出哪条⽇志记录,丢弃哪条⽇志记录python解析json文件
格式器Formatter决定⽇志记录的最终输出格式
7、常⽤的配置⽅法
⽅法描述
Logger.setLevel()设置⽇志器将会处理的⽇志消息的最低严重级别word滚动条
Logger.addHandler()和 veHandler() 为该logger对象添加 和 移除⼀个handler对象
Logger.addFilter()和 veFilter() 为该logger对象添加 和 移除⼀个filter对象
7.1 logger对象配置完成后,可以使⽤下⾯的⽅法来创建⽇志记录:
⽅法描述Logger.debug(), Logger.info(), Logger.warning(), (), itical()创建⼀个与它们的⽅法名对应等级的⽇志记录
Logger.log()需要获取⼀个明确的⽇志level参数来创建⼀个⽇志记录8、Handler类: 配置⽇志输出位置
输出⽅向
1、⽇志⽂件
2、标准输出
3、Email
Handler.setLevel(lel):指定被处理的信息级别,低于lel级别的信息将被忽略
Handler.setFormatter():给这个handler选择⼀个格式
Handler.addFilter(filt)、veFilter(filt):新增或删除⼀个filter对象
Logger.addHandler()和veHandler()从记录器对象中添加和删除处理程序对象。处理器详见Handlers。select是什么意思中文意思
8.1 Handlers
应⽤程序代码不应该直接实例化和使⽤Handler实例。因为Handler是⼀个基类,它只定义了素有handlers都应该有的接⼝,同时提供了⼀些⼦类可以直接使⽤或覆盖的默认⾏为。下⾯是⼀些常⽤的Handler:
Handler描述
logging.StreamHandler控制台输出,将⽇志消息发送到输出到Stream,如std.out, 或任何file-like对象。
logging.FileHandler将⽇志消息发送到磁盘⽂件,默认情况下⽂件⼤⼩会⽆限增长
logging.handlers.RotatingFileHandler 将⽇志消息发送到磁盘⽂件,并⽀持⽇志⽂件按⼤⼩切割,达到指定⽂件⼤⼩,重新⽣成⽂件,并重新命数字字体大全样式
名 前⾯的⽂件 (caht.log.1、caht.log.2)
logging.hanlders.TimedRotatingFileHandler将⽇志消息发送到磁盘⽂件,并⽀持⽇志⽂件按时间切割logging.handlers.HTTPHandler将⽇志消息以GET或POST的⽅式发送给⼀个HTTP服务器logging.handlers.SMTPHandler将⽇志消息发送给⼀个指定的email地址
logging.NullHandler 该Handler实例会忽略error messages,通常被想使⽤logging的library开发者使⽤来避免’No handlers could be found for logger XXX’信息的出现。
Handler描述
9、⾃定义配置
我们知道创建⼀个 Logger 对象所需的配置了,以前直接硬编码在程序中配置对象,配置还可以从字典类型的对象和配置⽂件获取。打开fig Python ⽂件,可以看到其中的配置解析转换函数。
9.1、硬编码配置
def log2():
LOG_FORMAT ="%(asctime)s %(name)s %(filename)s %(funcName)s %(levelname)s %(pathname)s %(message)s " # 配置输出⽇志格式
DATE_FORMAT ='%Y-%m-%d %H:%M:%S %a ' # 配置输出时间的格式,注意⽉份和天数不要搞乱了
logging.basicConfig(level=logging.DEBUG,
format=LOG_FORMAT,
datefmt=DATE_FORMAT,
filename=r"./ab.log" # 有了filename参数就不会直接输出显⽰到控制台,⽽是直接写⼊⽂件
)
# 创建log ⽇志信息
logging.debug("msg1")
logging.info("msg2")
logging.warning("msg3")
<("msg4")
import logging
def log():
#创建logger,如果参数为空则返回root logger
logger = Logger("nick")
logger.setLevel(logging.DEBUG) #设置logger⽇志等级
#这⾥进⾏判断,如果logger.handlers列表为空,则添加,否则,直接去写⽇志
if not logger.handlers:
#创建两个handler
fh = logging.FileHandler("test.log",encoding="utf-8")
ch = logging.StreamHandler()
数组加上指针怎么用#设置输出⽇志格式
formatter = logging.Formatter(
fmt="%(asctime)s %(name)s %(filename)s %(message)s",
datefmt="%Y/%m/%d %X"
)
#为两个handler指定输出格式
fh.setFormatter(formatter)
ch.setFormatter(formatter)
#为logger添加的⽇志处理器
logger.addHandler(fh)
logger.addHandler(ch)
return logger #直接返回logger
logger =log()
logger.warning("泰拳警告")
logger.info("提⽰")
<("错误")
logger.debug("查错")
9.2、从配置⽂件中获取配置信息:
常见的配置⽂件有 ini 格式、yaml 格式、JSON 格式,或者从⽹络中获取都是可以的,只要有相应的⽂件解析器解析配置即可,下⾯只展⽰了 ini 格式和 yaml 格式的配置。
注意: 在使⽤配置⽂件的时候不能出现中⽂,否则会报错。在使⽤的时候需要将配置⽂件中的中⽂去掉UnicodeDecodeError:'gbk' codec can't decode byte0xab in position 492: illegal multibyte sequence
9.2.1 int ⽂件
test.ini ⽂件
[loggers] # loggers 对象列表
keys=root,main
[handlers] # handlers 对象列表
keys=consoleHandler,fileHandler
[formatters] # formatters 对象列表
keys=fmt
[logger_root]# 配置 logger_root :设置⽇志级别、输出位置(控制台和⽂件)
level=DEBUG
handlers=consoleHandler,fileHandler
[logger_main]# 配置 logger_main :设置⽇志级别、输出位置(⽂件)、除开root logger 对象其余的logger对象 qualname 参数不能少level = DEBUG
handlers = fileHandler
qualname=main
propagate=0
[handler_consoleHandler] # consoleHandler 控制器输出⽅向、级别、输出格式、参数
class= StreamHandler
level = DEBUG
formatter = fmt
args =(sys.stdout,)
[handler_fileHandler]# fileHandler 控制器输出⽅向、级别、输出格式、参数
class= logging.handlers.RotatingFileHandler
level = DEBUG
formatter = fmt
args =('test.log','a',10000,3,)
#args =("test.log", mode="w", maxBytes=1000, backupCount=3, encoding="utf-8")
[formatter_fmt]
format=%(asctime)s -%(name)s -%(levelname)s -%(message)s
datefmt=
testinit.py ⽂件
fig
# 配置 root logger
# 获取logger 对象
logger = Logger("sampleLogger")
# 创建⽇志信息
logger.info("HELLO 智障")
9.2.2 conf⽂件
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论