我想在我的一个项目中实现一些日志(log).存在两个问题.

第一:如何设置我的日志(log)系统?

第二:我当前的设置日志(log)显示在控制台中,但没有写入文件中(它创建文件,但文件始终为空)

我当前的设置是:

  • 将日志(log)记录的配置写入文件的dict对象中
  • 将该文件导入项目主文件
  • 使用dictConifg函数配置日志(log)记录
  • for each 文件使用getLogger(__name__)来启动记录器
  • 使用该记录器

这种设置是否正确且是最佳实践?

为什么日志(log)记录会创建文件但不将日志(log)写入其中?

这是我的文件:

main.py

import logging.config
from time import sleep
from legging_config import LOGGING_CONFIGS
from something import Something

logging.config.dictConfig(LOGGING_CONFIGS)
logger = logging.getLogger(__name__)
if __name__ == "__main__":
    logger.info("Application started.")
    nothing_1 = Something()
    sleep(1)
    nothing_2 = Something()
    logger.warning("Application finished.")

something.py

import logging
from time import sleep

logger = logging.getLogger(__name__)


class Something:
    def __init__(self) -> None:
        logger.debug("Create something.")
        sleep(1)

LEGING_CONFIG.py

LOGGING_CONFIGS = {
    "version": 1,
    "disable_existing_loggers": False,
    "formatters": {
        "format": {"format": "%(asctime)s - %(name)s - %(levelname)s - %(message)s"}
    },
    "handlers": {
        "console": {
            "class": "logging.StreamHandler",
            "formatter": "format",
            "stream": "ext://sys.stdout",
        },
        "file": {
            "class": "logging.FileHandler",
            "filename": "data/logs/main.log",
            "mode": "a",
            "formatter": "format",
        },
    },
    "loggers": {
        "logger": {
            "handlers": ["console", "file"],
            "level": "DEBUG",
            "propagate": False,
        }
    },
    "root": {"handlers": ["console"], "level": "DEBUG"},
}

控制台输出控制台输出

2024-04-21 09:35:53,469 - __main__ - INFO - Application started.
2024-04-21 09:35:53,470 - something - DEBUG - Create something.
2024-04-21 09:35:55,471 - something - DEBUG - Create something.
2024-04-21 09:35:56,473 - __main__ - WARNING - Application finished.

main.log


推荐答案

首先,您的配置字典中有一个名为logger的记录器,但您正在使用getLogger(__name__)按模块名称获取该记录器.这意味着除非您实际上明确地调用getLogger("logger"),否则不会使用您的logger特定配置.

接下来,您的根记录器被配置为仅使用其DEBUG级别的console处理程序.这意味着根记录器捕获的任何日志(log)或传播到根的任何日志(log)都不会发送到文件处理程序,仅仅因为没有配置任何日志(log).

这些问题加在一起会导致您的日志(log)文件为空,因为您的记录器依赖于传播(这是默认行为,除非您显式将propagate设置为False),而且由于根记录器没有附加file处理程序,因此日志(log)不会被写入文件.

作为修复,只需编辑您的配置以包含file处理程序:

"root": {
    "handlers": ["console", "file"],
    "level": "DEBUG",
}

Python相关问答推荐

我对打乒乓球有问题

使用Python从HTTP打印值

try 使用tensorFlow.keras.models时optree Import错误

当变量也可以是无或真时,判断是否为假

键盘.任务组

添加包含中具有任何值的其他列的计数的列

仅从风格中获取 colored颜色 循环

Odoo 14 hr. emergency.public内的二进制字段

'discord.ext. commanders.cog没有属性监听器'

如何在Python中将returns.context. DeliverresContext与Deliverc函数一起使用?

更改键盘按钮进入'

当从Docker的--env-file参数读取Python中的环境变量时,每个\n都会添加一个\'.如何没有额外的?

如果值发生变化,则列上的极性累积和

利用Selenium和Beautiful Soup实现Web抓取JavaScript表

当点击tkinter菜单而不是菜单选项时,如何执行命令?

用渐近模计算含符号的矩阵乘法

基于形状而非距离的两个numpy数组相似性

基于行条件计算(pandas)

(Python/Pandas)基于列中非缺失值的子集DataFrame

搜索按钮不工作,Python tkinter