Ubuntu Python日志管理实战指南
一 基础与快速上手
import logging
from logging.handlers import RotatingFileHandler
# 创建记录器
logger = logging.getLogger("myapp")
logger.setLevel(logging.DEBUG)
# 控制台处理器
ch = logging.StreamHandler()
ch.setLevel(logging.INFO)
ch.setFormatter(logging.Formatter("%(levelname)s - %(name)s - %(message)s"))
# 文件处理器(按大小轮转:10MB,保留5个备份)
fh = RotatingFileHandler("app.log", maxBytes=10*1024*1024, backupCount=5)
fh.setLevel(logging.DEBUG)
fh.setFormatter(logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s"))
logger.addHandler(ch)
logger.addHandler(fh)
logger.debug("调试信息")
logger.info("服务启动")
logger.error("发生错误", exc_info=True) # 记录堆栈
二 配置分离与多环境管理
# config.json
{
"version": 1,
"disable_existing_loggers": false,
"formatters": {
"simple": {"format": "%(levelname)s - %(message)s"},
"detailed": {"format": "%(asctime)s - %(name)s - %(levelname)s - %(message)s"}
},
"handlers": {
"console": {
"class": "logging.StreamHandler",
"level": "DEBUG",
"formatter": "simple",
"stream": "ext://sys.stdout"
},
"timed_file": {
"class": "logging.handlers.TimedRotatingFileHandler",
"level": "INFO",
"formatter": "detailed",
"filename": "app.log",
"when": "midnight",
"interval": 1,
"backupCount": 7
}
},
"root": {
"level": "DEBUG",
"handlers": ["console", "timed_file"]
}
}
# 加载配置
import logging.config, json
with open("config.json", "r") as f:
logging.config.dictConfig(json.load(f))
logger = logging.getLogger(__name__)
三 系统级集成与轮转
/var/log/python/*.log {
daily
rotate 7
compress
missingok
notifempty
copytruncate
}
sudo logrotate -f /etc/logrotate.d/python_app
import syslog
syslog.syslog(syslog.LOG_INFO, "来自Python应用的日志")
# 查看:journalctl -f -t python_app
四 第三方与进阶实践
from loguru import logger
logger.add("app.log", rotation="500 MB", retention=5, compression="zip")
logger.info("Hello from Loguru")
import sentry_sdk
from sentry_sdk.integrations.logging import LoggingIntegration
sentry_sdk.init(
dsn="YOUR_DSN",
integrations=[LoggingIntegration(level=logging.ERROR, event_level=logging.ERROR)]
)
logger = logging.getLogger(__name__)
try:
1/0
except Exception:
logger.exception("除零错误")
import logging, queue
from logging.handlers import QueueHandler, QueueListener
log_q = queue.Queue(-1)
qh = QueueHandler(log_q)
listener = QueueListener(log_q, logging.FileHandler("async.log"), logging.StreamHandler())
listener.start()
logger = logging.getLogger("async")
logger.addHandler(qh)
logger.setLevel(logging.DEBUG)
# ... 业务代码
# 程序退出前:listener.stop()
五 生产落地清单