适用场景:快速查看日志统计结果,无需复杂配置。
常用工具:
goaccess /var/log/nginx/access.log -o report.html --log-format=COMBINED,即可生成可视化报告并自动打开浏览器查看。awk '{print $4}' access.log | cut -d: -f1 | sort | uniq -c | sort -nr,结果可通过管道传递给gnuplot或matplotlib生成图表。适用场景:需要定制化分析逻辑(如关联多维度数据、复杂图表),或集成到现有Python项目。
实现步骤:
pandas读取日志文件,通过正则表达式提取关键字段(IP、时间、状态码、URL等)。例如:import pandas as pd
log_pattern = r'(?P<ip>\S+) - - \[(?P<time>.*?)\] "(?P<method>\S+) (?P<url>\S+) (?P<protocol>\S+)" (?P<status>\d+) (?P<size>\d+)'
df = pd.read_csv('access.log', names=log_pattern.split(), engine='python')
df['time'] = pd.to_datetime(df['time'], format='%d/%b/%Y:%H:%M:%S %z')
pandas进行聚合统计(如每小时访问量、状态码分布、热门URL)。例如:hourly_counts = df.groupby(df['time'].dt.hour)['ip'].count() # 按小时统计访问量
status_counts = df['status'].value_counts() # 统计状态码分布
top_urls = df['url'].value_counts().head(10) # 获取Top10热门URL
matplotlib/seaborn生成静态图表(折线图、饼图、柱状图),或pyecharts生成交互式图表。例如:import matplotlib.pyplot as plt
import seaborn as sns
sns.set(style="whitegrid", font="SimHei") # 支持中文
plt.figure(figsize=(10, 5))
sns.lineplot(x=hourly_counts.index, y=hourly_counts.values, marker="o")
plt.title("每小时访问量趋势")
plt.xlabel("小时")
plt.ylabel("访问次数")
plt.savefig('hourly_traffic.png') # 保存为图片
或使用pyecharts生成交互式折线图:from pyecharts import options as opts
from pyecharts.charts import Line
line = (
Line()
.add_xaxis(hourly_counts.index.astype(str).tolist())
.add_yaxis("访问量", hourly_counts.values.tolist(), is_smooth=True)
.set_global_opts(title_opts=opts.TitleOpts(title="每小时访问量趋势"))
)
line.render("hourly_traffic.html") # 生成HTML文件
优势:灵活定制图表样式,支持自动化(如定时运行脚本生成日报)。适用场景:海量日志数据(如每天1亿条以上),需要实时分析、复杂查询(如关联多字段)和团队协作。
组件及流程:
input {
file {
path => "/var/log/nginx/access.log"
start_position => "beginning"
}
}
filter {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" } # 解析Nginx日志
}
date {
match => ["timestamp", "dd/MMM/yyyy:HH:mm:ss Z"] # 转换时间格式
}
}
output {
elasticsearch {
hosts => ["localhost:9200"]
index => "nginx-access-%{+YYYY.MM.dd}" # 按日期分索引
}
}
适用场景:需要实时监控Nginx性能指标(如请求延迟、错误率、吞吐量),并与现有监控系统(如Prometheus)集成。
实现步骤:
Nginx Exporter收集Nginx状态指标(如nginx_http_requests_total、nginx_http_upstream_response_time_seconds),暴露为Prometheus格式的端点(默认/metrics)。Nginx Exporter的指标数据,存储为时序数据。适用场景:日志量极大(如每天TB级),需要分布式处理(如MapReduce、Spark)。
实现步骤:
Flume或Kafka收集Nginx日志,写入HDFS或Kafka主题。Spark解析日志(如提取IP、时间、状态码),进行聚合统计(如每小时访问量、热门URL)。示例代码:from pyspark.sql import SparkSession
spark = SparkSession.builder.appName("NginxLogAnalysis").getOrCreate()
log_rdd = spark.sparkContext.textFile("hdfs://path/to/access.log")
parsed_rdd = log_rdd.map(lambda line: line.split()) # 简单分割日志
hourly_counts = parsed_rdd.map(lambda x: (x[3][:2], 1)) # 提取小时并计数
hourly_counts.reduceByKey(lambda a, b: a + b).collect() # 输出结果
HBase或Elasticsearch,通过Kibana或Grafana展示。以上方法覆盖了从简单到复杂的不同场景,可根据团队技术栈、日志规模和需求选择合适的方案。例如,小型团队可选择GoAccess或Python方案,企业级场景推荐ELK Stack或Grafana+Prometheus,超大规模日志则需使用大数据框架。