Python日志的位置主要由应用程序配置或代码决定,常见场景如下:
settings.py
)中通过LOG_FILE
或LOG_PATH
参数指定日志路径(例如/var/log/myapp/app.log
);代码中也可能通过logging.basicConfig(filename='/path/to/logfile.log')
直接设置。syslog
),可通过journalctl
命令查看(例如sudo journalctl -u your_app_service_name
)。/var/log/
下的通用目录(如/var/log/messages
、/var/log/secure
),或应用根目录的logs
文件夹中。使用文本编辑器(如vim
、nano
)或命令行工具查看:
# 使用vim查看(需权限)
vim /var/log/myapp/app.log
# 使用less查看(支持翻页)
less /var/log/myapp/app.log
注意:若权限不足,需用sudo
提升权限(如sudo vim /var/log/myapp/app.log
)。
使用tail -f
命令实时跟踪日志文件的新增内容(适用于调试实时问题):
tail -f /var/log/myapp/app.log
# 按Ctrl+C停止实时查看
用grep
命令筛选包含关键字的日志(如错误信息):
# 筛选包含"ERROR"的行
grep "ERROR" /var/log/myapp/app.log
# 结合实时查看(如实时过滤错误日志)
tail -f /var/log/myapp/app.log | grep "ERROR"
若应用日志集成到系统日志(如通过rsyslog
),可通过journalctl
查看:
# 查看指定服务的日志(替换your_app_service_name为实际服务名)
sudo journalctl -u your_app_service_name
# 实时查看系统日志
sudo journalctl -f
# 筛选包含"Python"的日志
sudo journalctl | grep "Python"
通过open()
函数读取日志文件,用字符串方法(如in
、split
)提取关键信息:
# 读取日志并筛选错误信息
def parse_error_logs(log_file):
try:
with open(log_file, 'r') as f:
for line in f:
if "ERROR" in line or "CRITICAL" in line:
print(line.strip())
except Exception as e:
print(f"读取日志失败: {e}")
# 调用函数(替换为实际日志路径)
parse_error_logs("/var/log/myapp/app.log")
将日志转换为DataFrame,进行统计(如错误数量)、排序(如按时间排序):
import pandas as pd
# 读取日志(假设日志格式为"时间 - 级别 - 消息",用" - "分隔)
log_data = pd.read_csv(
"/var/log/myapp/app.log",
delimiter=" - ",
header=None,
names=["timestamp", "level", "message"]
)
# 统计错误日志数量
error_count = log_data[log_data["level"] == "ERROR"].shape[0]
print(f"错误日志数量: {error_count}")
# 按时间排序并查看最近的10条错误日志
log_data["timestamp"] = pd.to_datetime(log_data["timestamp"])
recent_errors = log_data[log_data["level"] == "ERROR"].sort_values("timestamp").tail(10)
print(recent_errors)
用matplotlib
绘制日志趋势图(如错误日志随时间的变化):
import matplotlib.pyplot as plt
# 转换时间格式并排序
log_data["timestamp"] = pd.to_datetime(log_data["timestamp"])
log_data = log_data.sort_values("timestamp")
# 统计每分钟的错误日志数量
error_counts = log_data[log_data["level"] == "ERROR"].set_index("timestamp").resample("1T").count()["message"]
# 绘制折线图
plt.figure(figsize=(12, 6))
plt.plot(error_counts.index, error_counts.values, marker="o", linestyle="-")
plt.xlabel("时间")
plt.ylabel("错误日志数量")
plt.title("Python应用错误日志趋势(最近1小时)")
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
RotatingFileHandler
或TimedRotatingFileHandler
避免日志文件过大(例如每天生成一个新日志文件,保留7天)。apache
、nginx
或自定义用户)有权限写入日志目录(如/var/log/myapp/
)。rsyslog
或fluentd
将日志发送到远程服务器(如ELK Stack),实现集中存储和分析。