Python logging日志模块 详解logging模块

        在我们日常的运维工作中,很多情况下都需要解决问题/处理bug,而在解决问题和处理bug的过程离不开查看日志,而Python的logging就是为记录日志使用的,而且是线程安全的,这就意味这不必要去担心因日志模块的异常导致程序崩溃

1、首先我们来看一个简单的日志输出到终端的例子:

import logging

logging.debug('debug message')
logging.info('info message')
logging.warning('warning message')
logging.error('error message')
logging.critical('critical message')

输出内容:

WARNING:root:warning message
ERROR:root:error message
CRITICAL:root:critical message

         可以看到,一共写入了五条内容,在打印时只打印了三条,这是因为在默认情况下,当Python的logging模块将日志打印到标准输出中时, 输出的是>=WARNING级别的日志,这就说明默认日志级别就是WARNING(日志级别:CRITICAL>ERROR>WARNING>INFO>DEBUG)。

日志级别含义如下:

  1. DEBUG:调试时的信息打印
  2. INFO:正常的日志信息
  3. WARNING:警告信息,但程序依然正常运行
  4. ERROR:发生错误,程序部分功能已经无法正常运行
  5. CRITICAL:发生严重错误,程序已经崩溃

以上是一个简单的例子,这不足以表明logging模块的强大,因为Python的内值函数也可实现此功能。下面我们来看第二个例子。

        2、将日志信息记录到文件,并将默认的日志级别改成DEBUG:

import logging

logging.basicConfig(filename='log1.log', level='DEBUG')

logging.debug('debug message')
logging.info('info message')
logging.warning('warning message')
logging.error('error message')
logging.critical('critical message')

logging.basicConfig顾名思义是logging模块的基本配置函数,filename:定义日志输出的文件;level:指定日志输出的默认级别

我们可以查看'log1.log'文件,看到日志信息是从DEBUG开始的,并且当我们多次执行脚本时会发现文件中的日志内容是叠加的,说明默认的写入log文件的方式是追加。

3、我们还可以通过对logging模块配置来改变log文件的事件戳和写入方式。例如下面配置: 

import logging

logging.basicConfig(filename='log1.log', level='DEBUG',
format = '%(name)s-->%(asctime)s-->%(message)s',
                    datefmt='%Y-%m-%d %H:%M:%S',  # 定义时间戳
                    filemode='w')  # 指定写入的方式,'w'为覆盖写

logging.debug('debug message')
logging.info('info message')
logging.warning('warning message')
logging.error('error message')
logging.critical('critical message')

文件内容:

root-->2022-11-01 20:50:52-->debug message
root-->2022-11-01 20:50:52-->info message
root-->2022-11-01 20:50:52-->warning message
root-->2022-11-01 20:50:52-->error message
root-->2022-11-01 20:50:52-->critical message

format参数可用的格式化字符串如下 

%(name)s:logging的名字

%(message)s:用户输出的消息

%(asctime)s:输出时间

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

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

%(pathname)s:调用日志输出函数的模块的完整路径名
%(filename)s:调用日志输出函数的模块的文件名

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

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

%(created)f:当前事件;用UNIX标准表示时间的浮点数
%(relative:Created)d输出日志信息时;自logger创建以来的毫秒数

%(thread)d:线程ID

%(threadName)s:线程名可能没有
%(process)d:进程ID可能没有

现在的logging配置基本上已经可以满足我们的日常使用的需求,但还是体现不出logging模块的强大,下面我在介绍以下logging模块的四个基本概念:

logger:日志器(记录器),提供日志接口,供应用代码使用。

handler:处理器,将日志记录发送到合适的目的地。

filter:过滤器,提供一种优雅的方式决定一个日志记录是否发送到handler。

formatter:格式化器,指定日志输出的格式。

import logging

# 创建日志器
logger = logging.getLogger("qingyu")
logger.setLevel("DEBUG")

# 定义日志处理器
cl = logging.StreamHandler()  # 将日志输出到终端
fl = logging.FileHandler("log2.log", mode = "a", encoding = "utf-8")  # 输出日志到文本

# 定义初始化格式 # 定义两个日志布局
fmt1 = ("%(name)s---%(message)s---%(asctime)s")
fmt2 = ("%(lineno)d---%(name)s---%(message)s")

# 创建初始化器
a = logging.Formatter(fmt=fmt1)
b = logging.Formatter(fmt=fmt2)

# 添加处理器格式 将上面创建的初始化器添加
cl.setFormatter(a)
fl.setFormatter(b)

# 将处理器添加到日志器
logger.addHandler(cl)
logger.addHandler(fl)

logger.debug("debug message")
logger.info("debug message")
logger.warning("warning message")
logger.error("error message")
logger.critical("critical message")

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答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: Python中的logging模块是一个优秀的记录日志的方式,可以将程序中任何需要记录的信息输出到特定的位置,如控制台、文件或者网络。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程序提供了一种方便、灵活的日志记录方式,可以帮助开发者更好地了解程序的运行状态,方便地进行调试和问题排查。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值