温馨提示×

CentOS Python日志如何查看分析

小樊
49
2025-12-19 18:24:52
栏目: 编程语言

CentOS 上 Python 日志的查看与分析

一 日志位置与常见来源

  • 应用直写日志:由 Python 的 logging 模块写入,路径取决于代码配置;若使用相对路径(如 app.log),文件会生成在启动脚本所在目录;生产环境建议使用绝对路径(如 /var/log/myapp.log)。
  • 系统日志:Python 程序若通过 systemd 托管或被 rsyslog 捕获,日志常进入 /var/log/messages/var/log/secure/var/log/syslog 等。
  • 服务相关日志:若应用是 Web/后台服务,可能写入 /var/log/httpd//var/log/nginx/ 等对应服务目录。
    以上位置与行为是 CentOS 上定位 Python 日志的首要线索。

二 命令行快速定位与查看

  • 实时查看文件尾部:tail -f /var/log/myapp.log(按 Ctrl+C 退出)。
  • 关键字检索:grep -i “error|exception” /var/log/myapp.log;结合正则可进一步精确定位堆栈或模块。
  • 查看 systemd 服务日志:journalctl -u your-python.service -f(实时);journalctl -u your-python.service --since “2025-12-19 00:00:00”。
  • 查看系统通用日志:tail -f /var/log/messages;安全相关:tail -f /var/log/secure。
  • 权限提示:读取 /var/log/ 下文件通常需要 root 或加入 adm 组;必要时用 sudo。
    以上命令覆盖日常排查的高频场景,能快速缩小问题范围。

三 用 Python 脚本读取与分析

  • 读取并筛选高优先级日志(适合大文件逐行处理):
def parse_log(file_path, keywords=("ERROR", "WARNING")):
    try:
        with open(file_path, "r", errors="ignore") as f:
            for line in f:
                if any(k in line for k in keywords):
                    print(line.rstrip())
    except Exception as e:
        print(f"读取失败: {e}")

if __name__ == "__main__":
    parse_log("/var/log/myapp.log")
  • 读取最近 N 行(避免一次性加载大文件):
from collections import deque

def tail_log(file_path, n=50):
    try:
        with open(file_path, "r", errors="ignore") as f:
            return "".join(deque(f, n))
    except Exception as e:
        return f"读取失败: {e}"

print(tail_log("/var/log/myapp.log", 100))
  • 解析常见 syslog 格式行(示例字段提取):
import re
from datetime import datetime

SYSLOG_RE = re.compile(
    r"(?P<timestamp>\w{3}\s+\d{1,2}\s+\d{2}:\d{2}:\d{2})"
    r"\s+(?P<host>\S+)\s+(?P<proc>\S+)\[?(?P<pid>\d*)\]?:\s+(?P<msg>.*)"
)

def parse_syslog_line(line):
    m = SYSLOG_RE.match(line)
    if m:
        data = m.groupdict()
        # 将时间转为 datetime 便于后续排序/聚合
        try:
            ts = datetime.strptime(data["timestamp"], "%b %d %H:%M:%S")
            data["timestamp"] = ts
        except ValueError:
            pass
        return data
    return None
  • 运行脚本前,确保对日志文件具备读取权限;必要时使用 sudo 或将日志放到应用可写目录。

四 日志配置与长期治理

  • 使用 RotatingFileHandler 控制单文件大小并自动切分,避免磁盘被撑满:
import logging
from logging.handlers import RotatingFileHandler

logger = logging.getLogger("myapp")
logger.setLevel(logging.INFO)

handler = RotatingFileHandler(
    "/var/log/myapp.log", maxBytes=10*1024*1024, backupCount=5
)
formatter = logging.Formatter(
    "%(asctime)s %(levelname)s %(name)s %(message)s"
)
handler.setFormatter(formatter)
logger.addHandler(handler)

logger.info("应用启动")
  • 配置 logrotate 做按日/按大小轮转与压缩(创建 /etc/logrotate.d/myapp):
/var/log/myapp.log {
    daily
    rotate 7
    compress
    missingok
    notifempty
    copytruncate
}
  • 集中化与可视化:小规模可用 rsyslog 做转发;中大规模建议 ELK(Elasticsearch + Logstash + Kibana) 或同类方案做检索、聚合与告警。
  • 运行身份与权限:向 /var/log/ 写日志时,确保运行用户对日志目录具备写权限(如使用 systemdUser= 指定运行用户,或调整目录属主/权限)。

0