Python 使用 YAML 配置带有颜色输出的loging

这是一篇从基本使用loging模块到带点颜色输出,再到优雅的使用YAML配置日志的学习记录🥳

0%

官方教程文档 -> 🚪
官方配置文档 -> 🚪
格式属性表 -> 🔎
如何写好日志 -> 🔎

⭐常用名词

关键字 描述
Logger 日志记录程序
Handler 处理程序
Formatter 格式化程序
CRITICAL 危险
ERROR 错误
WARNING 警告
INFO 信息
DEBUG 调试

🌠先有个印象

日志库采用模块化方法,并提供几类组件:记录器、处理器、过滤器和格式器。

  • 记录器暴露了应用程序代码直接使用的接口。
  • 处理器将日志记录(由记录器创建)发送到适当的目标。
  • 过滤器提供了更精细的附加功能,用于确定要输出的日志记录。(本文不涉及)
  • 格式器指定最终输出中日志记录的样式。

🧿最小使用案例

使用根记录器输出日志
简单了解日志输出方式的两种方式和日志输出的等级

import logging

# 默认根记录只记录WARNING以上的日志, 所以使用debug和info是不会被输出的
# logging.basicConfig(level=logging.DEBUG) # 配置下日志等级就输出了

# 配置日志文件路径, 会写到文件里
# logging.basicConfig(filename='example.log', level=logging.INFO)

# 调用 根日志记录器 输出(记录等级从高到低)
logging.debug('DEBUG')
logging.info('INFO')
logging.warning('WARNING')
logging.error('ERROR')
logging.critical('CRITICAL')

格式化日志输出

import logging

# format 格式化输出形式
# 使用 datefmt 可以自定义时间输出格式
logging.basicConfig(format='%(asctime)s %(levelname)s: %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p')

logging.warning('再不签到就迟到了!')

🌈带点颜色输出

基本使用, 了解3大组件记录器、处理器和格式器之间的关系

import logging

import colorlog

# 颜色配置
# 可用: black red green yellow blue purple cyan white, 和 bold_**
log_colors = {
'DEBUG': 'cyan',
'INFO': 'green',
'WARNING': 'yellow',
'ERROR': 'red',
'CRITICAL': 'bold_red',
}

# 创建日志记录器
logger = logging.getLogger('logger_main')

# 创建控制台处理器, 会在控制台输出日志
console_handler = logging.StreamHandler()
# 创建文件处理器, 会记录日志到test.log
file_handler = logging.FileHandler(filename='test.log', mode='a', encoding='utf8')

# 设置日志级别
logger.setLevel(logging.DEBUG)
console_handler.setLevel(logging.DEBUG)
file_handler.setLevel(logging.INFO)

# 用指定的格式字符串初始化格式化程序
file_formatter = logging.Formatter(
fmt='[%(asctime)s %(levelname)s] %(filename)s -> %(funcName)s line:%(lineno)d: %(message)s',
datefmt='%Y-%m-%d %H:%M:%S'
)
# 使用 colorlog 的格式化程序
console_formatter = colorlog.ColoredFormatter(
fmt='%(log_color)s[%(asctime)s %(levelname)s] %(message)s',
datefmt='%Y-%m-%d %H:%M:%S',
log_colors=log_colors
)

# 设置格式化程序
console_handler.setFormatter(console_formatter)
file_handler.setFormatter(file_formatter)

# 添加处理器到记录器中
logger.addHandler(console_handler)
logger.addHandler(file_handler)

# 关闭IO流, 非常重要
console_handler.close()
file_handler.close()

# 输出日志
logger.info('一切正常~')
logger.error('报错啦!!')
logger.debug('找bug中...')

# 查看当前处理器
print(logger.handlers)

✨使用YAML配置日志

接触YAML是在搭建博客时, 发现了如此简洁优雅的文件格式, 搭项目时考虑到配置的易用性和易读性, 随即便折腾起来了φ(* ̄0 ̄)

pyyaml官方文档 -> 🚪

conf目录下创建log_conf.yml, 存放配置, 配置最后将转为dist传入到dictConfig()里, 这也是进一步了解logging的过程.

version: 1
# 将信息传播到配置文件的跟日志记录器中
disable_existing_loggers: False

# 格式化器
formatters:
file: # 格式化器id, 自定义
datefmt: '%Y-%m-%d %H:%M:%S'
format: '%(asctime)s.%(msecs)03d|%(levelname)s|[%(process)d,%(thread)d]|[%(filename)s,%(lineno)d,%(funcName)s]|%(message)s'
color:
# 使用特殊键'()'传入格式化器, 下面的配置会作为参数传入, 同理, 处理器、过滤器也支持自定义对象
(): 'colorlog.ColoredFormatter' # => colorlog.ColoredFormatter(**kwargs)
datefmt: '%m-%d %H:%M:%S'
format: '%(white)s%(asctime)s %(reset)s%(log_color)s[%(levelname)s %(process)d]%(reset)s %(cyan)s%(reset)s%(message)s'
log_colors:
DEBUG: cyan
INFO: green
WARNING: yellow
ERROR: red
CRITICAL: bold_red

# 处理程序
handlers:
console:
class: logging.StreamHandler # 这是处理程序类的完整名称
formatter: color # 处理程序所对应格式化器的ID
level: DEBUG # 处理程序的级别
# filters: [allow_foo] # 由处理程序所对应过滤器的ID 组成的列表
file:
class: logging.handlers.RotatingFileHandler
formatter: file
level: INFO
filename: logconfig.log
maxBytes: 52428800 # 1024*1024*50
backupCount: 10

# 日志记录器
loggers:
my_logger:
# level: ERROR # 这里的优先级高
handlers:
- console
- file
# 打开日志记录器
propagate: False


# 根记录器配置
root:
level: DEBUG
handlers:
- consoleversion: 1
# 将信息传播到配置文件的跟日志记录器中
disable_existing_loggers: False

代码部分

import yaml
import logging
import logging.config

LOG_CONF_DIR = r'config/log_conf.yml'
with open(file=LOG_CONF_DIR, mode='r', encoding="utf-8") as f:
log_conf = yaml.load(stream=f, Loader=yaml.FullLoader)

logging.config.dictConfig(config=log_conf)

# 获取日志记录器
logger = logging.getLogger('my_logger')

logger.debug('找bug中...')
logger.info('一切正常~')
logger.error('报错啦!!')

记录流程图

有个印象(~ ̄▽ ̄)~


日志懒人库: loguru 更加强大更为易用 -> 🚪

------------ 已触及底线了 感谢您的阅读 ------------
  • 本文作者: OWQ
  • 本文链接: https://www.owq.world/dfbb4c9/
  • 版权声明: 本站所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处( ̄︶ ̄)↗