本文最初发布在SigNoz Blog上,由Ezzeddin Abdullah撰写。
syslog是计算系统中重要的消息传递协议,该协议用于将系统日志或事件消息发送到特定服务器。在Python中,您可以使用syslog
模块或logging
模块来收集并将系统发送到中央服务器。
记录对于审核和调试软件很重要。您可以将日志记录到运行应用程序中,以帮助监视其本地或系统范围内的行为。在本教程中,我们将学习如何配置Python中的syslog。
我们将使用两个模块:syslog
,一个内置的Python库用于系统记录,而logging
是一个内置的Python库,用于日志记录。只有经过适当的分析以提供可行的见解时,日志才有帮助。在本教程的最后一部分中,我们将演示如何将日志发送到Signoz - 开源日志管理工具。
简要概述什么是syslog
syslog是message logging的标准。它有助于将软件中的消息与软件功能和软件所居住的系统隔离。每个日志消息都是通过A 设施代码以严重性级别发送的。。
设施代码指示正在记录消息的系统类型。系统类型的一些示例包括内核,邮件系统,系统守护程序,and more。
严重性级别描述了该消息从系统发送的严重程度。严重程度水平的一些示例可能是信息,关键,错误,and more。
通常,UNIX系统中的日志存储在the/var/log
目录中。您可以在此文件/var/log/syslog
中找到系统日志。
现在让我们使用syslog
Python模块来研究一些简单的系统示例。
简单的Syslog示例使用syslog
模块
使用Python将日志消息发送到系统的最简单方法是通过内置的syslog模块。
您可以使用simple method syslog.syslog(priority, message)
将消息发送到系统记录器。让我们在下面的示例中看到这一点:
import syslog
syslog.syslog('Sending a log message through syslog_module!')
我命名此文件v01_00syslog.py
。如果您通过terminal python v01_00syslog.py
运行此文件,然后使用grep
探索/var/log/syslog
文件上的内容,您将查看以下输出:
$ cat /var/log/syslog | grep syslog_module
Nov 27 11:14:04 ezz v01_00syslog.py: Sending a log message through syslog_module!
因此,这是指示发送该消息的日期的日志消息。它还指示执行该文件的用户名。此外,它记录文件名和在模块中发送的日志消息。
让我们看到另一个示例,我们可以添加更多的复杂性:
import syslog
syslog.syslog('Sending a log message through syslog_module_v1!')
def divide(dividend, divisor):
try:
syslog.syslog(syslog.LOG_INFO, f"Dividing {dividend} by {divisor}")
return dividend / divisor
except ZeroDivisionError:
syslog.syslog(syslog.LOG_ERR, "Zero Division error.")
print(divide(6, 2))
print(divide(6, 0))
因此,在此示例中,我们开始使用不同的关键字登录(syslog_module_v1
,我们将在系统日志中搜索的单词)。然后,我们使用分区函数返回分配两个数字的结果,如果分区为零,则例外。
第一个syslog.syslog
方法用法将priority
选项分配给syslog.LOG_INFO
,以表明这是一条信息消息。第二个选项是表示划分哪些数字的字符串的消息。
第二个syslog.syslog
方法使用另一个priority
选项,该选项是syslog.LOG_ERR
,以表明这是错误的严重性级别。同样,第二个选项是消息。
然后,我们打印两个功能的结果,一个仅与信息消息合作,另一个与信息和零分部错误一起工作。
让我们运行此脚本,然后使用grep
命令前往syslog
。我们将使用-A
,然后使用3个在匹配的行之后打印3行:
$ cat /var/log/syslog | grep -A 3 syslog_module_v1
Nov 27 11:27:01 ezz v01_01syslog_err.py: Sending a log message through syslog_module_v1!
Nov 27 11:27:02 ezz v01_01syslog_err.py: Dividing 6 by 2
Nov 27 11:27:02 ezz v01_01syslog_err.py: Dividing 6 by 0
Nov 27 11:27:02 ezz v01_01syslog_err.py: Zero Division error.
您可以看到,每个分区案例都存在日志。
通过logging
模块发送python登录
通过本机Python模块logging
,您也可以发送系统日志。它提供了与我们使用的syslog
模块相比,它提供更多的自定义方式来发送日志,但是它更复杂。
让它分解,这样您就很容易跟随。
在logging
模块中,我们将使用SysLogHandler。让我们看看如何使用该处理程序发送系统日志消息:
import logging
from logging.handlers import SysLogHandler
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
handler = SysLogHandler(
facility=SysLogHandler.LOG_DAEMON,
address='/dev/log'
)
logger.addHandler(handler)
logger.debug('Sending a log message through SysLogHandler!')
评论摘要代码:
- 我们首先导入
logging
模块,然后从logging.handlers
导入SysLogHandler
。 -
logger
实例是带有文件名称的记录器对象。 - 设置严重性级别是通过
setLevel
方法完成的。默认情况下,它设置为INFO
级别,而我们将其设置为DEBUG
。 -
handler
对象是SysLogHandler
,其设施向LOG_DAEMON
表示为发送日志的系统。但是,将address
选项分配给/dev/log
,这是用于将消息发送到Syslog的UNIX域插座。 - 然后,我们将Syslog处理程序添加到
logger
对象。 - 最后,我们将消息发送给Syslog。在这种情况下,我们将使用关键字sysloghandler发送调试消息。
如果您运行此脚本并探索syslog
文件,则将查看以下输出:
$ cat /var/log/syslog | grep SysLogHandler
Nov 27 11:51:49 ezz Sending a log message through SysLogHandler!
让我们更自定义,以便我们使用自定义的时间格式记录文件名,以及日志显示在文件中的位置:
import logging
from logging.handlers import SysLogHandler
def main():
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
handler = SysLogHandler(
facility=SysLogHandler.LOG_DAEMON,
address='/dev/log'
)
formatter = logging.Formatter(
fmt="%(asctime)s - %(filename)s:%(funcName)s:%(lineno)d %(levelname)s - '%(message)s'",
datefmt="%Y-%m-%d %H:%M:%S"
)
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.debug('Sending a log message through SysLogHandler_v1!')
if __name__ == '__main__':
main()
评论代码:
- 我们这里有一个包含逻辑的函数。
- 新的是
formatter
对象。在此代码中,我们为此对象分配了两个选项:-
fmt
指示日志的格式字符串。它包含以下内容:-
asctime
要格式化事件的时间是可读的。 -
filename
格式化文件的名称。 -
funcName
格式化具有日志消息的函数名称。 -
lineno
要格式打印日志的行号。 -
levelname
要格式化日志的严重程度。 -
message
格式化我们要发送的日志消息。
-
-
datefmt
指示应如何表示日期时间。它包含以下内容:-
%Y
代表年份。 -
%m
代表这个月。 -
%d
代表这一天。 -
%H
代表小时。 -
%M
代表分钟。 -
%S
代表秒。
-
-
- 用
s
的后缀格式字符串中的每个属性表示它是一个字符串。但是,带有d
后缀的属性表明它是十进制数字(例如,lineno
)。
我命名此文件v02_01sysloghandler_formatter.py
。如果您运行此脚本然后探索Syslog文件,则将查看以下内容:
$ cat /var/log/syslog | grep SysLogHandler_v1
Nov 27 11:57:35 ezz 2022-11-27 11:57:35 - v02_01sysloghandler_formatter.py:main:20 DEBUG - 'Sending a log message through SysLogHandler_v1!'
您可以看到,时间格式的添加方式不同。请注意,它仍然使用Syslog配置中定义的Syslog时间格式进行了预先处理。新的时间格式之后是文件名和函数的名称以及行号。最后,打印了严重性级别,然后是日志消息。
使用Signoz管理系统log
在生产环境中,需要在中央系统中收集。有效的日志管理和分析可以使开发人员见解更快地解决应用程序问题。您可以将系统日志发送到Signoz -开源日志管理工具。
signoz是一个全栈开源APM,您可以用于日志操作。 Signoz使用柱状数据库Clickhouse存储日志,该日志在摄入和存储日志数据方面非常有效。诸如Clickhouse之类的柱状数据库非常有效地存储日志数据并可以进行分析。
在本节中,我们将看到如何配置要发送到signoz的系统。但是在此之前,让我们安装signoz。
安装Signoz
Signoz可以使用简单的安装脚本在MacOS或Linux PC上以三个简单的步骤安装。
Docker引擎由安装脚本自动安装在Linux上。但是,在MacOS上运行设置脚本之前,您必须手动安装Docker Engine。
git clone -b main https://github.com/SigNoz/signoz.git
cd signoz/deploy/
./install.sh
您可以访问文档以获取有关如何使用Docker Swarm和Helm图表安装Signoz的说明。
将系统列出到Signoz
您可以咨询how to collect syslog logs on SigNoz here。对于我们的示例应用程序,让我们看看如何将Syslog发送到Signoz。
现在,让我们获取早期的Python脚本:
import logging
from logging.handlers import SysLogHandler
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
handler = SysLogHandler(
facility=SysLogHandler.LOG_DAEMON,
address='/dev/log'
)
logger.addHandler(handler)
logger.debug('Sending a log message through SysLogHandler!')
运行该脚本后,然后转到Signoz仪表板。如果您是从本地主机运行的,请访问http://localhost:3301/logs
端点,然后搜索诸如sysloghandler'之类的关键字。
您现在可以在仪表板上看到以下内容:
收集的syslog日志可用,分解显示了syslog即将到达
的主机名
来自该日志的严重性(在这种情况下,是调试消息):
如果您想访问我们讨论过的所有摘要代码,则可以访问this GitHub repo。 相关文章