首先,日志记录是一种在程序运行和执行时跟踪程序中事件的方式。Python日志记录模块定义了为python应用程序提供灵活的事件日志记录系统的函数和类。

Python记录模块

在事件发生时记录信息是一项方便的任务,它有助于查看程序执行的模式,所作用的数据以及返回的结果,并且所有这些操作都不会影响程序的实际状态。

请注意,日志通常仅适用于开发人员,并且可以使用许多工具进行可视化。现在让我们研究python日志记录模块的不同方面。

Python记录级别

每个日志消息都分配有一个严重性级别。概括地说,有以下python日志记录级别:

  • 信息:它用于记录有关应用程序生命周期的有用信息,这些日志在正常情况下不会起作用。
  • 警告:当事件可能导致应用程序异常但由我们自己的代码处理时,请使用此日志级别。
  • 错误:任何对程序的正常执行流程具有致命影响但与应用程序状态本身无关的日志消息。
  • 调试:此命令仅用于记录诊断信息,例如系统运行状况,对系统管理员等人员很有用。
  • 致命/严重:这些错误导致应用程序无法正常运行,并需要开发人员/管理员立即进行干预。这也可能意味着某种形式的数据丢失或损坏。

它们或多或少与Java log4j日志记录框架非常相似。

Python记录范例

让我们看看我们可以使用python日志记录模块记录消息的不同方式。

简单记录示例

最简单的日志记录形式只有字符串消息形式。让我们快速看一下示例代码片段: 

import logging
logging.warning("Warning log.")
logging.info("Info log.")

输出将是:

python logger日志写入文件 python系统日志_Python

您是否想知道为什么只有警告级别日志出现在控制台中?这是因为默认的日志记录级别是WARNING

Python日志记录到文件

控制台日志记录非常清楚,但是如果我们想在一天或一周后搜索日志,该怎么办?如果仅将日志收集在一个我们可以运行简单文本操作的地方会更好吗?实际上,我们可以将消息记录到文件而不是控制台。

让我们修改脚本以进行必要的配置:

import logging
 
# Configure file
logging.basicConfig(filename = 'my_logs.log', level = logging.DEBUG)
 
logging.warning("Warning log.")
logging.info("Info log.")
logging.debug("Debug log.")

运行此脚本时,由于所有日志记录都在脚本本身创建的文件中完成,因此我们将不会获得任何输出。其内容如下: 

WARNING:root:Warning log.
INFO:root:Info log.
DEBUG:root:Debug log.

由于我们还将日志级别用作“调试”,因此所有级别的日志都存在于文件中。

不带附加内容的Python记录消息

在最后一个示例中,我们编写了一个简单的脚本将消息记录在文件中。现在,继续并一次又一次地运行相同的脚本。您会注意到该文件附加了消息,并且新日志添加到了最后的内容。这是日志记录模块的默认行为。

要对此进行修改,以使消息作为新文件包含在内,请对配置进行一些小的更改,如下所示:

import logging
 
# Configure file
logging.basicConfig(filename = 'my_logs.log', filemode='w', level = logging.DEBUG)
 
logging.warning("Warning log.")
logging.info("Info log.")
logging.debug("Debug log.")

我们只是添加了一个新属性filemode。现在,多次运行脚本:

python logger日志写入文件 python系统日志_python logger日志写入文件_02

现在,日志文件的内容如下所示:

WARNING:root:Warning log.
INFO:root:Info log.
DEBUG:root:Debug log.

因此,消息仅作为新消息出现。

Python记录格式

当然,当前日志的格式很奇怪!我们将尝试清理消息并放入一些格式。幸运的是,这只是单线配置的问题。让我们快速看一下python日志记录格式示例:

import logging
 
# Configure file
logging.basicConfig(filename='my_logs.log', filemode='w',
                    format='%(levelname)s: %(message)s', level=logging.DEBUG)
 
logging.warning("Warning log.")
logging.info("Info log.")
logging.debug("Debug log.")

现在,在这种情况下,日志文件的内容如下所示:

WARNING: Warning log.
INFO: Info log.
DEBUG: Debug log.

清洁得多吧?

日期时间的Python日志记录配置

当我们知道事件实际发生的时间时,在实际情况下,日志消息会很有用!我们将尝试为消息提供日期和时间戳。同样,这只是单线配置的问题。让我们快速看一下示例代码片段:

import logging
 
# Configure file
logging.basicConfig(filename='my_logs.log', filemode='w',
                    format='%(levelname)s -> %(asctime)s: %(message)s', level=logging.DEBUG)
 
logging.warning("Warning log.")
logging.info("Info log.")
logging.debug("Debug log.")

我们只为添加了一个属性asctime。现在,在这种情况下,日志文件的内容如下所示: 

WARNING -> 2017-12-09 12:56:25,069: Warning log.
INFO -> 2017-12-09 12:56:25,069: Info log.
DEBUG -> 2017-12-09 12:56:25,069: Debug log.

现在变得更加有意义。

Python记录getLogger()

现在,我们直接使用了日志记录模块。为什么不只是获取一个对象并使用它来记录消息。让我们快速看一下示例代码片段:

import logging
 
# Configure file
logging.basicConfig(filename='my_logs.log', filemode='w',
                    format='%(levelname)s -> %(asctime)s: %(message)s', level=logging.DEBUG)
logger = logging.getLogger(__name__)
 
logger.info("Using custom logger.")
shubham = {'name': 'Shubham', 'roll': 123}
logger.debug("Shubham: %s", shubham)

我们仅向添加了一个呼叫getLogger。现在,在这种情况下,日志文件的内容如下所示:

INFO -> 2017-12-09 13:14:50,276: Using custom logger.
DEBUG -> 2017-12-09 13:14:50,276: Shubham: {'name': 'Shubham', 'roll': 123}

显然,我们也可以记录变量值。这将有助于在日志消息中包含有关程序当前状态的更多信息。

Python日志记录配置文件

现在,在多个文件中提供相同的日志记录信息是一个繁琐的过程。我们可以做的是,我们可以将配置集中到一个地方,这样无论何时需要进行任何更改,都只需在一个地方进行。

我们可以通过创建一个配置文件来做到这一点,如下所示:

[loggers]
keys=root,JournalDev
 
[handlers]
keys=fileHandler, consoleHandler
 
[formatters]
keys=myFormatter
 
[logger_root]
level=CRITICAL
handlers=consoleHandler
 
[logger_JournalDev]
level=INFO
handlers=fileHandler
qualname=JournalDev
 
[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=myFormatter
args=(sys.stdout,)
 
[handler_fileHandler]
class=FileHandler
formatter=myFormatter
args=("external_file.log",)
 
[formatter_myFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
datefmt=

这样,我们配置了root和JournalDev记录器,为这两个记录器以及Handlers和格式提供了记录器。现在,我们可以在脚本中使用此记录器文件:

import logging
import logging.config
 
logging.config.fileConfig('logging.conf')
logger = logging.getLogger("JournalDev")
 
logger.info("Custom logging started.")
logger.info("Complete!")

当我们在文件中配置了两个记录器时,我们还将在控制台上看到以下输出:

python logger日志写入文件 python系统日志_python logger日志写入文件_03

这些日志也将出现在一个名为的文件中external_file.log:

2017-12-09 13:52:49,889 - JournalDev - INFO - Custom logging started.
2017-12-09 13:52:49,889 - JournalDev - INFO - Complete!

这样,我们可以使日志记录配置完全分开。

在本课程中,我们学习了python日志记录模块提供的各种功能,并了解了它们如何工作。