1.安装依赖
pip install loguru
2.log_config.py
from loguru import logger
import os
from datetime import datetime, timedelta
def setup_rotating_logger():
log_dir = "logs"
os.makedirs(log_dir, exist_ok=True)
# 从环境变量获取控制台日志级别,默认为INFO
console_log_level = os.getenv("CONSOLE_LOG_LEVEL", "INFO").upper()
valid_levels = ["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"]
if console_log_level not in valid_levels:
console_log_level = "INFO" # 如果环境变量值无效,使用默认值
# 固定日志文件名
current_log = os.path.join(log_dir, "app.log")
# 错误日志固定文件名
error_log = os.path.join(log_dir, "error.log")
# 历史日志文件名格式
history_pattern = os.path.join(log_dir, "app_{}.log")
error_history_pattern = os.path.join(log_dir, "error_{}.log")
# 移除默认输出
logger.remove()
# 自定义处理常规日志的sink(含每日归档)
def rotating_sink(message):
now = datetime.now()
yesterday = now - timedelta(days=1)
yesterday_str = yesterday.strftime("%Y%m%d")
# 处理常规日志归档
if os.path.exists(current_log):
file_mtime = datetime.fromtimestamp(os.path.getmtime(current_log))
if file_mtime.date() == yesterday.date():
history_log = history_pattern.format(yesterday_str)
if not os.path.exists(history_log):
os.rename(current_log, history_log)
# 移除logger调用以避免死锁,改为直接打印到控制台
print(f"常规日志已归档至: {history_log}")
# 写入当前常规日志
with open(current_log, "a", encoding="utf-8") as f:
f.write(message)
# 自定义处理错误日志的sink(含每日归档)
def error_rotating_sink(message):
now = datetime.now()
yesterday = now - timedelta(days=1)
yesterday_str = yesterday.strftime("%Y%m%d")
# 处理错误日志归档
if os.path.exists(error_log):
file_mtime = datetime.fromtimestamp(os.path.getmtime(error_log))
if file_mtime.date() == yesterday.date():
history_error_log = error_history_pattern.format(yesterday_str)
if not os.path.exists(history_error_log):
os.rename(error_log, history_error_log)
# 移除logger调用以避免死锁,改为直接打印到控制台
print(f"错误日志已归档至: {history_error_log}")
# 写入当前错误日志
with open(error_log, "a", encoding="utf-8") as f:
f.write(message)
# 1. 控制台输出(根据环境变量设置级别)
logger.add(
sink=lambda msg: print(msg, end=""),
format="<green>{time:YYYY-MM-DD HH:mm:ss}</green> | <level>{level: <8}</level> | <cyan>{module}</cyan>:<cyan>{line}</cyan> | <magenta>PID:{process}</magenta> - <level>{message}</level>",
level=console_log_level
)
# 输出当前控制台日志级别设置
print(f"控制台日志级别设置为: {console_log_level}")
# 2. 常规日志文件(所有级别,每日归档)
logger.add(
sink=rotating_sink,
format="{time:YYYY-MM-DD HH:mm:ss} | {level} | {module}:{line} | PID:{process} - {message}\n",
level="DEBUG"
)
# 3. 错误日志文件(仅ERROR及以上级别,每日归档)
logger.add(
sink=error_rotating_sink,
format="{time:YYYY-MM-DD HH:mm:ss} | {level} | {module}:{line} | PID:{process} - {message}\n",
level="ERROR" # 只处理ERROR及更高级别
)
return logger
# 初始化日志
logger = setup_rotating_logger()
# 测试代码
if __name__ == "__main__":
logger.info("程序启动,这是普通信息日志")
logger.debug("这是调试日志,不会出现在error.log")
logger.warning("这是警告日志,也不会出现在error.log")
try:
1 / 0
except ZeroDivisionError:
logger.error("发生除零错误") # 会写入error.log
logger.exception("详细异常堆栈") # 也会写入error.log
3.其他py文件引用
from log_config import logger
logger.info('111, {}', 2)