简单 Python 快乐之旅之:Python 基础语法之日志专题

1. Python 日志示例

日志能够帮助我们监控程序的运行状态。通过日志我们可以看到程序是否引发了什么警告或错误。我们记录时间戳、消息、堆栈等详细信息。
在程序中使用任何日志函数之前,你需要显式地导入 Python 的 logging 库。

import logging
# then some logging statement(s)

以下是 Python 中 logging 库使用的一个例子。

import logging
logging.warning("This is a simple logging example")

执行和输出:
logging 库使用的一个例子.jpg
接下来我们来学习一下日志的不同级别、如何设置日志级别等一些内容。

2. 记录日志消息到日志文件

使用 Python 的 logging 模块,你可以将调试行、信息、警告、错误、严重错误等记录到日志文件,而不只是回显到控制台。
要记录数据到文件中去,使用 logging 的基本配置即可,将日志文件的地址传给 filename 参数。如果该文件不存在,Python 系统将新建这个文件,所以你应该分配该文件所在目录的文件的新建和写入权限给启动该 Python 程序的用户。使用 logging 模块的 basicConfig() 函数来设置 filename 参数的基本语法如下所示。

logging.basicConfig(filename="mylog.log")

你可以根据自己的需要对文件名进行改写。

2.1. 记录 logging 消息到日志文件

在接下来的示例中,我们将使用 basicConfig() 函数设置 logging 配置,记录消息到一个名为 mylog.log 的外部文件。如果不提供完整路径的话,该文件将会在程序的执行目录下创建。

# Python Example for Logging Messages to Log File
import logging
logging.basicConfig(filename="mylog.log")
logging.warning("This is a WARNING message")
logging.error("This is an ERROR message")
logging.critical("This is a CRITICAL message")

执行和输出:
记录 logging 消息到日志文件.png
查看当前程序目录,发现有新文件 mylog.log 生成:
mylog.log 日志文件生成.png
查看其内容:
查看 mylog.log 内容.png
可见 logging 消息已追加到了该文件。

2.3. 使用 handler 记录 logging 消息到日志文件的例子

本示例在上小节例子的基础上做了改进,使用了 handler 来处理日志文件的写入。

# Python Example for Logging Messages to Log File using Handler
import logging
# create a logger
logger = logging.getLogger("mylogger")
handler = logging.FileHandler("mylog.log")
logger.addHandler(handler)
logger.warning("This is a WARNING message by handler")
logger.error("This is an ERROR message by handler")
logger.critical("This is a CRITICAL message by handler")

执行和输出:
使用 handler 记录 logging 消息到日志文件的例子.png
再次查看日志文件:
handler 使用执行和输出后的日志.png
logging 消息已追加到了该日志文件中,只是格式上与上小节中的略有不同。

3. 打印 DEBUG 级别的日志

要使用 logging 打印一行 DEBUG 级别的日志,

  • 检查日志级别是否至少是 DEBUG
  • 使用 logging.debug() 方法,将消息作为参数传递给它,以将 DEBUG 行日志打印到控制台或日志文件。

logging 级别设置为 DEBUG 以后,logging 将会把 DEBUG 行打印到控制台或日志文件。
当你设置 logging 级别为 INFOWARNINGERRORCRITICAL 时,DEBUG 行将不被写到日志文件。
logging 级别的次序为:

DEBUG < INFO < WARNING < ERROR < CRITICAL

3.1. 打印 DEBUG 行的例子

在本示例中,我们将导入 logging 模块,将日志级别设置为 DEBUG,然后使用 debug() 方法来打印一个 DEBUG 行。

# Example to log DEBUG lines
import logging
# create a logger
logger = logging.getLogger("mylogger")
# set logging level
logger.setLevel(logging.DEBUG)
handler = logging.FileHandler("mylog.log")
# create a logging format
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
handler.setFormatter(formatter)
logger.addHandler(handler)
# write a debug message
logger.debug("This is a debug message")

执行该程序后查看 mylog.log
打印 DEBUG 行的例子.png

3.2. 只记录 DEBUG 行的示例

你还可以对 handler 进行过滤以只打印 DEBUG 行到日志文件中。

# Example to log only DEBUG Lines using Python Logger
import logging
class MyFilter(object):
    def __init__(self, level):
        self.__level = level
    def filter(self, logRecord):
        return logRecord.levelno <= self.__level
