要对 Nginx 日志作分析,需要解决两个核心问题:
传统方案有两种,一种是大数据领域的方案,一种是运维领域的方案。
运维领域常见的方案是使用 ELK 全家桶, 通过 Logstash 收集,直接写入 ElasticSearch, 配合web插件 Kibana 完成交互分析部分。
这套架构缺点也很明显:
第二种是大数据解决方案,使用 flume 收集日志,使用 Kafka作为数据队列,使用 Spark/flink 消费Kafka 将日志写入对象存储。最后,再接一套完整的数据分析工具。
这套架构缺点也比较明显:
日志收集部分,只需要将对象存储通过 JuiceFS 挂载成服务器本地目录,然后直接将 Nginx 日志写入到那个目录即可。
相比传统方案:
大家唯一可能担心的是,Nginx 直接写 JuiceFS 影响NGINX 的正常运行,有两方面可以帮大家减少一些顾虑:
数据分析部分,则可以使用 Byzer 来进行分析。Byzer 可以直接读取 JuiceFS 里的日志数据,然后使用 可编程SQL语法 在 Byzer 专属的 Byzer-notebook产品进行分析。
Notebook界面是这样的:
下面是一个实际的 Byzer 代码 分析 Nginx 日志的例子(简单统计,把产生的统计结果作为邮件发送):
load text.`/data/nginx/logs/access_log*` as nginxTable;
-- 日志文件的清洗和统计
select
access_host,access_page,count(1) as access_freq
from (
select split(value,' ')[2] as access_host,split(value,' ')[7] as access_page
from (select * from nginxTable where value is not null)
)
where
access_host !="-"
group by access_host,access_page
order by access_freq desc
limit 10 as accessTable;
set saveDir="/tmp/access";
set savePath="/tmp/access.csv";
-- 保存PV统计数据为CSV格式的文件
save overwrite accessTable as csv.`${saveDir}` where header="true";
-- 因为在分布式环境运行,我们的文件会按照分区个数保存为多个文件,这里我们进行合并
!hdfs -getmerge /tmp/access/tmp/access.csv;
set EMAIL_TITLE = "Byzer网站访问日志分析";
set EMAIL_BODY = '''<div>Hi All,<br/><br/> 日志分析完成,请查收邮件!</div><br/><hr/><div>Thanks,<br/>The Byzer Org</div>''';
set EMAIL_TO = "userAccountNumber@qq.com, userAccountNumber@163.com";
-- 发送附件邮件到指定邮箱
run command as SendMessage.``
where method="mail"
and content="${EMAIL_BODY}"
and from = "userAccountNumber@qq.com"
and to = "${EMAIL_TO}"
and subject = "${EMAIL_TITLE}"
and contentType="text/html"
and attachmentContentType="text/csv"
and attachmentPaths="${savePath}"
and smtpHost = "smtp.qq.com"
and smtpPort="587"
and `properties.mail.smtp.ssl.enable`= "true"
and `userName`="userAccountNumber@qq.com"
and password="***"
;
用户仅仅需要使用 JuiceFS 和 Byzer 就可以完成数据的收集和分析,具有如下有点: