借助Python中的日志库使用Log4j

这篇文章解释了什么是log4j ,以及,它是如何工作的,为什么我们应该使用它。我们还将看到如何在Python编程语言中借助于logging 库来使用log4j

Log4j 的概述及其使用的重要性

log4j 是一个被程序员利用的软件,当他们在应用中logging 数据时,可以帮助他们。而且,logging 数据意味着保持应用程序中的活动或行动的日记。

我们可以出于安全原因使用log4j ,比如查看各种认证。但是,它也可以用于保存应用程序中发生的事情的记录,用于调试目的。

或者是为了普遍了解应用程序一直在做什么。例如,log4j 是Java编程语言中的一个框架,是一个半构建的应用程序。

同样,在Python中,我们使用了一个logging 模块,而不是log4jlogging 是将应用程序的动作和状态记录到一个二级接口上的过程。换句话说,把你的程序动作写到一个文件里,但你如何开始记录呢?

好吧,你需要熟悉一下logging 水平。每个logging 库都允许你将信息锁定在某个级别。有五个主要的日志级别,你必须知道。

级别 描述
debug debug 级是在开发过程中或错误修复和故障排除时使用。所有针对开发者的信息都在这个级别下。
info info 级别用于logging 你的程序的任何重要的默认操作,如默认的用户或系统查看操作。
warning warning 级用于logging ,这些事件从长远来看有可能成为一个错误。这个logging 级是为了帮助你追踪错误。
error error level用于记下错误,错误是指可能以某种错误方式影响程序执行的错误。
critical critical 级别是末日;程序已经死亡或严重损坏。

在Python中使用logging 库的帮助下使用Log4j

现在我们只是要运行一个简单的基本代码,并没有这样的逻辑,但我们想向你展示一些理解,比如你如何在一个文件里面写下所有的日志。

让我们跳进代码,首先配置logging 系统,调用basicConfig() 方法,并使用filename 参数传入一个文件名。Python 将把所有的日志信息写到这个文件中;如果它不存在,Python 将创建它。

下面的参数是filemode ,它的意思是文件模式,即是追加模式还是写模式,或者是你放在那里的任何模式,默认情况下,文件将以追加模式创建。下一个是format ,表示很多信息,如asctimelevelname ,和message

asctime 基本上显示了它在这个特定的文本文件里面打印什么样的关于日志的时间。第二个参数值是一个叫做 的东西;这个参数显示我们在执行过程中发生了什么样的错误。levelname

message 是我们要在该日志信息里面打印的所有信息。我们使用的是datefmt ;这个参数将以特定的顺序得到打印的时间。

basicConfig() 函数有一个不同的属性,我们可以从这里阅读所有的属性。

import logging
logging.basicConfig(filename='demo.txt',
                    filemode='a',
                    format='%(asctime)s%(levelname)s-%(message)s',
                    datefmt='%Y-%m-%d %H:%M:%S')

现在我们已经写了一个简单的逻辑,我们将百分位数与一些数字进行比较,并在文本文件中附加一些日志。

for i in range(0,15):
    if i%2==0:
        logging.error('Log error message')
    elif i%3==0:
        logging.warning('Log warning message')
    elif i%5==0:
        logging.debug('Log debug message')
    elif i%7==0:
        logging.critical('Log critical message')
    else:
        logging.info('Log info message')

输出:

2022-09-01 23:21:28 ERROR-Log error message
2022-09-01 23:21:28 ERROR-Log error message
2022-09-01 23:21:28 WARNING-Log warning message
2022-09-01 23:21:28 ERROR-Log error message
2022-09-01 23:21:28 ERROR-Log error message
2022-09-01 23:21:28 CRITICAL-Log critical message
2022-09-01 23:21:28 ERROR-Log error message
2022-09-01 23:21:28 WARNING-Log warning message
2022-09-01 23:21:28 ERROR-Log error message
2022-09-01 23:21:28 ERROR-Log error message
2022-09-01 23:21:28 ERROR-Log error message

运行该程序后,我们可以注意到infodebug 的日志没有被添加到文本文件内,因为在默认情况下,levelname 调用errorerror 的级别不会显示infodebug

然而,我们可以通过使用level 参数,同时传递logging.DEBUG ,来使用其他级别。

level=logging.DEBUG

现在,如果我们运行并打开demo.txt 文件,我们将看到所有的日志信息,但如果我们将日志级别更新为logging.ERROR ,我们将看到errorcritical 的信息。

2022-09-01 23:23:57 ERROR-Log error message
2022-09-01 23:23:57 INFO-Log info message
2022-09-01 23:23:57 ERROR-Log error message
2022-09-01 23:23:57 WARNING-Log warning message
2022-09-01 23:23:57 ERROR-Log error message
2022-09-01 23:23:57 DEBUG-Log debug message
2022-09-01 23:23:57 ERROR-Log error message
2022-09-01 23:23:57 CRITICAL-Log critical message
2022-09-01 23:23:57 ERROR-Log error message
2022-09-01 23:23:57 WARNING-Log warning message
2022-09-01 23:23:57 ERROR-Log error message
2022-09-01 23:23:57 INFO-Log info message
2022-09-01 23:23:57 ERROR-Log error message
2022-09-01 23:23:57 INFO-Log info message
2022-09-01 23:23:57 ERROR-Log error message

让我们来看看一个常见的问题,我们要用任何数字除以0。为了确定这个操作,我们将使用try 块。

如果操作失败,我们将进入except 块内,显示日志错误。

try:
    1/0
except:
    logging.error('Log zero division error occurs')

输出:

2022-09-02 00:29:48 ERROR-Log zero division error occurs

它是一个项目的重要组成部分,因为每当你在一个项目中工作时,你可能不得不写这种logging 机制。

完整的Python代码:

import logging
logging.basicConfig(filename='demo.txt',
                    filemode='w',
                    format='%(asctime)s%(levelname)s-%(message)s',
                    datefmt='%Y-%m-%d %H:%M:%S',
                    level=logging.DEBUG)
# for i in range(0,15):
#     if i%2==0:
#         logging.error('Log error message')
#     elif i%3==0:
#         logging.warning('Log warning message')
#     elif i%5==0:
#         logging.debug('Log debug message') 
#     elif i%7==0:
#         logging.critical('Log critical message')
#     else:
#         logging.info('Log info message')
try:
    1/0
except:
    logging.error('Log zero division error occurs')