百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

你还在为 Spring Boot3 读取 Nginx 的 Access.log 日志发愁?

ahcoder 2025-07-03 11:48 3 浏览

你有没有过这样的经历?在互联网大厂后端开发的工作中,想要利用 Spring Boot3 读取 Nginx 的 Access.log 日志,进行深入分析,却总是困难重重。明明知道这些日志里藏着用户行为、系统性能的关键信息,可无论是读取速度慢,还是日志格式解析错误,都让人焦头烂额。别担心,这篇文章就来帮你解决这个棘手的问题!

随着互联网业务的不断发展,高并发、大数据量已经成为常态。Nginx 作为高性能的 Web 服务器和反向代理服务器,广泛应用于各类互联网项目中,其生成的 Access.log 日志记录了用户的每一次请求,包含了客户端 IP 地址、访问时间、请求方法、请求 URL、状态码等丰富信息,这些信息对于分析用户行为、优化系统性能、排查故障都有着至关重要的作用。而 Spring Boot3 凭借其强大的功能和便捷的开发模式,成为了后端开发的热门框架,使用 Spring Boot3 来读取和分析 Nginx 的 Access.log 日志,是许多后端开发者提升工作效率和系统质量的重要需求。

接下来,就为你详细介绍几种在 Spring Boot3 中读取 Nginx 的 Access.log 日志并分析的解决方案。

方案一:使用拦截器获取部分请求信息

在 Spring Boot3 项目中,我们可以通过实现HandleInterceptor接口来自定义拦截器,这种方式适合在项目已经运行,且仅需获取请求链路中的部分关键信息的场景。在拦截器的preHandle方法中,HttpServletRequest对象保存着本次请求的基本信息,如HostAddr、HostPort、RequestUri、RemoteAddr等。虽然这种方式获取的信息不够全面,但在一些对日志信息要求不高,只需要获取部分关键请求信息的场景下,是一种简单有效的方法。

具体实现步骤如下:

首先创建自定义拦截器类RequestInterceptor:

import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class RequestInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String hostAddr = request.getRemoteAddr();
        String requestUri = request.getRequestURI();
        // 可以将获取到的信息进行日志记录,这里使用slf4j记录到文件或控制台
        org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(RequestInterceptor.class);
        logger.info("访问IP: {}, 请求URL: {}", hostAddr, requestUri); 
        return true;
    }
}

然后,在配置类中注册拦截器,让其生效:

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new RequestInterceptor())
               .addPathPatterns("/**"); // 拦截所有请求路径
    }
}

不过需要注意,这种方式只能获取到请求到达 Spring Boot3 应用后的相关信息,对于 Nginx 接收请求时的一些原始信息,如 Nginx 处理请求耗时等,无法获取。

方案二:利用脚本分析日志文件

当我们需要对历史日志文件进行批量分析,且不需要实时获取分析结果时,利用脚本分析是很好的选择。首先,我们需要对 Nginx 的日志格式进行合理配置,确保日志中包含我们需要的所有信息。Nginx 默认的日志格式为combined,但可以通过修改nginx.conf配置文件来自定义日志格式。

之后,我们可以使用一些常见的文本处理脚本工具来分析日志文件。

使用 awk 工具

awk是一个强大的文本处理工具,适合进行简单的文本统计和筛选。以分析 Nginx 的 Access.log 日志为例:

统计不同 IP 的访问次数

awk '{print $1}' access.log | sort | uniq -c | sort -n

这条命令会先提取日志文件中每行的第一个字段(通常是客户端 IP 地址),然后进行排序、去重并统计次数,最后再按照次数从小到大排序输出。例如输出结果可能为:

  1 192.168.1.10
  3 192.168.1.11
  5 192.168.1.12

计算每个 IP 的请求总大小

awk '{sum+=$10} END {print sum}' access.log

这里的$10代表日志文件中请求大小所在的字段位置(不同日志格式字段位置可能不同),sum用于累加请求大小,最后在处理完所有行后输出总和。比如,如果日志格式中第 10 个字段是响应体大小,那么执行该命令就能得到所有请求的响应体总大小。

使用 goaccess 工具

goaccess是一款更高级的日志分析工具,它可以生成直观的报表,让我们更清晰地了解日志信息,尤其适合需要快速生成可视化分析结果的场景。使用步骤如下:

安装goaccess,不同操作系统安装方式不同,以 Ubuntu 为例,执行命令:

sudo apt-get update
sudo apt-get install goaccess

然后在命令行中执行以下命令对日志进行分析:

goaccess access.log -o report.html --log-format=COMBINED

这会将 Nginx 的 Access.log 日志文件进行分析,并生成一个 HTML 格式的报表。在报表中我们可以看到各种详细的统计信息,如按小时、按天的访问量,不同 IP 的访问情况,热门的请求 URL 等。还能查看每个 URL 的响应状态码分布、平均响应时间等数据。

方案三:使用日志服务

在面对海量日志数据,且需要实时、复杂分析的场景下,专业的日志服务是最佳选择。现在有许多专业的日志服务,它们推出了 SQL 支持实时日志分析功能,极大地降低了分析access.log的门槛。以某知名日志服务(如 ELK Stack、阿里云日志服务等)为例:

接入日志:首先需要在 Nginx 配置中,将日志发送到对应的日志服务。以阿里云日志服务为例,需要在 Nginx 配置文件中添加类似如下配置(具体配置需根据实际服务要求调整)

