Python中logging模块

logging模块

日志级别
日志级别Level数值
CRITICAL50
ERROR40
WARNING30,默认级别
INFO20
DEBUG10
NOTSET0

日志级别指的是生产日志的事件的严重程度,设置一个级别后,严重程度低于设置的值的日志消息将被忽略
debug(), info(), warning(), error()和critical()方法


格式字符串
属性名格式描述
日志消息内容%(message)sThe logged message,computed as msg% args.当调用Formatter.format()时设置
asctime%(asctime)s创建LogRecord时的可读时间。默认情况下,它的格式为’年-月-日 时:分:秒,x’(逗号后面的x数字是毫秒部分的时间)
函数名%(funcName)s日志调用所在的函数名
日志级别名称%(levelname)s消息级别名称,‘DEBUG’,‘INFO’,‘WARNING’,‘ERROR’,‘CRITICAL’
日志级别的数值%(levelno)s消息的级别数字,对应DEBUG, INFO, WARNING, ERROR, CRITICAL
行号%(lineno)d日志调用所在的源码行号
模块%(module)s模块(filename的名字部分)
进程ID%(process)d进程 ID
线程ID%(thread)d线程ID
进程名称%(processName)s进程名
线程名称%(threadName)s线程名字
logger名称%(name)slogger名字

注意:funcName、threadName、processName都是小驼峰。
例如,默认级别是 warning 值为30,低于30的级别不能输出

import logging

FORMAT = '%(asctime)s,Thread info: %(thread)d, %(threadName)s,%(message)s'
logging.basicConfig(format=FORMAT)

logging.info('ABCD')   #info级别的值为20,低于默认级别30 ,所有不能打印
logging.warning('abcd')
--------------------------------------------------------------
2019-06-11 17:39:30,757,Thread info: 13092, MainThread,abcd
python 格式化构建消息
import logging

FORMAT = '%(asctime)s,Thread info: %(thread)d, %(threadName)s,%(message)s,%(country)s'
logging.basicConfig(format=FORMAT,level=logging.INFO)  #level = logging.INFO 设置级别

d = {'country': 'China'} #python格式化构建消息
logging.info('I am {}'.format(20),extra=d)
---------------------------------------------------------------
2019-06-11 18:51:47,695,Thread info: 2724, MainThread,I am 20,China
修改日期格式
import logging
logging.basicConfig(format='%(asctime)s,%(message)s',datefmt='%Y/%m/%d %I:%M:%S')
logging.warning('I am {}'.format(20))
-----------------------------------------------------
2019/06/11 07:07:23,I am 20

输出到文件
import logging
logging.basicConfig(format='%(asctime)s,%(message)s',filename='f:/work/001/a.log')  #输出文件的路径必须存在
logging.warning('I am {},I am Chinese'.format(20))
logger 类

在logging模块中,顶层代码有如下代码:

root = RootLogger(WRANING)
Logger.root = root
  • logging模块加载的时候,会创建一个全局对象root,它是一个RootLogger实例,即rootlogger. RootLogger对象的默认级别是WRANING
  • RootLogger类继承自Logger类(Logger的级别是0)
  • 类Logger初始化方法签名是(name,level=NOTSET)
  • 类RootLogger而初始化签名(level),本质上调用的是Logger.__ init__(self,“root”,WRANING),调用logging.basicConfig来调整级别,就是对这个RootLogger的级别进行修改
构造

Logger实例的构建,使用Logger类也行,但推荐getLogger函数

#源码
def getLogger(name=None):
    """
    Return a logger with the specified name, creating it if necessary.

    If no name is specified, return the root logger.
    """
    if name:
        return Logger.manager.getLogger(name)
    else:
        return root  #此处的root指的是root = RootLogger(WARNING)的root
import logging

a = logging.Logger('A',20)
b = logging.Logger('B',30)
print(a,id(a),a.level)
print(b,id(b),b.level)

c = logging.getLogger('A')   #如果不启名字,返回的都是根logger,如果启了名字,只要名字相同,返回的都是同一个对象
print(c,id(c),c.level)
d = logging.getLogger('A')
print(d,id(d),d.level)
-----------------------------------
<Logger A (INFO)> 1988127554864 20
<Logger B (WARNING)> 1988127581296 30
<Logger A (WARNING)> 1988127581632 0
<Logger A (WARNING)> 1988127581632 0

  • 使用工厂方法返回一个Logger实例
  • 指定name,返回一个名称为name的Logger实例,如果再次使用相同的名字,返回同一个实例,背后使用一个字典保证同一个名称防护同一个Logger实例
  • 未指定name,返回Logger实例

