CentOS 上 Python 日志的查看与分析
一 日志位置与常见来源
二 命令行快速定位与查看
三 用 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")
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))
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
四 日志配置与长期治理
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("应用启动")
/var/log/myapp.log {
daily
rotate 7
compress
missingok
notifempty
copytruncate
}