广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python logging模块
  • 638
分享到

Python logging模块

模块Pythonlogging 2023-01-31 02:01:19 638人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

logging模块是python的一个标准库模块,开发过程中,可以通过该模块,灵活的完成日志的记录。 logging模块提供了两种记录日志的方式:    1)使用logging提供的模块级别的函数(logging.basicConfig,

logging模块是python的一个标准库模块,开发过程中,可以通过该模块,灵活的完成日志的记录。

logging模块提供了两种记录日志的方式:
    1)使用logging提供的模块级别的函数(logging.basicConfig,logging.debug,logging.info...)
    2)使用logging模块的组件(loggers,handlers,filters,fORMatters)

下面会分别介绍这两种方式,这里建议使用第二种方式,使用 logging模块的组件可以更灵活的完成日志记录~

logging模块的日志级别(level)包括:DEBUG,INFO,WARNING,ERROR,CRITICAL~

日志级别(level) 描述
DEBUG 调试级别,一般用于问题的排查,日志的信息最为详细
INFO 仅记录普通的信息,日志信息的详细程度仅次于DEBUG
WARNING 警告信息,一般这类信息不会影响程序的正常运行
ERROR 错误信息, 出现错误信息时,程序一般已不能正常运行
CRITICAL 更严重的错误信息,程序不能继续运行

从 DEBUG 到 CRITICAL,日志等级依次提高,即严重性逐步提升,日志的信息量依次减少:
DEBUG < INFO < WARNING < ERROR < CRITICAL

示例如下:

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     # 默认的日志格式:日志级别 : Logger名称 : 用户输出消息。
ERROR:root:error message
CRITICAL:root:critical message

这里仅输出了大于等于WARNING级别的日志,说明 logging模块 默认的日志级别为WARNING,即日志级别大于等于WARNING的才会被输出,且默认情况下,日志会直接打印到标准输出中~
 
通过 logging模块 的basicConfig函数可灵活地配置日志级别,日志格式以及日志的输出位置:

import logging

logging.basicConfig(level=logging.DEBUG, 
                    format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',                       # 日志格式
                    datefmt='%Y-%m-%d %H:%M:%S',    # 时间格式:2018-11-12 23:50:21
                    filename='/tmp/test.log',    # 日志的输出路径
                    filemode='a')                      # 追加模式

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

程序运行后,日志信息会直接记录到 指定的文件中(/tmp/test.log),且日志级别为DEBUG,所以所有的日志都会被输出,日志信息如下:

➜  ~ cat /tmp/test.log

2018-11-12 23:50:49 test.py[line:9] DEBUG debug message
2018-11-12 23:50:49 test.py[line:10] INFO info message
2018-11-12 23:50:49 test.py[line:11] WARNING warning message
2018-11-12 23:50:49 test.py[line:12] ERROR error message
2018-11-12 23:50:49 test.py[line:13] CRITICAL critical message

 
logging.basicConfig()函数中可通过具体参数来更改logging模块默认行为,可用参数有:

filename:用指定的文件名创建FiledHandler,这样日志会被存储在指定的文件中。
filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”。
format:指定handler使用的日志显示格式。
datefmt:指定日期时间格式。
level:设置rootlogger(后边会讲解具体概念)的日志级别
stream:用指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件(f=open(‘test.log’,’w’)),默认为sys.stderr。若同时列出了filename和stream两个参数,则stream参数会被忽略。
 
format参数中可能用到的格式化串:
%(name)s Logger的名字
%(levelno)s 数字形式的日志级别
%(levelname)s 文本形式的日志级别
%(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
%(filename)s 调用日志输出函数的模块的文件名
%(module)s 调用日志输出函数的模块名
%(funcName)s 调用日志输出函数的函数名
%(lineno)d 调用日志输出函数的语句所在的代码行
%(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示
%(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数
%(asctime)s 字符串形式的当前时间。默认格式是 “2018-11-13 00:00:00,896”。逗号后面的是毫秒
%(thread)d 线程ID。可能没有
%(threadName)s 线程名。可能没有
%(process)d 进程ID。可能没有
%(message)s用户输出的消息

使用logging模块级别的函数记录日志,无法实现将日志输出到多个路径下。这里logging模块提供了4个组件,通过这些组件可实现将日志输出到多个路径下,且每个路径下的日志格式可单独配置~

logging模块中用于记录日志的4大组件

组件名称 功能描述
Logger 日志器,提供了应用程序可一直使用的接口
Handler 将 logger 产生的日志发送到指定的路径下(例如可以是终端,也可以是文件)
Filter 若有多个 Logger,可根据名称过滤出指定的 Logger 来记录日志
Formatter 定义日志格式

logging模块组件的使用

使用组件记录日志的大致步骤如下:
1)logging.getLogger() 获取 logger对象
2)创建一个或多个 handler,用于指定日志信息的输出流向
3)创建一个或多个 formatter,指定日志的格式,并分别将 formatter 绑定到 上
4)将 handler 绑定到 logger对象 上
5)logger.setLevel(logging.DEBUG) 设置日志级别
5)最后便可使用 logger对象 记录日志~
 
