一、背景
在開發(fā)和維護(hù)大型應(yīng)用程序時(shí)嘱吗,日志記錄是至關(guān)重要的玄组。它可以幫我們追蹤問題、監(jiān)控系統(tǒng)狀態(tài)谒麦、分析用戶行為等俄讹。然而,傳統(tǒng)的日志記錄方式存在一些問題绕德,如日志格式不統(tǒng)一患膛、難以集中管理、無法高效地進(jìn)行日志分析等迁匠。
- 統(tǒng)一的日志格式:
通過這個(gè)工具剩瓶,所有的日志都以結(jié)構(gòu)化的JSON格式輸出驹溃。無論是在本地開發(fā)環(huán)境還是在生產(chǎn)環(huán)境中城丧,日志格式都保持一致,便于后續(xù)的解析和分析豌鹤。 - 與EFK棧的無縫集成:
生成的JSON格式日志可以直接被Fluentd解析亡哄,并發(fā)送到Elasticsearch進(jìn)行存儲(chǔ)。通過Kibana布疙,我們可以方便地查看和分析這些日志數(shù)據(jù)蚊惯,實(shí)現(xiàn)日志的集中管理和可視化。這種方式不僅提高了日志管理的效率灵临,還簡化了日志分析的過程截型,使我們能夠更快地發(fā)現(xiàn)和解決問題。
# 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")
# 生產(chǎn)環(huán)境則不輸出日志到控制臺(tái)
if os.environ.get('ENVIRONMENT') == 'production':
logger.remove()
else:
# 保留控制臺(tái)輸出
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
# 創(chuàng)建一個(gè)全局的 logger 實(shí)例
logger = LoggerSingleton().get_logger()