python:日志记录不写入文件并询问登录多文件项目的最佳实践

问题描述 投票:0回答:1

我想在我的一个项目中实现一些日志。存在两个问题。

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

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

我当前的设置是:

  • 将日志记录的配置写入文件中的字典对象中
  • 将该文件导入到项目的主文件中
  • 使用
    dictConifg
    功能配置日志记录
  • 使用
    getLogger(__name__)
    为每个文件启动记录器
  • 使用该记录器

此设置正确且是最佳实践吗?

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

这是我的文件:

主.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.")

某事.py

import logging
from time import sleep

logger = logging.getLogger(__name__)


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

legging_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.

主.日志


python file logging
1个回答
0
投票

您在配置字典中配置了一个名为

logger
的记录器,但您使用
getLogger(__name__)
按模块名称获取记录器。这意味着您对
logger
的特定配置不会被使用,除非您实际上明确调用
getLogger("logger")

您的根记录器配置为仅在其

console
级别使用
DEBUG
处理程序。这意味着根记录器捕获的任何日志或传播到根的任何记录器都不会发送到文件处理程序。

这些问题一起导致您的日志文件为空,因为您的记录器依赖于传播(默认行为,除非您明确将

propagate
设置为
False
),并且由于根记录器没有附加
file
处理程序,日志不会写入文件。

© www.soinside.com 2019 - 2024. All rights reserved.