示例

import logging

# 获取 logger对象
logger = logging.getLogger()

# 创建一个 handler,用于写入日志文件
fh = logging.FileHandler('/tmp/test.log')

# 再创建一个 handler,用于输出到控制台
ch = logging.StreamHandler()

# 创建一个 formatter,两个 handler 使用相同的日志格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

# 绑定 formatter 到 handler 上
fh.setFormatter(formatter)
ch.setFormatter(formatter)

# 绑定 handler 到 logger对象 上
logger.addHandler(fh) #logger对象可以添加多个fh和ch对象
logger.addHandler(ch)

# 设置日志级别
logger.setLevel(logging.WARNING)

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

查看输出结果:

终端输出:
2018-11-13 23:14:09,161 - root - WARNING - logger warning message
2018-11-13 23:14:09,161 - root - ERROR - logger error message
2018-11-13 23:14:09,161 - root - CRITICAL - logger critical message

文件输出:
➜  ~ cat /tmp/test.log
2018-11-13 23:14:09,161 - root - WARNING - logger warning message
2018-11-13 23:14:09,161 - root - ERROR - logger error message
2018-11-13 23:14:09,161 - root - CRITICAL - logger critical message

也可以通过 handler 来设置日志级别,当使用 handler 来设置日志级别时,存在如下两种情况:
   1)若 handler 设置的日志级别小于等于 logger 的日志级别时,则以logger 的日志级别为准;
   2)若 handler 设置的日志级别大于 logger 的日志级别时,则以handler 的日志级别为准;
简单而言就是,两者同时设置日志级别,以日志级别高的为准。由于不设置 logger 的日志级别,其默认日志级别就是 WARNING,所以不存在 handler 单独设置日志级别的情况~

通过示例来验证:
1)logger 日志级别设置为 DEBUG,logger 不设置(默认为WARNING)

import logging

logger = logging.getLogger()
ch = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

ch.setLevel(logging.DEBUG)
# logger.setLevel(logging.CRITICAL)

ch.setFormatter(formatter)
logger.addHandler(ch)

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

输出结果:
2018-11-13 23:40:13,829 - root - WARNING - logger warning message
2018-11-13 23:40:13,829 - root - ERROR - logger error message
2018-11-13 23:40:13,829 - root - CRITICAL - logger critical message

2)logger 日志级别设置为 CRITICAL,logger 设置为 ERROR

import logging

logger = logging.getLogger()
ch = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

ch.setLevel(logging.CRITICAL)
logger.setLevel(logging.ERROR)

ch.setFormatter(formatter)
logger.addHandler(ch)

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

输出结果:
2018-11-13 23:41:51,279 - root - CRITICAL - logger critical message

filter组件 的使用

filter组件用来过滤 logger 对象,一个 filter 可以直接添加到 logger对象上,也可以添加到 handler 对象上。
 
例如,定义一个filter: filter = logging.Filter('a.b'),当把这个 filter 添加到一个 handler 上,那么绑定了该 handler 的 多个 logger对象中,只有名字是 'a.b' 前缀的才能通过该 handler 输出日志~
 
在 handler 上添加 filter:

import logging

logger1 = logging.getLogger('a.b.c')
logger2 = logging.getLogger('a.c')

# 定义一个 filter
filter = logging.Filter(name='a.b')

# 定义一个 handler
ch = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
ch.setFormatter(formatter)

# 若两个 logger对象 的日志级别相同,且都是用通过一个 handler,可以在这个 handler 上设置日志级别
ch.setLevel(logging.ERROR)

# 在 handler 上放置过滤器
ch.addFilter(filter)

logger1.addHandler(ch)
logger2.addHandler(ch)
logger1.error('logger1 error message')
logger2.error('logger2 error message')

输出结果:
2018-11-15 21:58:33,409 - a.b.c - ERROR - logger1 error message

可以看到 logger2 被过滤,只有 logger1 输出日志~
 
在 handler 上添加 filter:

import logging

logger1 = logging.getLogger('a.b.c')
logger2 = logging.getLogger('a.c')

# 定义一个 filter
filter = logging.Filter(name='a.b')

# 定义一个 handler
ch = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
ch.setFormatter(formatter)

# 若两个 logger对象 的日志级别相同,且都是用通过一个 handler,可以在这个 handler 上设置日志级别
ch.setLevel(logging.ERROR)

# 在 logger 上放置过滤器
logger1.addFilter(filter)
logger2.addFilter(filter)

logger1.addHandler(ch)
logger2.addHandler(ch)
logger1.error('logger1 error message')
logger2.error('logger2 error message')

输出结果一致,即仅有 logger1 输出日志。将 filter 添加到 logger 上,这个filter将直接作用于这个 logger,貌似这么意义不大,很少这样使用

.................^_^

--结束END--

本文标题: Python logging模块

