在 Python 中将消息记录到文件和控制台
-
在 Python 中使用
logging
模块向文件和控制台打印日志信息 -
在 Python 中使用
logging
模块向文件和控制台打印日志信息 -
在 Python 中使用
logging
模块将日志消息打印到文件
本教程将介绍一些在 Python 中将调试字符串记录到文件和控制台的方法。
在 Python 中使用 logging
模块向文件和控制台打印日志信息
日志记录是记录系统中发生的各种事件的过程。这些事件可以是输入数据、进程、线程、输出数据、处理过的信息、错误、警告、通知。各种事件被跟踪并存储在日志文件中。logging
模块由 Python 提供,便于程序员记录发生的各种事件。该模块具有特定的类和方法。Loggers
、Handlers
、Filters
和 Formatters
是 logging
模块定义的基本类。
basicConfig()
方法执行基本配置。它使用默认的 Formatter
创建一个 StreamHandler
。然后,它添加到根记录器。日志记录级别以数值表示。有六个日志记录级别:CRITICAL
、ERROR
、WARNING
、INFO
、DEBUG
和 NOTSET
。我们已将日志记录级别设置为下方的 INFO
。因此,将显示或存储 INFO
、WARNING
、ERROR
和 CRITICAL
。
要写入控制台和文件,我们将使用 logging.basicConfig()
,它可以采用参数处理程序并大大简化日志记录设置,尤其是在使用相同的格式化程序设置多个处理程序时。我们使用 FileHandler()
方法写入文件并使用 debug.log
记录所有信息。同样,要写入控制台,我们使用 StreamHandler()
。默认情况下,StreamHandler()
写入标准错误。要写入标准输出,我们导入 sys
模块并将 sys.stdout
显式传递给 StreamHandler()
。
在下面的示例中,日志打印在控制台和文件 debug.log
中。
# python 3.x
import logging
import sys
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s [%(levelname)s] %(message)s",
handlers=[logging.FileHandler("debug.log"), logging.StreamHandler(sys.stdout)],
)
logging.debug("This message is skipped as a level is set as INFO")
logging.info("So should this")
logging.warning("And this, too")
logging.error("Testing non-ASCII character, Ø and ö")
输出:
2021-07-28 14:50:01,348 [INFO] So should this
2021-07-28 14:50:01,349 [WARNING] And this, too
2021-07-28 14:50:01,349 [ERROR] Testing non-ASCII character, Ø and ö
在 Python 中使用 logging
模块向文件和控制台打印日志信息
要使用日志记录并设置基本配置,我们使用 logging.basicConfig()
。然后,我们不使用 print()
,而是调用 logging.{level}(message)
在控制台中显示消息。由于我们在 basicConfig()
设置中将级别配置为 INFO,我们稍后在程序中调用了 logging.info()
。并将字符串中的整个消息传递给 logging.info()
,然后将其显示到控制台。
示例代码:
# python 3.x
import logging
logging.basicConfig(level=logging.INFO)
def area(l, b):
"""Compute the area of a rectangle"""
return l * b
logging.info(
"Area of length: {l} and breadth: {b} is {c}".format(l=3, b=4, c=area(l=3, b=4))
)
输出:
INFO:root:Area of length: 3 and breadth: 4 is 12
在 Python 中使用 logging
模块将日志消息打印到文件
如果我们在一个程序中使用多个模块,那么使用根模块有很大的局限性。这就是为什么我们需要使用 logger.getLogger(name)
方法创建一个新的记录器。
有使用 __name__
变量作为记录器名称的约定。一旦我们创建了一个新的记录器,我们应该记住使用新的 logger.info()
而不是根的 logging.info()
方法来记录我们的所有消息。FileHandler()
用于使我们的自定义记录器登录到不同的文件。在这里,我们将我们的信息记录到 logfile.log
。同样,Formatter()
用于更改我们记录的消息的格式。Formatter
设置在 FileHandler
对象上,而不是直接设置在记录器上。
例如,使用 getLogger()
来创建或获取记录器。然后,使用 setLogger()
方法设置日志级别。将级别设置为 logging.WARNING
。接下来,使用 FileHandler()
方法定义处理程序,使用 Formatter()
方法设置格式化程序。然后,使用 addHandler()
方法将处理程序添加到记录器。最后,写一些消息进行测试。我们可以在文件 log_file.log
中看到日志。
示例代码:
# python 3.x
import logging
logger = logging.getLogger(__name__)
logger.setLevel(logging.WARNING)
handler = logging.FileHandler("log_file.log")
formatter = logging.Formatter(
"%(asctime)s : %(name)s : %(funcName)s : %(levelname)s : %(message)s"
)
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.debug("A debug message")
logger.info("An info message")
logger.warning("There is something wrong")
logger.error("An error has happened.")
logger.critical("Fatal error occured. Cannot continue")
输出:
2021-07-30 11:55:31,047 : __main__ : <module> : WARNING : There is something wrong
2021-07-30 11:55:31,047 : __main__ : <module> : ERROR : An error has happened.
2021-07-30 11:55:31,047 : __main__ : <module> : CRITICAL : Fatal error occured. Cannot continue