# create a logger
logger = logging.getLogger("mylogger")
logger.setLevel(logging.DEBUG)
handler = logging.FileHandler("mylog.log")
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
handler.setFormatter(formatter)
# set filter to log only DEBUG lines
handler.addFilter(MyFilter(logging.DEBUG))
logger.addHandler(handler)
# write a debug line to log file
logger.debug("This is a DEBUG message")
logger.info("This is a INFO message")
logger.warning("This is a WARNING message")
logger.error("This is an ERROR message")
logger.critical("This is a CRITICAL message")

执行该程序后查看 mylog.log
只记录 DEBUG 行的示例.png

4. logging INFO 行

要使用 Python logging 打印 INFO 行,

  • 检查 logger 级别是否至少是 INFO
  • 使用 logging.info() 方法,将消息作为参数传递给它,以将 INFO 行日志打印到控制台或日志文件。

logging 级别设置为 INFODEBUG 以后,logging 将会把 INFO 行打印到控制台或日志文件。
当你设置 logging 级别为 WARNINGERRORCRITICAL 时,INFO 行将不被写到日志文件。
logging 级别的次序为:

DEBUG < INFO < WARNING < ERROR < CRITICAL

4.1. 打印 INFO 行的例子

在本示例中,我们将导入 logging 模块,将日志级别设置为 INFO,然后使用 info() 方法来打印一个 INFO 行。

# Example to log INFO lines
import logging
# create a logger
logger = logging.getLogger("mylogger")
# set logging level
logger.setLevel(logging.INFO)
handler = logging.FileHandler("mylog.log")
# create a logging format
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
handler.setFormatter(formatter)
logger.addHandler(handler)
# write a info message
logger.info("This is a INFO message")

执行该程序后查看 mylog.log
打印 INFO 行的例子.png

4.2. 只记录 INFO 行的示例

你还可以对 handler 进行过滤以只打印 INFO 行到日志文件中。

# Example to log only INFO Lines using Python Logger
import logging
class MyFilter(object):
    def __init__(self, level):
        self.__level = level
    def filter(self, logRecord):
        return logRecord.levelno == self.__level
# create a logger
logger = logging.getLogger("mylogger")
logger.setLevel(logging.INFO)
handler = logging.FileHandler("mylog.log")
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
handler.setFormatter(formatter)
# set filter to log only INFO lines
handler.addFilter(MyFilter(logging.INFO))
logger.addHandler(handler)
# write a INFO line to log file
logger.debug("This is a DEBUG message")
logger.info("This is a INFO message")
logger.warning("This is a WARNING message")
logger.error("This is an ERROR message")
logger.critical("This is a CRITICAL message")

执行该程序后查看 mylog.log
只记录 INFO 行的示例.png

5. logging WARNING 行

要使用 Python logging 打印 WARNING 行,

  • 检查 logger 级别是否至少是 WARNING
  • 使用 logging.warning() 方法,将消息作为参数传递给它,以将 WARNING 行日志打印到控制台或日志文件。

logging 级别设置为 WARNINGINFODEBUG 以后,logging 将会把 WARNING 行打印到控制台或日志文件。
当你设置 logging 级别为 ERRORCRITICAL 时,WARNING 行将不被写到日志文件。
logging 级别的次序为:

DEBUG < INFO < WARNING < ERROR < CRITICAL

5.1. 打印 WARNING 行的例子

在本示例中,我们将导入 logging 模块,将日志级别设置为 WARNING,然后使用 warning() 方法来打印一个 WARNING 行。

# Example to log WARNING lines
import logging
# create a logger
logger = logging.getLogger("mylogger")
# set logging level
logger.setLevel(logging.WARNING)
handler = logging.FileHandler("mylog.log")
# create a logging format
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
handler.setFormatter(formatter)
logger.addHandler(handler)
# write a warning message
logger.warning("This is a WARNING message")

执行该程序后查看 mylog.log
打印 WARNING 行的例子.png

5.2. 只记录 WARNING 行的示例

你还可以对 handler 进行过滤以只打印 WARNING 行到日志文件中。

# Example to log only WARNING Lines using Python Logger
import logging
class MyFilter(object):
    def __init__(self, level):
        self.__level = level
    def filter(self, logRecord):
        return logRecord.levelno == self.__level
