一、背景
在开发和维护大型应用程序时,日志记录是至关重要的。它可以帮我们追踪问题、监控系统状态、分析用户行为等。然而,传统的日志记录方式存在一些问题,如日志格式不统一、难以集中管理、无法高效地进行日志分析等。
- 统一的日志格式:
通过这个工具,所有的日志都以结构化的JSON格式输出。无论是在本地开发环境还是在生产环境中,日志格式都保持一致,便于后续的解析和分析。 - 与EFK栈的无缝集成:
生成的JSON格式日志可以直接被Fluentd解析,并发送到Elasticsearch进行存储。通过Kibana,我们可以方便地查看和分析这些日志数据,实现日志的集中管理和可视化。这种方式不仅提高了日志管理的效率,还简化了日志分析的过程,使我们能够更快地发现和解决问题。
# coding:utf-8
# -*- coding: gbk -*-
import os
import sys
from loguru import logger
from resource.ProfileLoad import initialize_environ
# 初始化配置文件
initialize_environ()
def log_filter(level):
"""日志级别过滤器"""
return lambda record: record["level"].name == level
class LoggerSingleton:
_instance = None
def __new__(cls):
if cls._instance is None:
cls._instance = super(LoggerSingleton, cls).__new__(cls)
cls._instance.initialize_logger()
return cls._instance
@classmethod
def initialize_logger(cls):
log_path = os.getenv('LOG_FILE', "D://log")
# 生产环境则不输出日志到控制台
if os.environ.get('ENVIRONMENT') == 'production':
logger.remove()
else:
# 保留控制台输出
logger.add(sys.stderr, level="DEBUG")
# 配置不同级别的日志处理器
for level in ['INFO', 'WARNING', 'ERROR']:
logger.add(
f"{log_path}/{level.lower()}_" + "{time:YYYY-MM-DD}.log",
level=level,
rotation="daily",
serialize=True,
filter=log_filter(level)
)
# 禁止日志传播到父日志记录器
logger.propagate = False
@classmethod
def get_logger(cls):
if not cls._instance:
cls._instance = cls()
return logger
# 创建一个全局的 logger 实例
logger = LoggerSingleton().get_logger()