[python]基于文件配置logging

前言

python的logging支持用字典或 configparser 格式文件中读取日志记录配置

参考:https://docs.python.org/3/library/logging.config.html

使用conf文件

下面这个logger.conf文件主要三个部分:loggerhandlersformatters。代码中获取logger的时候,配置文件中[loggers]中必须要有声明。[loggers]中的logger具体配置在[logger_xx]中,比如[loggers]中声明了console,那么console这个logger的配置在[logger_console]中。[logger_xxx]中主要定义日志级别level、日志传播propagate、logger具体名称qualname和日志处理器handlers。其中qualname在简单配置中一般和声明的logger名字保持一致,与propagate组合搭配使用。这两个参数具体配置可以参考官方文档。logger引用的handler也需要在[handlers]中声明,具体配置在[handler_xxx]。handler中用到的formatter同理要在[formatters]中声明,在[formatter_xx]中具体配置。

示例中声明了三个logger,其中root是参考官网的,一般作为默认配置,console用于输出到控制台,file会写入到日志文件。有的项目会命名为devtestprod,dev输出到控制台,test输出到控制台和文件,prod输出到文件。日志文件会rotate,每天rotate一份,并保留30天。日志格式化成json样式。

[DEFAULT]
LOG_DIR = '/app/logs'

[loggers]
keys=root,console,file

[handlers]
keys=consoleHandler,rotatingFileHandler

[formatters]
keys=jsonFormatter

[logger_root]
level=INFO
handlers=consoleHandler


[logger_console]
level=DEBUG
handlers=consoleHandler
propagate=0
qualname=console

[logger_file]
level=INFO
handlers=rotatingFileHandler
propagate=0
qualname=file

[handler_consoleHandler]
class=logging.StreamHandler
args=(sys.stdout,)
level=INFO
formatter=jsonFormatter


[handler_rotatingFileHandler]
class=logging.handlers.TimedRotatingFileHandler
args=(%(LOG_DIR)s + '/app.log', 'midnight', 1, 30)
level=INFO
formatter=jsonFormatter

[formatter_jsonFormatter]
class=logging.Formatter
format={"timestamp": "%(asctime)s", "level": "%(levelname)s", "file": "%(filename)s:%(lineno)d", "message": "%(message)s"}
datefmt=%Y-%m-%dT%H:%M:%S%z

代码中使用

import logging

conf_path = "logger.conf"
logging.config.fileConfig(conf_path)

logger = logging.getLogger("file")

使用dictConfig

logger.config也可以从字典中读取配置,大致流程就是将json、yaml等格式的配置文件读取为字典,然后加载到logger.config。这里以json为例,相关参数基本一致,只是格式不一样。

{
    "version": 1,
    "disable_existing_loggers": false,
    "formatters": {
        "simple": {
            "format": "%(asctime)s - %(levelname)s - %(message)s"
        }
    },
    "handlers": {
        "console": {
            "class": "logging.StreamHandler",
            "level": "DEBUG",
            "formatter": "simple",
            "stream": "ext://sys.stdout"
        },
        "file": {
            "class": "logging.handlers.TimedRotatingFileHandler",
            "filename": "logs/app.log",
            "when": "midnight",
            "interval": 1,
            "backupCount": 7,
            "level": "DEBUG",
            "formatter": "simple"
        }
    },
    "root": {
        "level": "INFO",
        "handlers": [
            "console",
            "file"
        ]
    }
}

代码中使用

import logging
import logging.config
import os
import json

if not os.path.exists("logger.json"):
    raise FileNotFoundError("logger.json not found")
else:
    with open("logger.json", "r") as f:
        log_config = json.load(f)

if not os.path.exists("logs"):
    os.makedirs("logs")

logging.config.dictConfig(log_config)

logger = logging.getLogger("root")

logger.info("info log")
logger.debug("debug log")
logger.warning("warning log")
logger.error("error log")
posted @ 2024-11-02 23:45  花酒锄作田  阅读(55)  评论(0编辑  收藏  举报