Python日志记录
首先,日志记录是一种在程序运行和执行时跟踪程序中事件的方式。
Python日志记录模块定义了为python应用程序提供灵活的事件日志记录系统的函数和类。
Python记录模块
在事件发生时记录信息是一项方便的任务,它有助于查看程序的执行模式,所作用的数据以及返回的结果,并且所有这些操作都不会影响程序的实际状态。
请注意,这些日志通常仅适用于开发人员,并且可以使用许多工具进行可视化。
现在,让我们看一下python日志记录模块的不同方面。
Python记录级别
每个日志消息都分配有一个严重性级别。
广义地说,有以下python日志记录级别:
信息:它用于记录有关应用程序生命周期的有用信息,在正常情况下这些日志不会列出。
警告:当事件可能导致应用程序异常但由我们自己的代码处理时,请使用此日志级别。
错误:任何对程序的正常执行流程致命但与应用程序状态本身无关的日志消息。
调试:此命令仅用于记录诊断信息(例如系统运行状况),对系统管理员等人员很有用。
致命/严重:这些错误迫使应用程序无法正常运行,并且需要开发人员/管理员立即进行干预。
这也可能意味着某种形式的数据丢失或者损坏。
它们或者多或者少与Java log4j日志记录框架非常相似。
Python记录范例
让我们看一下使用python日志记录模块记录消息的不同方法。
简单记录示例
最简单的日志记录形式只有字符串消息形式。
让我们快速看一下示例代码片段:
import logging logging.warning("Warning log.") logging.info("Info log.")
您是否想知道为什么只有警告级别日志出现在控制台中?这是因为默认的日志记录级别是"警告"。
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
。
现在,多次运行脚本:
现在,日志文件的内容如下所示:
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 -> 2016-12-09 12:56:25,069: Warning log. INFO -> 2016-12-09 12:56:25,069: Info log. DEBUG -> 2016-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 -> 2016-12-09 13:14:50,276: Using custom logger. DEBUG -> 2016-12-09 13:14:50,276: Shubham: {'name': 'Shubham', 'roll': 123}
显然,我们也可以记录变量值。
这将有助于在日志消息中包含有关程序当前状态的更多信息。
Python日志记录配置文件
现在,在多个文件中提供相同的日志记录信息是一个繁琐的过程。
我们可以做的是,我们可以将配置集中到一个地方,这样,无论何时需要进行任何更改,都只需要在一个地方进行。
我们可以通过创建一个配置文件来做到这一点,如下所示:
[loggers] keys=root,theitroad [handlers] keys=fileHandler, consoleHandler [formatters] keys=myFormatter [logger_root] level=CRITICAL handlers=consoleHandler [logger_theitroad] level=INFO handlers=fileHandler qualname=theitroad [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和theitroad记录器,为这两个记录器以及Handlers和格式提供了记录器。
现在,我们可以在脚本中使用此记录器文件:
import logging import logging.config logging.config.fileConfig('logging.conf') logger = logging.getLogger("theitroad") logger.info("Custom logging started.") logger.info("Complete!")
当我们在文件中配置了两个记录器时,我们还将在控制台上看到以下输出:
这些日志也将存在于名为" external_file.log"的文件中:
2016-12-09 13:52:49,889 - theitroad - INFO - Custom logging started. 2016-12-09 13:52:49,889 - theitroad - INFO - Complete!
这样,我们可以使日志记录配置完全独立。