log_format aliyun_log '$remote_addr - $remote_user [$time_local]  '
                      '"$request" $status $body_bytes_sent '
                      '"$http_referer" "$http_user_agent" '
                      '"$http_x_forwarded_for"';
access_log /var/log/nginx/access.log aliyun_log;
# 同时配置将日志发送到阿里云日志服务的Agent

进行分析:将 Nginx 的 Access.log 日志接入该服务后,就可以使用类 SQL 语句对日志进行查询和分析。比如,查询某个时间段内状态码为 500 的请求:

SELECT * FROM access_log WHERE status_code = 500 AND time BETWEEN '2024-01-01 00:00:00' AND '2024-01-02 00:00:00'

此外,还能进行更复杂的分析,如统计每个 IP 在一天内访问不同 URL 的次数分布、计算不同响应状态码的占比趋势等。而且这些日志服务通常还提供了可视化的界面,方便我们直观地查看分析结果,通过图表、仪表盘等形式展示数据。

通过以上几种方案,相信你已经对在 Spring Boot3 中读取 Nginx 的 Access.log 日志并分析有了全面的了解。无论你是采用拦截器获取部分信息,还是利用脚本工具进行简单统计,又或是借助专业的日志服务进行复杂分析,都可以根据自己项目的实际需求来选择合适的方法。现在就动手试试吧,在实践过程中如果遇到任何问题,或者有更好的经验,欢迎在评论区留言分享,让我们一起在后端开发的道路上共同进步!

相关推荐

ClickHouse日志平台这样建,分分钟秒掉ELK

目前业界的日志生态,最常用的是ELK,其次就是ClickHouse,本文会演示如何使用Vector+ClickHouse来采集Nginx日志并做清洗,最终写入ClickHouse。至...

nginx打印请求头日志方法-openresty

一、前言之前想用nginx打印收到的请求的请求头,但是只找到打印请求体的,没有打印请求头的,感觉原版nginx不支持。建议如果想打印请求头,先换成openresty(本人安装的是openresty-1...

文心快码帮你解大厂面试题:如何使用shell找到access log?

【大厂面试真题】系列,带你攻克大厂面试真题,秒变offer收割机!今日问题:在8g内存的机器,能否启动一个7G堆大小的java进程?一起看看文心快码BaiduComate给出的答案吧!如果这个问题你...

Nginx奇技淫巧之:按日期自动生成日志文件

时光闹钟app开发者,请关注我,后续分享更精彩!坚持原创,共同进步!前言之前文章:Nginx奇技淫巧之:用户行为埋点数据采集实现,介绍了Nginx获取post请求body参数生成日志文件的方法。当业务...

Nginx 日志文件详解:监控与诊断利器

随着互联网技术的快速发展,Nginx已成为最受欢迎的Web服务器之一,其稳定性、高性能和灵活性备受推崇。Nginx日志文件是Nginx服务器中非常重要的组成部分,对于监控和诊断Web应...

Nginx从入门到放弃05-访问日志与日志切割

设置访问日志当我们访问nginx服务时,nginx会记录日志,nginx日志分两种,一种是访问日志,一种是错误日志,访问日志记录在”access.log”文件中,错误日志记录在”error.log”文...

nginx系列:常用利用shell统计日志

0x01:根据访问IP统计UVUV(UniqueVisitor)独立访客,统计访问某站点的用户数;IP(InternetProtocol)独立IP数,是指独立的浏览了页面的不同IP,即统计不同的I...

Linux 必须重点监控的 17 个日志文件:运维与安全必备指南

在Linux系统的日常运维与安全管理中,日志文件的重要性不言而喻。日志不仅记录着系统运行的点点滴滴,更是排查故障、发现异常、提前预警的第一手证据。作为一名系统管理员、安全工程师,甚至普通开发者,了...

nginx 常用日志参数(nginx日志详解)

Nginx提供了多种日志参数(变量),可以用来记录请求的不同方面。常用日志参数$remote_addr:客户端的IP地址。$remote_user:客户端用户名。$time_local:局部时...

GoAccess轻量nginx日志分析工具(nginx日志收集方案)

什么是GoAccessGoAccess是一款开源、实时,运行在命令行终端下的Web日志分析工具。该工具提供快速、多样的HTTP状态统计。分析结果,可以通过XShell等客户端工具查看,并...

后端实践:Nginx日志配置(超详细)(nginx日志配置文件)

作者:antwang来源:https://juejin.im/post/5aa09bb3f265da238f121b6c前言Nginx日志对于统计、系统服务排错很有用。Nginx日志主要分为两种:...

Nginx access_log 运行日志查询和配置

1.介绍当我们学会Nginx的基本配置之后,可以通过Nginx配置Service代理。管理服务器所有的http和https请求。那么接下来就需要了解Nginx的日志控制,以及相关的文档查看了。你通过...

Nginx记录用户请求Header到access log

为了统计和其它用途,经常有人需要自定义Nginx日志,把http请求中的某个字段记录到日志中,刚好在看lua+nginx的文章,第一想到的是用lua赋值来做,但是想想有点小恶心,于是Google了一番...

介绍五款Web服务器日志分析软件(web服务器日志是什么)

  每个站长必须要看的数据统计表,都是由日志分析软件统计和分析网站情况所得出的。日志分析软件是一种解析Nginx/Apache/IIS/Lighttpd和任何其他Web服务器日志文件的软件...

Nginx系列:Nginx自带后端健康检查

严格说Nginx并没有自带针对负载均衡后端节点的健康检查功能,但是可以通过默认自带的ngx_http_proxy_module模块和ngx_http_upstream_module模块中的相关指令...