资讯专栏INFORMATION COLUMN

Python logging 模块简介

Pandaaa / 2031人阅读

摘要:模块简介的模块提供了灵活的日志处理相关功能可以用来追踪程序运行的情况。模块设置的默认等级时这意味着默认情况下,日志级别为的日志会被记录,而的日志会被忽略。线程安全模块是通过线程锁保证线程安全的。

Logging 模块 简介

Python的 logging 模块提供了灵活的日志处理相关功能, 可以用来追踪程序运行的情况。

logging 模块提供了一系列标准的日志等级: DEBUG, INFO, WARNING, ERROR, CRITICAL, 顾名思义可以大致看出它们各自的使用情况。 logging 模块设置的默认等级时 WARNING, 这意味着默认情况下,日志级别为 WARNING, ERROR, CRITICAL 的日志会被记录,而 DEBUG, INFO 的日志会被忽略。

不同等级的value值如下,只有当value大于 logger 的值才会记录日志。

Level    Value
CRITICAL 50
ERROR    40
WARNING  30
INFO     20
DEBUG    10
UNSET     0
简单输出日志

下面看一个简单的官方文档上的例子:

import logging
logging.warning("Watch out!")  # will print a message to the console
logging.info("I told you so")  # will not print anything

输出如下:

WARNING:root:Watch out!

可以看到info记录的信息没有输出,这是因为默认输出级别不低于WARNING级别的。

输入日志到文件

logging 支持输出日志到文件,参考下面示例:

import logging
logging.basicConfig(filename="example.log",level=logging.DEBUG)
logging.debug("This message should go to the log file")
logging.info("So should this")
logging.warning("And this, too")

其中level是指的记录等级, 输出如下:

DEBUG:root:This message should go to the log file
INFO:root:So should this
WARNING:root:And this, too
几个基本概念 loggers

logger是logging模块提供的日志类 Logger 的实例,它暴露出接口可以直接供程序调用。
每个实例都有一个名字,并且示例间有类之间那种继承关系,根据logger的名字来区分,比如叫"scan"的logger是叫"scan.text"和"scan.html"的父类(没错,他们是以点号错分隔符)。

所有logger共同的父类是 root , 就是上面示例中的中间那个默认的root。 basicConfig 默认的输出格式为: severity:logger name:message

logger的通过 logging.getLogger(name) 来创建,有种在包里命名的惯用做法是:

logger = logging.getLogger(__name__)

这样的好处是可以从logger的名字清楚的看到记录的来源。

handlers 和轮转日志

handlers 承担 logging 模块里负责处理合适的信息到不同的地方的角色,下面通过设置一个RotatingFileHandler来展示handler的特性。

有时候需要创建多个轮转日志,每个日志保存一定长度的内容,最多保留一定数量的日志,其余的丢弃,这种情况下,可以定义 RotatingFileHandler 来实现:

logging_rotatingfile_example.py
import glob
import logging
import logging.handlers

LOG_FILENAME = "logging_rotatingfile_example.out"

# Set up a specific logger with our desired output level
my_logger = logging.getLogger("MyLogger")
my_logger.setLevel(logging.DEBUG)

# Add the log message handler to the logger
handler = logging.handlers.RotatingFileHandler(
    LOG_FILENAME,
    maxBytes=20,
    backupCount=5,
)
my_logger.addHandler(handler)

# Log some messages
for i in range(20):
    my_logger.debug("i = %d" % i)

# See what files are created
logfiles = glob.glob("%s*" % LOG_FILENAME)
for filename in logfiles:
    print(filename)

运行输出如下:

logging_rotatingfile_example.out
logging_rotatingfile_example.out.1
logging_rotatingfile_example.out.2
logging_rotatingfile_example.out.3
logging_rotatingfile_example.out.4
logging_rotatingfile_example.out.5

当日志内容达到定义的 maxBytes 时,会自动重命名文件后加上后缀".1",如果已经存在后续的".1",".2"等则自动重命名他们向后加1,最后最多只保留 backupCount 定义数量的日志文件。

其它有用的handler参见这里。

Formatters 和 个性化输出

Formatters 可以用来控制日志输出的格式,参考下面的示例:

import logging

# create logger
logger = logging.getLogger("simple_example")
logger.setLevel(logging.DEBUG)

# create console handler and set level to debug
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)

# create formatter
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")

# add formatter to ch
ch.setFormatter(formatter)

# add ch to logger
logger.addHandler(ch)

# "application" code
logger.debug("debug message")
logger.info("info message")
logger.warn("warn message")
logger.error("error message")
logger.critical("critical message")

输出如下:

2016-11-27 23:18:51,128 - simple_example - DEBUG - debug message
2016-11-27 23:18:51,128 - simple_example - INFO - info message
2016-11-27 23:18:51,128 - simple_example - WARNING - warn message
2016-11-27 23:18:51,128 - simple_example - ERROR - error message
2016-11-27 23:18:51,128 - simple_example - CRITICAL - critical message

可以看到 %(asctime)s - %(name)s - %(levelname)s - %(message)s 这里对格式化输出的影响。
其中默认的日期时间显示的格式是ISO8601格式, 也可以自定义时间格式,如下面的例子:

import logging
logging.basicConfig(format="%(asctime)s %(message)s", datefmt="%m/%d/%Y %I:%M:%S %p")
logging.warning("is when this event was logged.")

输出:

python test12.py
11/27/2016 11:22:41 PM is when this event was logged.

好有个比较有用的格式化参数时 %(lineno)d, 显示logger调用的时候所处的行数。具体的格式和作用可以参见这里。

其它 logger.exception

ERROR 的等级记录日志,但和 DEBUG 等级一样会输出详细的错误信息,通常用在exception处理中

Filter Object

Filters 是可以被handlers和loggers用来过滤日志的输出的,因为用的不多,具体可参见文档。

线程安全

logging模块是通过线程锁保证线程安全的。

Logging Flow

官方文档上看到的logging流程图,可以帮助理解日志记录流程,参见这里。

从配置文件获取logging的配置

参见这里。

参考资料

https://docs.python.org/2.7/h...

https://pymotw.com/3/logging/...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/44305.html

相关文章

  • Python Tips

    摘要:的三种数据类型字典列表元组,分别用花括号中括号小括号表示。约等于上句,可能是因为自定义变量名与内部函数或变量同名了。下,默认路径一般为。的日志模块中计时器定时器计划任务,。对象的问题怎样忽略警告不打印烦人的警告打印到终端同时记录到文件。 Python Enhancement Proposal。(PEP,Python增强建议书) Python之禅(import this) Pytho...

    Reducto 评论0 收藏0
  • Python标准库---0、简介

    摘要:下一篇文章标准库内置函数标准库语言参考描述了语言的具体语法和语义,这份库参考则介绍了与一同发行的标准库。这个库也包含了内置函数和异常不需要语句就可以在所有代码中使用的对象。下一篇文章标准库内置函数 下一篇文章:Python标准库---1、内置函数 Python 标准库 Python 语言参考 描述了 Python 语言的具体语法和语义,这份库参考则介绍了与 Python 一同发行的标...

    mo0n1andin 评论0 收藏0
  • 学习 python logging(1): 基本用法

    摘要:简介日志在编程中是十分重要,可以帮助我们跟踪事件应用的运行情况查问题统计数据等。在记录日志时,通常表示某件事情的发生。基本使用直接打印运行之后看到的是因为默认等级是所以是不会显示的。 简介 日志在编程中是十分重要,可以帮助我们跟踪事件、应用的运行情况、查问题、统计数据等。在记录日志时,通常表示某件事情的发生。 python 中 logging 模块提供记录的基础方法: debug, i...

    Donne 评论0 收藏0
  • Python 函数式编程、装饰器以及一些相关概念简介

    摘要:重写內建名字空间中的函数闭包闭包是词法闭包的简称。另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。 Python 中的 Decorator(装饰器) 是对一个函数或者方法的封装,从而使其可以完成一些与自身功能无关的工作。 预备知识 一切皆对象 在 Python 中,所有的一切都被视为对象,任何的变量、函数、类等都是 object 的子类。因此除了变量之外,函数和类等也可以...

    Jinkey 评论0 收藏0
  • Python CSV模块简介

    摘要:文件格式是一种通用的电子表格和数据库导入导出格式。这意味着读的时候都认为内容是不被默认引用符包围的。所以非字符串类型的数据会被成字符串存储。使用示例读写其它模块还涉及了其它的概念,比如还提供了供错误处理的等,因为实际使用较少及就不累赘在此。 CSV csv文件格式是一种通用的电子表格和数据库导入导出格式。最近我调用RPC处理服务器数据时,经常需要将数据做个存档便使用了这一方便的格式。...

    不知名网友 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<