层次结构

Logger是层次结构的使用.点号 分割,例如’a’,‘a.b’,a是a.b的parent,a.b是a的子child,对于foo来说,名字为foo.bar,foo.bar.baz,foo.bam都是foo的后代.

import logging

root = logging.root
print(root,id(root))

root=logging.getLogger()
print(root,id(root))
print(root.name,type(root),root.parent)

parent = logging.getLogger(__name__)
print(parent.name,type(parent),id(parent.parent),id(parent))

child = logging.getLogger("{}{}".format(__name__,'.child'))
print(child.name,type(child),id(child),id(child.parent))
---------------------------------------------------------
<RootLogger root (WARNING)> 2466000351016
<RootLogger root (WARNING)> 2466000351016
root <class 'logging.RootLogger'> None
__main__ <class 'logging.Logger'> 2466000351016 2465998202080
__main__.child <class 'logging.Logger'> 2465998202472 2465998202080

level级别的设置

每一个logger实例都有个级别
每一个logger实例都有一个等效的level
logger对象可以在创建后动态的修改自己的level,等效的level决定这logger实例能输出什么级别的信息

import logging
FORMAT = '%(asctime)-15s\tThread info: %(thread)d  %(threadName)s [%(message)s]'
logging.basicConfig(format=FORMAT, level=logging.INFO )

logger = logging.getLogger('NAME') #此处不写名字,则创建的实例就是root实例,有效级别就是默认的(level设置的级别,level不设置,就是默认的WARNING)
print('A',logger.name, type(logger), logger.level) # 新的logger实例的level是0

logger.info('1 info')
print('B',logger.getEffectiveLevel()) # 有效级别,从哪里来的

logger.setLevel(28) # 设置logger的level
print('C',logger.getEffectiveLevel(), logger.level)
logger.info('2 info')

logger.setLevel(42)
logger.warning('3 warning')
logger.error('4 error')
logger.critical('5 critical')

root = logging.getLogger() # Rootlogge
root.info('6 root info')
--------------------------------------------------------
2019-06-11 21:59:24,611	Thread info: 18196  MainThread [1 info]
2019-06-11 21:59:24,611	Thread info: 18196  MainThread [5 critical]
A NAME <class 'logging.Logger'> 0
2019-06-11 21:59:24,611	Thread info: 18196  MainThread [6 root info]
B 20
C 28 28


日志流

level的继承

import logging

logging.basicConfig(format="%(asctime)s %(name)s [%(message)s]")

log1 = logging.getLogger('s')   # getLogger() 的好处,可以动态设置有效级别
print(log1.level,log1.getEffectiveLevel(),'------1')   #0,30
# log1.info('1 info')
print(log1.parent)

log2 = logging.getLogger('s.s1')
print(log2.level,log2.getEffectiveLevel(),'------2')  #0,30
# log2.info('2 info')

log1.setLevel(20)
# log1.info('3 info')
print(log1.level,log1.getEffectiveLevel(),'------3')  #20,20
print(log2.level,log2.getEffectiveLevel(),'------4')  #20,20
# log2.info('4 info')

log2.setLevel(30)                  
print(log2.level,log2.getEffectiveLevel(),'------5')  #30,30
# log2.info('5 info')