本文链接: https://www.lsjlt.com/news/186256.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python - logging模块
    logging模块两种配置日志输出格式: 1、 输出如下: 2、 第二种方式如下: 注意 logger = logging.getLogger() 不带参数默认是root用户。 logger1 = logging.getL...
    99+
    2023-01-31
    模块 Python logging
  • Python logging模块
    logging模块是Python的一个标准库模块,开发过程中,可以通过该模块,灵活的完成日志的记录。 logging模块提供了两种记录日志的方式:    1)使用logging提供的模块级别的函数(logging.basicConfig,...
    99+
    2023-01-31
    模块 Python logging
  • python logging 模块
    python logging模块   import sys  import logging    #首先获得一个类  logger = logging.getLogger('example') #example为名字 logger.setL...
    99+
    2023-01-31
    模块 python logging
  • python模块--logging
    logging模块                                                                                                               ...
    99+
    2023-01-31
    模块 python logging
  • Python的Logging模块
    1.日志的相关概念🍃 日志是指记录系统或应用程序运行状态、事件和错误信息的文件或数据。在计算机系统中,日志通常用于故障排除、性能分析、安全审计等方面。日志可以记录各种信息,如系统启动...
    99+
    2023-09-17
    服务器 linux python
  • Python 日志模块logging
    logging模块: logging是一个日志记录模块,可以记录我们日常的操作。 logging日志文件写入默认是gbk编码格式的,所以在查看时需要使用gbk的解码方式打开。 logging日志等级:CRITICAL(50) > E...
    99+
    2023-01-30
    模块 日志 Python
  • logging模块
    一 日志级别: CRITICAL = 50 #FATAL = CRITICAL ERROR = 40 WARNING = 30 #WARN = WARNING INFO = 20 DEBUG = 10 NOTSET = 0 #不设置 ...
    99+
    2023-01-30
    模块 logging
  • Python基础之hashlib模块subprocess模块logging模块
    目录一、hashlib模块基本操作与用法二、subprocess模块简介基本操作与用法三、logging模块简介基本操作与用法一、hashlib模块 什么是哈希模块: hashlib...
    99+
    2022-11-11
  • python标准库--logging模块
    logging模块的几个级别,默认情况下Logging模块有6个级别,代码如下#!/usr/bin/env python # coding: utf-8 __author__ = '...
    99+
    2023-01-30
    模块 标准 python
  • python的logging模块详解
    日志级别>>>import logging >>>logging.NOTSET 0 >>>logging.DEBUG 10 >>>logging.INFO 20 >...
    99+
    2023-01-31
    详解 模块 python
  • Python Logging 模块完全解
    Python 中的 logging 模块可以让你跟踪代码运行时的事件,当程序崩溃时可以查看日志并且发现是什么引发了错误。Log 信息有内置的层级——调试(debugging)、信息(informational)、警告(warnings)、错...
    99+
    2023-01-31
    模块 Python Logging
  • python之logging模块使用
    #!/usr/bin/env python # encoding: utf-8 import logging #定义handler的输出格式 formatter=logging.Formatter('%(asctime)s--%(name)...
    99+
    2023-01-31
    模块 python logging
  • python logging模块打印lo
    可能我们经常会使用print来输出信息到窗口,但当我们有很多个py文件需要运行,项目比 较庞大的到时候,print简直就是太low了点了。那么我们可以使用强大的logging模块,把 输出到指定的本地pc某个路径的文件中。 一、 lo...
    99+
    2023-01-31
    模块 python logging
  • Python日志模块logging用法
    一、概述 步骤 创建logger对象创建handler对象创建formatter对象把formatter绑定到handler对象上把handler对象绑定到logger对象上设置级别...
    99+
    2022-11-11
  • 详解 python logging日志模块
    目录1.日志简介2.日志级别3.修改日志级别4.日志记录到文件5.指定日志格式6.记录器(logger)7.处理器(Handler)8.处理器操作9.格式器(formatter)10...
    99+
    2022-11-12
  • python 日志模块logging学习
           在日常项目中,总是需要记录下一些细小信息或者错误码、错误信息的,这个时候就需要进行日志的操作。 python中用于日志创建、设置和记录等功能的模块,就是logging了,下面是对其基本使用方法的介绍: 一、最最...
    99+
    2023-01-31
    模块 日志 python
  • python logging模块按日期打
    官网https://docs.python.org/2/library/logging.html文档 一 简单日志打印: import logging logging.basicConfig(level=logging.DEBUG...
    99+
    2023-01-31
    模块 按日 python
  •  Python中logging模块如何使用
    这篇文章主要讲解了“ Python中logging模块如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ Python中logging模块如何使用”吧!1.为什么要用...
    99+
    2023-06-29
  • python logging日志模块的详解
    python logging日志模块的详解 日志级别 日志一共分成5个等级,从低到高分别是:DEBUG INFO WARNING ERROR CRITICAL。 DEBUG:详细的信息,通常只出现在诊断...
    99+
    2022-06-04
    详解 模块 日志
  • Python 中 logging 模块使用详情
    目录1.为什么要用logging模块2.logging模块介绍3.基础设置1.为什么要用logging模块 在实际应用中,日志文件十分重要,通过日志文件,我们知道程序运行的细节;同时...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作