PYTHON 模块 - logging

1.1 loggin日志模块

用print函数要想同时输出日志信息和时间、所在函数、所在线程等内容是比较困难的。,可以用loggin模块,它是内置的模块。

1.2 日志级别

一共有五个极别,从上到下为由低到高。

日志级别 日志函数 说明
DEBUG debug() 详细的日志信息,主要用于输出调试信息
INFO info() 输出一些关键节点信息,用于确定程序的流程
WARNING warning() 一些不期望的事情发生时输出信息(如磁盘可用空间较低),但是此时程序还正常运行。
ERROR error() 由于严重问题导致某些功能不能正常运行。
CRITICAL critical() 发生严重错误,导致应用程序不通继续运行时的信息
import logging
logging.basicConfig(level=logging.ERROR)  # 基本配置,设置级别为ERROR

logging.debug("这是DEBUG级别信息")
logging.info("这是INFO级别信息")
logging.warning("这是WARNING级别信息")
logging.error("这是ERROR级别信息")
logging.critical("这是CRITICAL级别信息")

输出:

ERROR:root:这是ERROR级别信息
CRITICAL:root:这是CRITICAL级别信息

较低级别的信息就被隐藏了。

我们发现输出的是:root,如果报告是哪个模块输出的信息:

# filename: test/test_log.py
import logging

def test():
    logging.basicConfig(level=logging.ERROR)
    log = logging.getLogger(__name__)  # __name__ 表示当前的模块
    log.debug("这是DEBUG级别信息")
    log.info("这是INFO级别信息")
    log.warning("这是WARNING级别信息")
    log.error("这是ERROR级别信息")
    log.critical("这是CRITICAL级别信息")

调用时:

# filename: main.py
import test.test_log as mylog
mylog.test()

输出:包名和模块名

ERROR:test.test_log:这是ERROR级别信息
CRITICAL:test.test_log:这是CRITICAL级别信息

1.3 日志信息格式化

日志格式参数 说明
%(name)s 日志器名
%(asctime)s 输出日志时间
%(filename)s 包括路径的文件名
%(levelname)s 日志等级
%(funcName)s 函数名
%(processName)s 进程名
%(threadName)s 线程名
%(message)s 输出的信息

设置:basicConfig()函数的format参数即可。

import logging
import time

logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(filename)s - %(funcName)s - %(message)s')
log = logging.getLogger(__name__)
log.debug("这是DEBUG级别信息")
log.info("这是INFO级别信息")
log.warning("这是WARNING级别信息")
log.error("这是ERROR级别信息")
log.critical("这是CRITICAL级别信息")


def funlog():
    log.info('进入funlog函数')
    time.sleep(1)
    log.info('funlog函数执行完毕')


log.info("调用funlog函数...")
funlog()

输出:

2022-12-18 11:56:00,919 - main.py - <module> - 这是INFO级别信息
2022-12-18 11:56:00,919 - main.py - <module> - 这是WARNING级别信息
2022-12-18 11:56:00,919 - main.py - <module> - 这是ERROR级别信息
2022-12-18 11:56:00,919 - main.py - <module> - 这是CRITICAL级别信息
2022-12-18 11:56:00,919 - main.py - <module> - 调用funlog函数...
2022-12-18 11:56:00,919 - main.py - funlog - 进入funlog函数
2022-12-18 11:56:01,920 - main.py - funlog - funlog函数执行完毕

一个递归函数的解析:

import logging

logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(funcName)s > %(message)s')
log = logging.getLogger(__name__)


def add(n: int) -> int:
    log.info(f"调用,n当前值是:{n}")
    if n == 1:
        log.info("递归返回中...")
        return 1
    else:
        value = n + add(n - 1)
        log.info("递归返回中...")
        return value


print(add(5))

输出:

2022-12-18 12:04:49,650 - add > 调用,n当前值是:5
2022-12-18 12:04:49,651 - add > 调用,n当前值是:4
2022-12-18 12:04:49,651 - add > 调用,n当前值是:3
2022-12-18 12:04:49,651 - add > 调用,n当前值是:2
2022-12-18 12:04:49,651 - add > 调用,n当前值是:1
2022-12-18 12:04:49,651 - add > 递归返回中...
2022-12-18 12:04:49,651 - add > 递归返回中...
2022-12-18 12:04:49,651 - add > 递归返回中...
2022-12-18 12:04:49,651 - add > 递归返回中...
2022-12-18 12:04:49,651 - add > 递归返回中...
15

1.4 日志写到文件中

在basicConfig中添加关键字参数:

logging.basicConfig(level=logging.INFO, filename="log.txt", format='%(asctime)s - %(funcName)s > %(message)s')
log = logging.getLogger(__name__)

此时信息会输出到:log.txt中。

注意: 文件名指定的路径必须存在。

1.5 停用日志

loggin.disable(level)

这个方法一般放在import下面

import logging
logging.disable(logging.INFO)
logging.basicConfig(level=logging.INFO, filename="log.txt", format='%(asctime)s - %(funcName)s > %(message)s')
log = logging.getLogger(__name__)


def add(n: int) -> int:
    log.info(f"调用,n当前值是:{n}")
    if n == 1:
        log.info("递归返回中...")
        return 1
    else:
        value = n + add(n - 1)
        log.info("递归返回中...")
        return value


print(add(5))

以上没有日志输出。

posted @ 2022-12-18 12:19  叁只小羊  阅读(47)  评论(0)    收藏  举报