print(log1.level,log1.getEffectiveLevel(),'------6')  #20,20

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: logging模块Python标准库的一个模块,用于记录程序运行时的日志信息。它提供了一种灵活的方式来控制日志记录的级别、格式和输出目标,可以将日志信息输出到控制台、文件、网络等不同的位置。使用logging模块可以帮助我们更好地理解程序的运行情况,快速定位问题并进行调试。在使用logging模块时,我们需要定义一个Logger对象,然后使用它来记录日志信息。Logger对象可以设置多个Handler对象,每个Handler对象可以设置不同的日志级别和输出目标。日志级别包括DEBUG、INFO、WARNING、ERROR和CRITICAL五个级别,级别越高,记录的信息越重要。在记录日志信息时,我们可以使用不同的格式化字符串来控制日志信息的输出格式,例如时间、级别、模块名、函数名等。除了基本的日志记录功能外,logging模块还提供了一些高级功能,例如日志回滚、日志过滤、日志轮换等,可以根据实际需求进行配置。 ### 回答2: logging模块Python内置的一个用于输出日志信息的模块,通过它我们可以记录程序运行时产生的各种信息,帮助我们了解程序运行过程的动态情况,有助于快速排查问题和系统优化。 logging模块的主要特点: 1.提供了5种不同的日志级别控制,从低到高分别是DEBUG、INFO、WARNING、ERROR、CRITICAL,不同级别的日志信息可以按照需求进行输出和记录。 2.可以灵活配置日志的输出位置和格式,包括控制台输出、文件输出和邮件输出等,还可以通过配置格式化器进行日志信息格式化。 3.支持输出、记录异常信息及堆栈信息等,便于排查问题。 以下是logging模块的一些常用方法及用法: 1. basicConfig():进行一些基本配置,如日志级别、输出格式、输出位置等,通常在程序入口处调用。 2. getLogger():获取一个logger实例,可以用来输出日志信息,常用于创建模块级别的日志记录器。 3. setLevel():设置日志级别,只有比设置级别高的日志才会输出。 4. addHandler():添加处理器,将日志信息发送到指定的输出位置,比如文件、控制台等。 5. Formatter():定义日志信息的格式化方式,可以定义不同的格式化字符串实现不同的输出格式。 6. 异常处理:可以使用try-except语句结合logging模块来记录异常信息及堆栈信息,方便排查问题。 7. 多模块日志处理:使用getLogger()方法可以创建多个记录器,为不同的模块或功能区分开来,方便排查问题。 总之,logging模块Python非常有用的一个模块,它可以帮助我们记录程序运行的各种信息,并提供各种定制化的输出方式,有助于提高代码的可读性和可维护性,快速排查问题。同时,也要注意在实际使用避免频繁输出日志信息导致程序性能下降。 ### 回答3: Pythonlogging模块是一个优秀的记录日志的方式,可以将程序任何需要记录的信息输出到特定的位置,如控制台、文件或者网络。logging模块提供了强大的日志功能,可以将输出日志进行分级、格式化、过滤、存储等多种功能,可以让开发者方便地实现程序日志输出。下面将对logging模块的详细使用进行介绍。 logging模块的主要概念包括Logger、Handler、Formatter。Logger表示一个日志记录器对象,可以设定日志记录级别、输出地点和格式;Handler表示在哪里输出日志,不同Handler可以输出到不同位置;Formatter表示日志输出的格式。 使用logging模块记录日志需要以下步骤: 1. 创建一个Logger对象,用于记录日志信息。Logger对象可以指定名字,如果不指定,会使用rootLogger。 ```python import logging logger = logging.getLogger("mylogger") ``` 2. 设置Logger的级别,只有高于该级别的日志才会输出。默认级别为warning。 ```python logger.setLevel(logging.DEBUG) ``` 3. 创建Handler对象,用于将日志信息输出到指定位置。常用的Handler有StreamHandler(输出到控制台)、FileHandler(输出到文件)、HTTPHandler(输出到网络)等。 ```python stream_handler = logging.StreamHandler() file_handler = logging.FileHandler("log.txt") ``` 4. 设置Handler的级别,如果不设置,默认级别为warning。 ```python stream_handler.setLevel(logging.INFO) file_handler.setLevel(logging.ERROR) ``` 5. 创建Formatter对象,用于确定日志信息的输出格式。 ```python formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') stream_handler.setFormatter(formatter) file_handler.setFormatter(formatter) ``` 6. 将Handler添加到Logger对象。 ```python logger.addHandler(stream_handler) logger.addHandler(file_handler) ``` 7. 使用Logger对象记录日志。 ```python logger.debug('debug message') logger.info('info message') logger.warning('warning message') logger.error('error message') logger.critical('critical message') ``` 日志级别从高到低为:CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET。 最后,logging模块还可以进行日志的过滤、日志的旋转等操作,可以根据实际需求进行设置。总的来说,logging模块Python程序提供了一种方便、灵活的日志记录方式,可以帮助开发者更好地了解程序的运行状态,方便地进行调试和问题排查。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值