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

你有没有过这样的经历?在互联网大厂后端开发的工作中,想要利用 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 日志并分析有了全面的了解。无论你是采用拦截器获取部分信息,还是利用脚本工具进行简单统计,又或是借助专业的日志服务进行复杂分析,都可以根据自己项目的实际需求来选择合适的方法。现在就动手试试吧,在实践过程中如果遇到任何问题,或者有更好的经验,欢迎在评论区留言分享,让我们一起在后端开发的道路上共同进步!

相关文章

你是不是也遇到过:Spring Boot3 读 Nginx 日志文件时无从下手?

在互联网大厂后端开发领域,对 Nginx 的 Access.log 日志进行深度分析是保障系统稳定运行、优化服务性能的关键环节。作为后端开发人员,我们期望从这些日志中挖掘用户访问行为、接口调用情况等有...

Nginx access_log 运行日志查询和配置

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

fluent-bit 收集nginx日志

简介Fluent Bit 是一款快、轻且高度可扩展的日志和指标采集器。与logstash对比更省资源。nginx日志可以让我们分析出很多信息,多个应用采集到elasticsearch之后,可以让查询统...

Nginx负载均衡:nginx.conf配置文件说明!

大家好,欢迎来到程序视点!我是你们的老朋友.小二!在此记录下Nginx服务器nginx.conf负载均衡的配置文件说明, 部分注释收集与网络.关于nginx.conf基本的配置,请查看上一篇文章!Ng...

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

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