在 Python 中配置日志记录到 Syslog

Vaibhav Vaibhav 2023年1月30日 2022年5月18日
  1. 使用 Python 中的 Syslog 模块将消息记录到 syslog
  2. 使用 Python 中的 logging 模块将消息记录到 Syslog
在 Python 中配置日志记录到 Syslog

System Logging Protocol 或 Syslog 是用于基于 Unix 的操作系统(例如 macOS 和 Linux)的软件,是消息记录的标准。

Syslog 是一个标准的基于网络的日志记录协议,它允许我们将系统日志和事件消息发送到服务器,称为 Syslog 服务器。该服务从多个不同的独立机器收集日志消息和事件消息,用于分析、监控和评估。

让我们通过一个例子来理解这项服务。

假设你有五台计算机。这五台计算机中的一台是 Syslog 服务器。其他四台计算机是托管四个 Web 应用程序的服务器。这四个 Web 应用程序相互独立,并生成一些日志消息。

这些日志消息包括有关已登录用户、已注销用户、哪个用户访问了哪个页面、在哪个页面发现了什么错误、过去一小时内特定页面访问了多少次、在线事务多少次的详细信息发生在最后一个小时,依此类推。

由于应用程序和日志消息如此之多,跳到单个计算机上并查看它们是一项复杂的任务,因为应用程序的数量可能更多。因此,所有这些应用程序都将它们的消息记录到第五台计算机或 Syslog 服务器。

假设有人希望查看和监控来自多个应用程序的这些日志消息。在这种情况下,他们可以从一个地方做到这一点。

这种策略不仅使审查更容易,而且高效且富有成效。甚至可以开发应用程序来根据他们的品味和要求来审查和监控这些日志消息,或者使用市场上现有的产品。

Python 编程语言是一种通用语言,可以构建现实世界的应用程序。本文将使用 Python 处理将消息记录到 Syslog

使用 Python 中的 Syslog 模块将消息记录到 syslog

我们可以使用 Python 模块 syslog 记录消息。它是 Python 标准库的一部分,充当 Unix syslog 库例程的接口。

这个模块有两个同名的方法,syslog(),可以记录消息。这里用到了函数重载的概念。

以下是这两种方法的函数签名。

syslog.syslog(message)
syslog.syslog(priority, message)

第一种方法接受字符串消息,第二种方法接受字符串消息和优先级。这两种方法都向系统记录器发送字符串消息。

此模块中有八个可用的优先级,按从高到低的顺序排列如下。

  • LOG_EMERG - syslog.LOG_EMERG:用于紧急情况。
  • LOG_ALERT - syslog.LOG_ALERT:用于警报。
  • LOG_CRIT - syslog.LOG_CRIT:用于关键消息。
  • LOG_ERR - syslog.LOG_ERR:用于错误。
  • LOG_WARNING - syslog.LOG_WARNING:用于警告。
  • LOG_NOTICE - syslog.LOG_NOTICE:用于通知。
  • LOG_INFO - syslog.LOG_INFO:用于信息性消息。
  • LOG_DEBUG - syslog.LOG_DEBUG:用于调试消息。

我们现在完成了对该模块的一些简明介绍。让我们通过一个例子来了解如何使用这个模块。请参阅以下 Python 代码。

import syslog

syslog.syslog("A test message.")
syslog.syslog(syslog.LOG_EMERG, "A message with LOG_EMERG priority.")
syslog.syslog(syslog.LOG_ALERT, "A message with LOG_ALERT priority.")
syslog.syslog(syslog.LOG_CRIT, "A message with LOG_CRIT priority.")
syslog.syslog(syslog.LOG_ERR, "A message with LOG_ERR priority.")
syslog.syslog(syslog.LOG_WARNING, "A message with LOG_WARNING priority.")
syslog.syslog(syslog.LOG_NOTICE, "A message with LOG_NOTICE priority.")
syslog.syslog(syslog.LOG_INFO, "A message with LOG_INFO priority.")
syslog.syslog(syslog.LOG_DEBUG, "A message with LOG_DEBUG priority.")
syslog.syslog(syslog.LOG_INFO, "Test message with INFO priority.")

使用 Python 中的 logging 模块将消息记录到 Syslog

Python 还有另一个模块 logging,其中包含通过灵活的事件日志系统帮助应用程序和库的方法和类。

该模块也是 Python 标准库的一部分。logging 模块为事件记录提供了许多功能和灵活性。

logging 模块有一个 Logger 类,其中包含实际日志记录逻辑的实现。开发人员和程序员必须实例化此类以执行日志记录。

请注意,永远不应直接实例化此类。必须使用模块级函数 getLogger()logging.getLogger(name) 来创建记录器。

这里,name 是记录器的名称。Logger 类有许多方法,例如 propogate()setLevel()isEnabledFor()getEffectiveLevel()log()

为了本文的目的,我们将只关注以下方法。

  • debug(msg):一种记录级别 DEBUG 的消息的方法。
  • info(msg):一种记录级别 INFO 的消息的方法。
  • warning(msg):一种记录级别 WARNING 的消息的方法。
  • error(msg):一种记录级别 ERROR 的消息的方法。
  • critical(msg):一种记录级别 CRITICAL 的消息的方法。
  • log(level, msg):一种以指定整数级别记录消息的方法。
  • exception(msg):一种记录级别 ERROR 的消息的方法。
  • addHandler(hdlr):一种将指定处理程序添加到记录器的方法。

该库具有以下日志记录级别及其数值。

  • CRITICAL: 50
  • ERROR40
  • WARNING30
  • INFO20
  • DEBUG10
  • NOTSET: 0

日志模块有一个类 Handler,用于指定日志消息的位置。在上面讨论的 addHandler() 方法的帮助下,Handler 类对象被添加到记录器中。

除了这两个类之外,logging 模块还有两个类,即 FormatterFilterFormatter 类用于定义日志消息的布局和格式,Filter 类用于过滤日志消息。

目前,这就是我们对这些功能的全部了解。

现在我们完成了对 logging 模块的简要介绍;让我们通过示例了解如何使用此模块记录消息。请参阅以下 Python 代码。

import logging
from logging.handlers import SysLogHandler

logger = logging.getLogger("Logger")
handler = SysLogHandler(address = "/var/run/syslog")
logger.addHandler(handler)
logger.debug("A message with level DEBUG.")
logger.info("A message with level INFO.")
logger.warning("A message with level WARNING.")
logger.error("A message with level ERROR.")
logger.critical("A message with level CRITICAL.")
logger.exception("A message with level ERROR.")
logger.log(250, "A message with level 250 numeric value.")

上面的 Python 脚本首先在 getLogger() 方法的帮助下创建了一个记录器,并提供了名称 Logger

接下来,它使用 SysLogHandler 类创建一个处理程序。此类允许开发人员和程序员将日志消息发送到远程或本地 Unix syslog

这个类接受一个参数(三个参数之一),address,它指的是日志消息的目的地。要详细了解这个类,请参考官方文档这里

然后,我们在 addHandler() 方法的帮助下将此处理程序添加到记录器。最后,使用上面讨论的所有日志记录方法,我们记录所有级别的消息,其中一个级别为 250

要了解 logging 模块和 syslog 模块,请分别参阅官方文档 - 这里这里

Vaibhav Vaibhav avatar Vaibhav Vaibhav avatar

Vaibhav is an artificial intelligence and cloud computing stan. He likes to build end-to-end full-stack web and mobile applications. Besides computer science and technology, he loves playing cricket and badminton, going on bike rides, and doodling.

LinkedIn GitHub