自定义json格式
from loguru import logger
import json
from datetime import datetime
import inspect
# 定义一个函数来创建 JSON 格式的日志
def json_log(level, message, **kwargs):
# 获取当前的堆栈信息
frame = inspect.currentframe()
# 向上追溯到调用者的帧
caller_frame = frame.f_back
# 获取调用者的帧信息
info = inspect.getframeinfo(caller_frame)
# 创建一个包含所有日志信息的字典
log_entry = {
"time": datetime.now().isoformat(),
"level": level.upper(),
"message": message,
"file": info.filename,
"function": info.function,
"line": info.lineno,
"details": kwargs # 将任何额外的关键字参数添加到 details 字典中
}
# 序列化整个字典为 JSON 字符串并记录
logger.log(level, json.dumps(log_entry))
# 设置 Loguru 的配置
logger.add("logs/{time:YYYY-MM-DD}.log", rotation="1 day", retention="10 days", format="{message}")
# 使用 json_log 函数记录不同级别的日志
json_log("ERROR", "This is an error message", error_code=500, user="JaneDoe")
复杂点的
from loguru import logger
# format:表示日志格式化。{level:8}</>表示按照日志级别显示颜色。8表示输出宽度为8个字符。
# colorize: True**:表示显示颜色。
# 当前文件的目录路径
#dir_path = os.path.abspath(os.path.dirname(__file__))
# 日志路径
#log_file_path = os.path.join(dir_path, 'loguru_{time:%Y-%m-%d}.log')
# 配置日志输出到文件,输出最低等级为info,格式自定义
# 设置每天 0 点新创建一个 log 文件:json格式,并发安全
# logger.add(log_file_path, format="{time} {level} {message}", level="INFO",rotation='00:00',encoding='utf-8',enqueue=True)
# logger.debug('debug msg')
# logger.info('info msg')
# 设置超过 500 MB 新创建一个 log 文件:
# logger.add('runtime_{time}.log', rotation="500 MB")
# 设置每隔一个周新创建一个 log 文件:
# logger.add('runtime_{time}.log', rotation='1 week')
# 可以放配置内,这里单独提出来
folder_ = "./"
prefix_ = "loguru-"
rotation_ = "00:00"
retention_ = "7 days"
encoding_ = "utf-8"
backtrace_ = False #记录堆栈
diagnose_ = False #记录诊断信息
# 格式里面添加了process和thread记录,方便查看多进程和线程程序
format_ = '<green>{time:YYYY-MM-DD HH:mm:ss}</green> | <level>{level: <8}</level> ' \
'| <magenta>{process}</magenta>:<yellow>{thread}</yellow> ' \
'| <cyan>{name}</cyan>:<cyan>{function}</cyan>:<yellow>{line}</yellow> - <level>{message}</level>'
# 这里面采用了层次式的日志记录方式,就是低级日志文件会记录比他高的所有级别日志,这样可以做到低等级日志最丰富,高级别日志更少更关键
logger.add(folder_ + prefix_ + "{time:%Y-%m-%d}.log", level="INFO", backtrace=backtrace_, diagnose=diagnose_,
format=format_, colorize=False,
rotation=rotation_, retention=retention_, encoding=encoding_,
filter=lambda record: record["level"].no >= logger.level("INFO").no)
#测试打印日志
logger.info('info msg')