官方教程文档 -> 🚪
官方配置文档 -> 🚪
格式属性表 -> 🔎
如何写好日志 -> 🔎
⭐常用名词
关键字 |
描述 |
Logger |
日志记录程序 |
Handler |
处理程序 |
Formatter |
格式化程序 |
CRITICAL |
危险 |
ERROR |
错误 |
WARNING |
警告 |
INFO |
信息 |
DEBUG |
调试 |
🌠先有个印象
日志库采用模块化方法,并提供几类组件:记录器、处理器、过滤器和格式器。
- 记录器暴露了应用程序代码直接使用的接口。
- 处理器将日志记录(由记录器创建)发送到适当的目标。
- 过滤器提供了更精细的附加功能,用于确定要输出的日志记录。(本文不涉及)
- 格式器指定最终输出中日志记录的样式。
🧿最小使用案例
使用根记录器输出日志
简单了解日志输出方式的两种方式和日志输出的等级
import logging
logging.debug('DEBUG') logging.info('INFO') logging.warning('WARNING') logging.error('ERROR') logging.critical('CRITICAL')
|
格式化日志输出
import logging
logging.basicConfig(format='%(asctime)s %(levelname)s: %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p')
logging.warning('再不签到就迟到了!')
|
🌈带点颜色输出
基本使用, 了解3大组件记录器、处理器和格式器之间的关系
import logging
import colorlog
log_colors = { 'DEBUG': 'cyan', 'INFO': 'green', 'WARNING': 'yellow', 'ERROR': 'red', 'CRITICAL': 'bold_red', }
logger = logging.getLogger('logger_main')
console_handler = logging.StreamHandler()
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' )
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)
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: 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' 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 level: DEBUG file: class: logging.handlers.RotatingFileHandler formatter: file level: INFO filename: logconfig.log maxBytes: 52428800 backupCount: 10
loggers: my_logger: 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 更加强大更为易用 -> 🚪