Python自动化之日志输出和配置文件的使用

logging.getLogger:创建日志收集器
创建日志收集器时不传name参数,返回默认的收集器(root),传name参数则会创建一个新的日志收集器

import logging

# 创建日志收集器
log = logging.getLogger("Tony")
# 设置日志收集器收集日志的等级
log.setLevel("INFO")

# ①设置输出日志的等级
# 1、创建一个日志输出的渠道(输出到控制台)
sh = logging.StreamHandler()
sh.setLevel("DEBUG")
# 2、将输出渠道绑定到日志收集器上
log.addHandler(sh)

# ②创建一个日志输出到文件
fh = logging.FileHandler('Tony.log', encoding='utf-8')
fh.setLevel("DEBUG")
# 2、将输出渠道绑定到日志收集器上
log.addHandler(fh)

# ③设置日志输出的等级
log_format = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# 设置输出到控制台的日志格式
sh.setFormatter(log_format)
# 设置输出到文件的日志格式
fh.setFormatter(log_format)

封装logging:

import logging

def create_log(name, level='DEBUG', filename="log.log", sh_level='DEBUG'):
    # 第一步:创建日志收集器
    log = logging.getLogger(name)
    # 第二步:设置日志收集器收集日志的等级
    log.setLevel("DEBUG")

    # 第三步:设置日志的输出渠道
    # 3.1、创建一个日志输出的渠道(输出到控制台)
    sh = logging.StreamHandler()
    sh.setLevel("DEBUG")
    # 将输出渠道绑定到日志收集器上
    log.addHandler(sh)

    # 3.2、创建一个日志输出到文件
    fh = logging.FileHandler(filename, encoding='utf-8')
    fh.setLevel("DEBUG")
    # 将输出渠道绑定到日志收集器上
    log.addHandler(fh)

    # 第四步:设置日志输出的等级
    log_format = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    # 设置输出到控制台的日志格式
    sh.setFormatter(log_format)
    # 设置输出到文件的日志格式
    fh.setFormatter(log_format)
    # 返回一个收集器
    return log

通过JSON或者YAML文件配置logging模块

尽管可以在Python代码中配置logging,但是这样并不够灵活,最好的方法是使用一个配置文件来配置。在Python 2.7及以后的版本中,可以从字典中加载logging配置,也就意味着可以通过JSON或者YAML文件加载日志的配置。

通过JSON文件配置

{
    "version":1,
    "disable_existing_loggers":false,
    "formatters":{
        "simple":{
            "format":"%(asctime)s - %(name)s - %(levelname)s - %(message)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":"info.log",
            "maxBytes":"10485760",
            "backupCount":20,
            "encoding":"utf8"
        },
        "error_file_handler":{
            "class":"logging.handlers.RotatingFileHandler",
            "level":"ERROR",
            "formatter":"simple",
            "filename":"errors.log",
            "maxBytes":10485760,
            "backupCount":20,
            "encoding":"utf8"
        }
    },
    "loggers":{
        "my_module":{
            "level":"ERROR",
            "handlers":["info_file_handler"],
            "propagate":"no"
        }
    },
    "root":{
        "level":"INFO",
        "handlers":["console","info_file_handler","error_file_handler"]
    }
}

通过JSON加载配置文件,然后通过logging.dictConfig配置logging

import json
import logging.config
import os
 
def setup_logging(default_path = "logging.json",default_level = logging.INFO,env_key = "LOG_CFG"):
    path = default_path
    value = os.getenv(env_key,None)
    if value:
        path = value
    if os.path.exists(path):
        with open(path,"r") as f:
            config = json.load(f)
            logging.config.dictConfig(config)
    else:
        logging.basicConfig(level = default_level)
 
def func():
    logging.info("start func")
 
    logging.info("exec func")
 
    logging.info("end func")
 
if __name__ == "__main__":
    setup_logging(default_path = "logging.json")
    func()

通过YAML文件配置
通过YAML文件进行配置,比JSON看起来更加简介明了


version: 1
disable_existing_loggers: False
formatters:
        simple:
            format: "%(asctime)s - %(name)s - %(levelname)s - %(message)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: info.log
            maxBytes: 10485760
            backupCount: 20
            encoding: utf8
    error_file_handler:
            class: logging.handlers.RotatingFileHandler
            level: ERROR
            formatter: simple
            filename: errors.log
            maxBytes: 10485760
            backupCount: 20
            encoding: utf8
loggers:
    my_module:
            level: ERROR
            handlers: [info_file_handler]
            propagate: no
root:
    level: INFO
    handlers: [console,info_file_handler,error_file_handler]

通过YAML加载配置文件,然后通过logging.dictConfig配置logging


import yaml
import logging.config
import os
 
def setup_logging(default_path = "logging.yaml",default_level = logging.INFO,env_key = "LOG_CFG"):
    path = default_path
    value = os.getenv(env_key,None)
    if value:
        path = value
    if os.path.exists(path):
        with open(path,"r") as f:
            config = yaml.load(f)
            logging.config.dictConfig(config)
    else:
        logging.basicConfig(level = default_level)
 
def func():
    logging.info("start func")
 
    logging.info("exec func")
 
    logging.info("end func")
 
if __name__ == "__main__":
    setup_logging(default_path = "logging.yaml")
    func()
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值