一、从一个使用场景开始
开发一个日志系统, 既要把日志输出到控制台, 还要写入日志文件
import logging
# 创建一个logger
logger = logging.getLogger('mylogger')
logger.setLevel(logging.DEBUG)
# 创建一个handler,用于写入日志文件
fh = logging.FileHandler('test.log')
fh.setLevel(logging.DEBUG)
# 再创建一个handler,用于输出到控制台
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
# 定义handler的输出格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
ch.setFormatter(formatter)
# 给logger添加handler
logger.addHandler(fh)
logger.addHandler(ch)
# 记录一条日志
logger.info('foorbar')
运行后, 在控制台和日志文件都有一条日志:
2011-08-31 19:18:29,816 - mylogger - INFO - foorbar
二、logging模块的API
结合上面的例子,我们说下几个最常使用的API
logging.getLogger([name])
返回一个logger实例,如果没有指定name,返回root logger。
只要name相同,返回的logger实例都是同一个而且只有一个,即name和logger实例是
一一对应的。这意味着,无需把logger实例在各个模块中传递。只要知道name,就能得到
同一个logger实例
Logger.setLevel(lvl)
设置logger的level, level有以下几个级别:
NOTSET < DEBUG < INFO < WARNING < ERROR < CRITICAL
如果把looger的级别设置为INFO, 那么小于INFO级别的日志都不输出, 大于等于INFO级
别的日志都输出
logger.debug("foobar") # 不输出
logger.info("foobar") # 输出
logger.warning("foobar") # 输出
logger.error("foobar") # 输出
logger.critical("foobar") # 输出
Logger.addHandler(hdlr)
logger可以雇佣handler来帮它处理日志, handler主要有以下几种:
StreamHandler: 输出到控制台
FileHandler: 输出到文件
handler还可以设置自己的level以及输出格式。
logging.basicConfig([**kwargs])
* 这个函数用来配置root logger, 为root logger创建一个StreamHandler,
设置默认的格式。
* 这些函数: logging.debug()、logging.info()、logging.warning()、
logging.error()、logging.critical() 如果调用的时候发现root logger没有任何
handler, 会自动调用basicConfig添加一个handler
* 如果root logger已有handler, 这个函数不做任何事情
使用basicConfig来配置root logger的输出格式和level:
import logging
logging.basicConfig(format='%(levelname)s:%(message)s', level=logging.DEBUG)
logging.debug('This message should appear on the console')
三、关于root logger以及logger的父子关系
前面多次提到root logger, 实际上logger实例之间还有父子关系, root logger就是处于
最顶层的logger, 它是所有logger的祖先。如下图:
root logger是默认的logger
如果不创建logger实例, 直接调用logging.debug()、logging.info()logging.warning()、logging.error()、logging.critical()这些函数,
那么使用的logger就是 root logger, 它可以自动创建,也是单实例的。
如何得到root logger
通过logging.getLogger()或者logging.getLogger("")得到root logger实例。
默认的level
root logger默认的level是logging.WARNING
如何表示父子关系
logger的name的命名方式可以表示logger之间的父子关系. 比如:
parent_logger = logging.getLogger('foo')
child_logger = logging.getLogger('foo.bar')
什么是effective level
logger有一个概念,叫effective level。 如果一个logger没有显示地设置level,那么它就
用父亲的level。如果父亲也没有显示地设置level, 就用父亲的父亲的level,以此推....
最后到达root logger,一定设置过level。默认为logging.WARNING
child loggers得到消息后,既把消息分发给它的handler处理,也会传递给所有祖先logger处理,
来看一个例子
import logging
# 设置root logger
r = logging.getLogger()
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
ch.setFormatter(formatter)
r.addHandler(ch)
# 创建一个logger作为父亲
p = logging.getLogger('foo')
p.setLevel(logging.DEBUG)
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(message)s')
ch.setFormatter(formatter)
p.addHandler(ch)
# 创建一个孩子logger
c = logging.getLogger('foo.bar')
c.debug('foo')
输出如下:
2011-08-31 21:04:29,893 - foo
2011-08-31 21:04:29,893 - DEBUG - foo
可见, 孩子logger没有任何handler,所以对消息不做处理。但是它把消息转发给了它的父
亲以及root logger。最后输出两条日志。
- 大小: 2 KB
- 大小: 10.1 KB
分享到:
相关推荐
### Python的logging模块详解 #### 一、简介与应用场景 在进行Python开发时,日志模块是必不可少的一部分,尤其对于大型或复杂的项目来说更是如此。Python内置的`logging`模块提供了一种简单且灵活的方式来记录...
logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级、日志保存路径、日志文件回滚等;相比print,具备如下优点: 可以通过设置不同的日志等级,在release版本中只输出重要信息,而...
1. **使用`QueueHandler`和`QueueListener`**:Python的`logging.handlers`模块提供了`QueueHandler`和`QueueListener`,它们允许进程通过消息队列传递日志事件。主进程可以监听队列并将其写入日志文件,而其他子...
python logging模块主要是python提供的通用日志系统,使用的方法其实挺简单的,这块就不多介绍。下面主要会讲到在使用python logging模块的时候,涉及到多个python文件的调用,而每个文件设置了对应的logging方式...
Python的`logging`模块是Python标准库的一部分,专门用于处理日志记录。 首先,日志的作用非常多样,它可以记录程序运行的调试信息、普通的系统信息、警告信息、错误信息和严重错误信息。通过分析日志,我们可以...
Python的logging模块是用于处理程序运行过程中的日志记录,它提供了一种灵活且强大的方式来跟踪应用程序的行为。本文将深入探讨logging模块中的handlers,这是日志处理的核心组件,它们负责将日志信息发送到不同的...
文章详细讲述了如何使用Python自建logging模块,包括其基本功能的体验、日志级别的机制、基础类的组成等知识点。 首先,介绍logging模块的基本使用方法。通过简单的代码示例,展示了如何设置日志器logger,并输出...
转载于https://www.cnblogs.com/Nicholas0707/p/9021672.html,支持正版
最后,要强调的是,在使用Python logging模块时,应当注意日志级别和输出的详细程度。因为日志级别低的记录(如DEBUG级别)在生产环境中通常不被记录,因此为了避免不必要的性能损失,应当根据实际情况调整日志级别...
在Python中,logging模块是一个强大的日志记录工具,它允许用户将程序运行期间产生的日志信息输出到控制台或者写入到文件中。在大型项目中,将日志信息记录到文件中是非常重要的,因为它可以帮助开发人员或者运维...
### Python logging模块封装实现原理详解 #### 一、引言 在软件开发过程中,日志记录是一项非常重要的功能。它不仅能够帮助开发者更好地理解和调试代码,还能为运维人员提供系统运行状态的重要信息。Python自带的...
Python的logging模块是用于生成日志的工具,它在软件开发中扮演着至关重要的角色,尤其是在调试和维护阶段。本文将深入解析logging模块的工作原理,并介绍如何在实际应用中使用它。 首先,我们要了解logging模块的...
在Python编程中,logging模块是用于生成日志的标准库,它提供了灵活的日志记录功能,包括不同级别的日志(如DEBUG、INFO、WARNING、ERROR、CRITICAL)以及日志输出到控制台、文件或其他处理器的能力。然而,有时我们...
Python Logging是Python标准库中的一个日志记录系统,它允许开发者在软件应用中记录各种级别的日志。Filter是Logging模块中用于控制记录...希望本文能够帮助大家更好地理解和使用Python Logging模块中的Filter功能。
本文将详细介绍如何使用 Python 的 `logging` 模块来记录不同级别的日志,并通过示例演示如何实现日志文件的自动分割。 #### 一、Python Logging 模块简介 `logging` 是 Python 内置的一个用于日志记录的标准库。...
在Python编程中,`logging`模块是一个强大的日志记录工具,用于收集和记录程序运行过程中的信息。然而,当我们在使用`logging`模块处理包含中文字符的日志时,可能会遇到乱码的问题。这个问题通常出现在两个方面:一...
logging.basicConfig()函数中的具体参数含义 filename:指定的文件名创建FiledHandler,这样日志会被存储在指定的文件中; filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“w”还可指定为“a...
logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级、日志保存路径、日志文件回滚等;相比print,具备如下优点: 1.可以通过设置不同的日志等级,在release版本中只输出重要信息,...