python中logging模块详解_Python中logging日志模块的解析(代码示例)

本篇文章给大家带来的内容是关于Python中logging日志模块的解析(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

一、日志记录的级别debug:优先级10,记录调试的详细信息,只在调试时开启

info:优先级20,记录普通的消息,报告错误和警告等待。

warning:优先级30,记录相关的警告信息。

error:优先级40,记录错误信息、程序崩溃

critical:优先级50,记录错误信息如果不设置,默认为iwarning

二、logging模块的主要结构

查看logging的源码,可知主要有四个类实现功能:Loggers:提供应该程序直接使用的接口,如相关的配置设置

Handlers:将Loggers产生的日志传到指定位置,设置日志保存的位置;

Filters:对输出日志进行过滤操作;

Formatters:控制日志的输出格式

Formatters

Formatters对象定义了日志的输出格式,有多种可选参数。参数含义%(name)sLogger的名字

%(levellno)s数字形式的日志级别

%(levelname)s文本形式的日志级别

%(pathname)s调用日志输出函数的模块的完整路径名,可能没有

%(filename)s调用日志输出函数的模块的文件名

%(module)s调用日志输出函数的模块名

%(funcName)s调用日志输出函数的函数名

%(lineno)d调用日志输出函数的语句所在的代码行

%(created)f当前时间,用unix标表示的时间浮点表示

%(relativeCreated)d输出日志信息时,自Logger创建以来的毫秒数

%(asctime)s字符串形式的当前时间,默认格式是‘2018-11-22 16:49:45,896’,逗号后面是毫秒

%(thread)d线程ID,可能没有

%(threadName)s线程名,可能没有

%(process)d进程ID,可能没有

%(message)s用户输出的信息

实例:import logging

#fmt:定义输出的日志信息的格式

#datefmt:定义时间信息的格式,默认为:%Y-%m-%d %H:%M:%S

#style:定义格式化输出的占位符,默认是%(name)格式,可选{}或$格式

formatter=logging.Formatter(fmt='%(asctime)s %(levelname)s: %(message)s'

,datefmt='%Y-%m-%d %H:%M:%S',style='%')

Handlers日志处理器

日志处理器用来处理日志的具体流向,是输出到文件中还是标准输出等,它通过设置Formatter控制输出格式,添加filters过滤日志。

常用的处理器有两种StreamHandler:用于向控制台打印日志

FileHandler:用于向日志文件打印日志

其它的处理器名称详细位置说明RotatingHandlerlogging.handlers.RotatingHandler日志回滚方式,支持日志文件最大数量和日志文件回滚

TimeRotatingHandlerlogging.handlers.TimeRotatingHandler日志回滚方式,在一定时间区域内回滚日志文件

SocketHandlerlogging.handlers.SocketHandler远程输出日志到TCP/IP sockets

DatagramHandlerlogging.handlers.DatagramHandler远程输出日志到UDP sockets

SMTPHandlerlogging.handlers.SMTPHandler远程输出日志到邮件地址

SysLogHandlerlogging.handlers.SysLogHandler日志输出到syslog

NTEventLogHandlerlogging.handlers.NTEventLogHandler远程输出日志到Windows NT/2000/xp的事件日志

MemoryHandlerlogging.handlers.MemoryHandler日志输出到内存中的指定buffer

HTTPHandlerlogging.handlers.HTTPHandler通过“GET”或者“POST”远程输出到HTTP服务器from logging import Handler

#所有日志处理器的父类

handler=Handler()

print('处理日志的等级:',handler.level)

print('处理日志的名字:',handler.name)

print('处理器的日志过滤器::',handler.filters)

print('日志的格式::',handler.filters)

#一些常用方法:

handler.get_name()

handler.set_name('')

handler.createLock()#创建线程锁

handler.acquire()#获取线程锁

handler.release()#释放线程锁

handler.setLevel('info') #设置日志处理器的记录级别

handler.setFormatter(fmt='')#设置日志的输出格式

handler.addFilter('')#往处理器中添加过滤器

handler.removeFilter('')#往处理器中移除过滤器

handler.emit('')#日志记录的处理逻辑,由子类实现

Logger日志对象

Logger管理着所有记录日志的方法。from logging import error, debug, warning, info, fatal, critical, getLogger

#返回一个Logger实例

#以'root'为名字的日志对象在Logger对象中只有一个实例

logger=getLogger('root')

print('获取根日志对象',logger.root)

print('获取manager',logger.manager)

print('获取根日志对象的名字',logger.name)

print('获取根日志对象记录水平',logger.level)

print('获取根日志对象过滤器列表',logger.filters)

print('获取根日志对象处理器列表',logger.handlers)

print('获取根日志对象',logger.disabled)

#设置日志记录水平

logger.setLevel('info')

#输出日志信息,格式化输出

logger.info('this is %s','info',exc_info=1)

#记录warning信息

logger.warning('')

#记录error信息

logger.error('')

#等价于logger.error('',exc_info=1)

logger.exception('')

#记录debug信息

logger.debug('')

#记录critical信息

logger.critical('')

#直接指定级别

logger.log('info','')

#添加处理器

logger.addHandler()

#移除处理器

logger.removeHandler()

#判是否有处理器

logger.hasHandlers()

三、logger的基本使用

实例:import logging

import sys

def my_get_logger(appname):

#获取logger实例,如果参数为空则返回root logger

logger=logging.getLogger(appname)

#创建日志输出格式

formatter=logging.Formatter('%(asctime)s %(levelname)s: %(message)s')

#指定输出的文件路径

file_handler=logging.FileHandler('test.log')

# 设置文件处理器,加载处理器格式

file_handler.setFormatter(formatter)

#控制台日志

console_handler=logging.StreamHandler(sys.stdout)

console_handler.formatter=formatter

#为logger添加的日志处理器

logger.addHandler(file_handler)

logger.addHandler(console_handler)

#指定日志的最低输出级别,默认为warn级别

logger.setLevel(logging.INFO)

return logger

if __name__ == '__main__':

logger=my_get_logger('test')

logger.debug('this is debug info')

logger.info('this is information')

logger.warning('this is warning message')

logger.error('this is error message')

logger.fatal('this is fatal message,it is same ad logger.critical')

logger.critical('this is critical message')

结果:2018-11-22 16:31:34,023 INFO: this is information

2018-11-22 16:31:34,023 WARNING: this is warning message

2018-11-22 16:31:34,023 ERROR: this is error message

2018-11-22 16:31:34,024 CRITICAL: this is fatal message,it is same ad logger.critical

2018-11-22 16:31:34,024 CRITICAL: this is critical message

四、logger日志记录的逻辑调用过程记录日志通过调用logger.debug等方法;

首先判断本条记录的日志级别是否大于设置的级别,如果不是,直接pass,不再执行;

将日志信息当做参数创建一个LogRecord日志记录对象

将LogRecord对象经过logger过滤器过滤,如果被过滤则pass

日志记录对象被Handler处理器的过滤器过滤

判断本条记录的日志级别是否大于Handler处理器设置的级别,如果不是,直接pass,不再执行;

最后调用处理器的emit方法处理日志记录;

五、配置logger通过代码进行完整配置,主要是通过getLogger方法实现,但不好修改

通过basicConfig方法实现,这种方式快速但不够层次分明

通过logging.config.fileConfig(filepath),文件配置

通过dictConfig的字典方式配置,这是py3.2版本引入的新的配置方法

使用文件方式配置#logging.cong

[loggers]

#定义日志的对象名称是什么,注意必须定义root,否则报错

keys=root,main

[handlers]

#定义处理器的名字是什么,可以有多个,用逗号隔开

keys=consoleHandler

[formatters]

#定义输出格式对象的名字,可以有多个,用逗号隔开

keys=simpleFormatter

[logger_root]

#配置root对象的日志记录级别和使用的处理器

level=INFO

handlers=consoleHandler

[logger_main]

#配置main对象的日志记录级别和使用的处理器,qualname值得就是日志对象的名字

level=INFO

handlers=consoleHandler

qualname=main

#logger对象把日志传递给所有相关的handler的时候,会逐级向上寻找这个logger和它所有的父logger的全部handler,

#propagate=1表示会继续向上搜寻;

#propagate=0表示停止搜寻,这个参数涉及重复打印的坑。

propagate=0

[handler_consoleHandler]

#配置处理器consoleHandler

class=StreamHandler

level=WARNING

formatter=simpleFormatter

args=(sys,)

[formatter_simpleFormatter]

#配置输出格式过滤器simpleFormatter

format=%(asctime)-%(name)s-%(levelname)s-%(message)s注意:可以看到logger和Handler都可以设置日志级别,日志输出是取最高级别。

使用字典形式配置

字典形式配置功能更强大,也更加灵活。通过dictConfig函数,我们可以将其他格式的配置文件转化成字典,如json,YAML等。

实例:import yaml

from logging.config import dictConfig

import os

filename=os.path.dirname(os.path.abspath(__file__))

with open(filename+'/logging.yaml','r') as f:

log=yaml.load(f.read())

dictConfig(log)#logging.yaml

#注意:yaml格式严格,:后面一定要带空格

version: 1

formatters:

simple:

format: '%(asctime)s-%(name)s-%(levelname)s-%(message)s'

handlers:

console:

class: logging.StreamHandler

level: DEBUG

formatter: simple

stream: ext://sys.stdout

console_err:

class: logging.StreamHandler

level: DEBUG

formatter: simple

stream: ext://sys.stderr

loggers:

simpleExample:

level: DEBUG

handlers: [console]

propagate: no

root:

level: DEBUG

handlers: [console_err]]

六、监听logger配置更改logging.config.listen(port)函数可以让英语程序在一个socket上监听新的配置信息,达到在运行时改变配置,而不用重启应用程序的目的。import logging.config

import logging

logging.config.fileConfig("logging.conf")

logger=logging.getLogger('test.listen')

#监听端口号9999

t=logging.config.listen(9999)

t.setDaemon(True)

t.start()

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 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、FormatterLogger表示一个日志记录器对象,可以设定日志记录级别、输出地点和格式;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、付费专栏及课程。

余额充值