Python 日志文件分级导出 json配置logging

json配置文件

{
    "version":1,
    "disable_existing_loggers":false,
    "formatters":{
        "simple":{
            "format":"%(asctime)s - %(filename)s - [line:%(lineno)d] - %(name)s - %(levelname)s - %(message)s",
            "datefmt":"%Y-%m-%d %H:%M:%S"
        }
    },
    "handlers":{
        "console":{
            "class":"logging.StreamHandler",
            "level":"DEBUG",
            "formatter":"simple",
            "stream":"ext://sys.stdout"
        },
        "info_file_handler":{
            "class":"logging.handlers.RotatingFileHandler",
            "level":"INFO",
            "formatter":"simple",
            "filename":"logs/info.log",
            "maxBytes":10485760,
            "backupCount":10,
            "encoding":"utf8"
        },
        "warn_file_handler":{
            "class":"logging.handlers.RotatingFileHandler",
            "level":"WARN",
            "formatter":"simple",
            "filename":"logs/warn.log",
            "maxBytes":10485760,
            "backupCount":10,
            "encoding":"utf8"
        },
        "error_file_handler":{
            "class":"logging.handlers.RotatingFileHandler",
            "level":"ERROR",
            "formatter":"simple",
            "filename":"logs/errors.log",
            "maxBytes":10485760,
            "backupCount":10,
            "encoding":"utf8"
        },
        "fatal_file_handler":{
        "class":"logging.handlers.RotatingFileHandler",
        "level":"FATAL",
        "formatter":"simple",
        "filename":"logs/fatal.log",
        "maxBytes":10485760,
        "backupCount":10,
        "encoding":"utf8"
        }
    },
    "loggers":{
        "my_module":{
            "level":"INFO",
            "handlers":["info_file_handler"],
            "propagate":"no"
        }
    },
    "root":{
        "level":"INFO",
        "handlers":["console","info_file_handler","warn_file_handler","error_file_handler","fatal_file_handler"]
    }
}

 

customlogger

import logging.config
import os
import json


def setup_logging(default_path="logging.json", default_level=logging.INFO, env_key="LOG_CFG"):
    """
    自定义日志模块
    :param default_path: 配置文件路径
    :param default_level: 默认开始记录的日志等级
    :param env_key:
    :return:
    """
    currentdir = os.path.dirname(__file__).replace('\\', '/')   # 获取当前文件的路径
    dirName = currentdir + '/logs/'     # 拼接形成日志记录文件存放地址
    if dirName is not None:
        if not os.path.exists(dirName):
            try:
                os.makedirs(dirName)    # 如果不存在,则创建文件夹
            except Exception as e:
                print(e)
    path = default_path
    value = os.getenv(env_key, None)    #  os.getenv() 不会引发异常,但返回None。os.getenv()  读取环境变量。比如,os.getenv('PATH'),可从环境变量中配置logging.json的地址
    if value:
        path = value
    if os.path.exists(path):
        with open(path, "r") as f:
            config = json.load(f)
            logging.config.dictConfig(config) # 配置logging
    else:
        logging.basicConfig(level=default_level)
    # 日志文件分级输出,给每个handler添加过滤器
    loggers = logging.getLogger()
    for handler in loggers.root.handlers:
        if handler.name == 'console':
            continue
        log_filter = logging.Filter()
        log_filter.filter = get_filter(handler.level)
        handler.addFilter(log_filter)


def get_filter(level): # 配置过滤器日志文件分级导出
    if logging.DEBUG == level:
        return lambda record: record.levelno < logging.INFO
    elif level == logging.INFO:
        return lambda record: record.levelno < logging.WARN
    elif level == logging.WARN:
        return lambda record: record.levelno < logging.ERROR
    elif level == logging.ERROR:
        return lambda record: record.levelno < logging.FATAL
    else:
        return lambda record: record.levelno <= logging.FATAL


setup_logging() #执行logging配置

 

 

测试代码

from customlogger import *


logging.info("test info")
logging.warning("test warning")
logging.error("test error")
logging.fatal("test fatal")

若有错误,敬请指正……

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值