# create a logger
logger = logging.getLogger("mylogger")
logger.setLevel(logging.WARNING)
handler = logging.FileHandler("mylog.log")
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
handler.setFormatter(formatter)
# set filter to log only WARNING lines
handler.addFilter(MyFilter(logging.WARNING))
logger.addHandler(handler)
# write a WARNING line to log file
logger.debug("This is a DEBUG message")
logger.info("This is a INFO message")
logger.warning("This is a WARNING message")
logger.error("This is an ERROR message")
logger.critical("This is a CRITICAL message")

执行该程序后查看 mylog.log
只记录 WARNING 行的示例.png

6. logging ERROR 行

要使用 Python logging 打印 ERROR 行,

  • 检查 logger 级别是否至少是 ERROR
  • 使用 logging.error() 方法,将消息作为参数传递给它,以将 ERROR 行日志打印到控制台或日志文件。

logging 级别设置为 ERRORWARNINGINFODEBUG 以后,logging 将会把 ERROR 行打印到控制台或日志文件。
当你设置 logging 级别为 CRITICAL 时,WARNING 行或更低级别将不被写到日志文件。
logging 级别的次序为:

DEBUG < INFO < WARNING < ERROR < CRITICAL

6.1. 打印 ERROR 行的例子

在本示例中,我们将导入 logging 模块,将日志级别设置为 ERROR,然后使用 warning() 方法来打印一个 ERROR 行。

# Example to log ERROR lines
import logging
# create a logger
logger = logging.getLogger("mylogger")
# set logging level
logger.setLevel(logging.ERROR)
handler = logging.FileHandler("mylog.log")
# create a logging format
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
handler.setFormatter(formatter)
logger.addHandler(handler)
# write an error message
logger.error("This is an ERROR message")

执行该程序后查看 mylog.log
打印 ERROR 行的例子.png

6.2. 只记录 ERROR 行的示例

你还可以对 handler 进行过滤以只打印 ERROR 行到日志文件中。

# Example to log only ERROR Lines using Python Logger
import logging
class MyFilter(object):
    def __init__(self, level):
        self.__level = level
    def filter(self, logRecord):
        return logRecord.levelno == self.__level
# create a logger
logger = logging.getLogger("mylogger")
logger.setLevel(logging.ERROR)
handler = logging.FileHandler("mylog.log")
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
handler.setFormatter(formatter)
# set filter to log only ERROR lines
handler.addFilter(MyFilter(logging.ERROR))
logger.addHandler(handler)
# write a ERROR line to log file
logger.debug("This is a DEBUG message")
logger.info("This is a INFO message")
logger.warning("This is a WARNING message")
logger.error("This is an ERROR message")
logger.critical("This is a CRITICAL message")

执行该程序后查看 mylog.log
只记录 ERROR 行的示例.png

7. logging CRITICAL 行

要使用 Python logging 打印 CRITICAL 行,

  • 检查 logger 级别是否至少是 CRITICAL
  • 使用 logging.critical() 方法,将消息作为参数传递给它,以将 CRITICAL 行日志打印到控制台或日志文件。

logging 级别设置为 CRITICALERRORWARNINGINFODEBUG 以后,logging 将会把 CRITICAL 行打印到控制台或日志文件。
当你设置 logging 级别为 CRITICAL 时,ERROR 行或更低级别将不被写到日志文件。
logging 级别的次序为:

DEBUG < INFO < WARNING < ERROR < CRITICAL

7.1. 打印 CRITICAL 行的例子

在本示例中,我们将导入 logging 模块,将日志级别设置为 CRITICAL,然后使用 critical() 方法来打印一个 CRITICAL 行。

# Example to log CRITICAL lines
import logging
# create a logger
logger = logging.getLogger("mylogger")
# set logging level
logger.setLevel(logging.CRITICAL)
handler = logging.FileHandler("mylog.log")
# create a logging format
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
handler.setFormatter(formatter)
logger.addHandler(handler)
# write an CRITICAL message
logger.critical("This is a CRITICAL message")

执行该程序后查看 mylog.log
打印 CRITICAL 行的例子.png

参考资料

©️2020 CSDN 皮肤主题: 创作都市 设计师:CSDN官方博客 返回首页