springboot项目日志处理

本文介绍如何在项目中利用Spring Boot AOP实现统一的日志管理。包括日志的重要性和记录内容,如URL、IP地址、调用方法等,并展示了具体的实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、项目中为什么要进行日志处理

二、日志需要记录的内容

三、使用


一、项目中为什么要进行日志处理

  • 程序出现错误时、快速定位位置
  • sout/serr本身时IO操作,会影响系统性能,日志的打印级别可以控制。

Spring Boot 默认打印日志的级别是INFO级别。

优先级从高到低分别是ERROR、WARN、INFO、DEBUG

二、日志需要记录的内容

  • 请求URL
  • 服务IP
  • 调用方法
  • 请求参数
  • 返回内容

三、使用

在关键结点打印日志难免会疏漏且不易管理,故本次使用的时springboot AOP来创建日志切面;在前端和服务器之间创建个切面、对拦截到的流进行处理。

         3.1 项目引入aop切面的依赖

        <!--AOP-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

web依赖包中自带了spring-boot-starter-logging依赖,所以若导入了web包,可以不用单独添加logging依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

3.2  

@Aspect
@Component
public class LogAspect {

    /**
     * 日志记录器
     */
    private final Logger logger =LoggerFactory.getLogger(this.getClass());

    /**
     * 这个切面会横切com.example.demo包下控制器的请求
     */

    @Pointcut("execution(* com.example.demo..*.*(..))")
    public void aspect(){

    }

    /**
     * doBefore()在切面前执行
     */
    @Before("aspect()")
    public void doBefore(JoinPoint joinPoint) {
        logger.info("-------------doBefore------------");
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        String url = request.getRequestURL().toString();
        String ip = request.getRemoteAddr();
        String classMethod = joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName();
        Object[] args = joinPoint.getArgs();
        RequestLog requestLog = new RequestLog(url, ip, classMethod, args);
        logger.info("Request : {}", requestLog);
    }

    /**
     * doAfter()在切面后执行
     */
    @After("aspect()")
    public void doAfter(){
        logger.info("-------------doAfter------------");

    }

    /**
     * 该方法返回
     * @param result 返回的内容
     */
    @AfterReturning(returning = "result",pointcut = "aspect()")
    public void doAfterReturn(Object result){
        logger.info("Result : {}",result);

    }

    /**
     * 日志对象
     */
    private class RequestLog {
        private String url;
        private String ip;
        private String classMethod;
        private Object[] args;

        public RequestLog(String url, String ip, String classMethod, Object[] args) {
            this.url = url;
            this.ip = ip;
            this.classMethod = classMethod;
            this.args = args;
        }

        @Override
        public String toString() {
            return "{" +
                    "url='路径" + url + '\'' +
                    ", ip='" + ip + '\'' +
                    ", classMethod='" + classMethod + '\'' +
                    ", args=" + Arrays.toString(args) +
                    '}';
        }
    }

}

@Before:标识一个前置增强方法。
@After:final增强,不管是抛出异常或者正常退出都会执行。
@AfterReturning:后置增强,方法正常退出时执行。
@AfterThrowing:异常抛出增强,方法执行抛出异常后执行。

@Aspect 该类是切面
@Component 注册组件、实现bean注入
@Pointcut("execution(* com.example.demo..*.*(..))")
声明该方法是一个切点
execution(),表达式的主体
第一个“*”符号,表示返回值类型任意;
"com.example.demo",AOP所切的服务的包名
包名后面的“.”,表示当前包及子包
第二个“*”,表示类名,*即所有类
.*(…),表示任何方法名,括号表示参数,两个点表示任何参数类型

测试接口

    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    @GetMapping("/{username}/{password}")
    @ResponseBody
    public String loginTest(@PathVariable String password, @PathVariable String username){

        logger.info("----正在执行--loginTest------");

        return username+password;
    }

 访问该接口查看日志

当修改日志打印级别高于info后再访问测试接口,对应日志则不会打印。一般是通过不同环境选择不同的配置文件。

logging:
  level:
    root: warn

以上便是本篇使用内容 

<think>嗯,用户现在想在Spring Boot项目中收集日志,并且集成到ELK平台。之前已经给过他们关于ELK搭建的步骤,现在他们更关注Spring Boot这边的配置。需要结合之前提供的引用内容,尤其是引用[2]和[4],里面提到了依赖和Logstash的TCP配置。 首先,用户可能需要知道如何配置Spring Boot的日志输出,使其能够发送到Logstash。引用[2]中的pom依赖是关键,需要包括Logback和Logstash的encoder。然后,用户需要配置logback-spring.xml,这部分可能比较复杂,特别是设置Logstash的TCP appender。 另外,引用[4]提到使用TCP方式传输日志,需要确保端口一致,所以配置文件中应该指定Logstash的地址和端口。可能还需要在Logstash那边配置对应的输入源,比如TCP插件,这样两端才能对接上。 用户可能对ELK整体的流程不太清楚,所以需要分步骤说明,从添加依赖、配置日志文件、修改Logstash配置、到创建Elasticsearch索引和Kibana展示。要注意到用户可能遇到的常见问题,比如依赖冲突、网络连接问题,或者日志格式不匹配,这些都需要在注意事项里提到。 还需要参考用户之前的回答,他们提到过Logstash的配置文件和Grok插件的使用,但这次可能更侧重于Spring Boot的集成,所以重点放在如何将日志从应用发送出去,而不是文件采集。同时,要确保时间戳和时区设置正确,避免日志时间不一致的问题。 最后,生成的相关问题要围绕集成过程中可能遇到的难点,比如依赖冲突、性能优化、日志格式定制等,这样用户如果有进一步的问题,可以自行查阅或者继续提问。</think>### Spring Boot 项目日志收集与 ELK 集成指南 --- #### **一、Spring Boot 日志收集原理** Spring Boot 默认使用 Logback 作为日志框架,通过配置日志输出格式和传输方式,可将日志实时发送至 Logstash,最终存储到 Elasticsearch 并可视化展示在 Kibana 中[^2][^4]。 --- #### **二、集成步骤** ##### **1. 添加依赖(参考引用[2])** 在 `pom.xml` 中引入 Logback 和 Logstash 编码器依赖: ```xml <!-- Logback 核心依赖 --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.4.12</version> </dependency> <!-- Logstash 日志编码器 --> <dependency> <groupId>net.logstash.logback</groupId> <artifactId>logstash-logback-encoder</artifactId> <version>7.4</version> </dependency> ``` ##### **2. 配置 Logback 输出至 Logstash** 在 `src/main/resources/logback-spring.xml` 中配置 TCP 或 HTTP 输出: ```xml <configuration> <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender"> <destination>localhost:5044</destination> <!-- Logstash 监听地址 --> <encoder class="net.logstash.logback.encoder.LogstashEncoder"> <customFields>{"appname":"your-springboot-app"}</customFields> </encoder> </appender> <root level="INFO"> <appender-ref ref="LOGSTASH" /> </root> </configuration> ``` *注:Logstash 需配置 TCP 输入(见引用[4])*。 ##### **3. Logstash 配置(参考引用[4])** 创建 `logstash-springboot.conf`,指定输入来源与 Elasticsearch 输出: ```plaintext input { tcp { port => 5044 codec => json_lines # 解析 JSON 格式日志 } } output { elasticsearch { hosts => ["http://localhost:9200"] index => "springboot-logs-%{+YYYY.MM.dd}" } } ``` 启动 Logstash: ```bash ./bin/logstash -f logstash-springboot.conf ``` ##### **4. Elasticsearch 索引预创建(可选)** 为日志字段定义映射(参考引用[4]): ```json PUT springboot-logs { "mappings": { "properties": { "level": { "type": "keyword" }, "message": { "type": "text" }, "timestamp": { "type": "date" } } } } ``` ##### **5. Kibana 可视化配置** 1. 登录 Kibana(默认地址 `http://localhost:5601`)。 2. 进入 **Management > Stack Management > Index Patterns**,创建索引模式 `springboot-logs-*`。 3. 在 **Discover** 或 **Dashboard** 中分析日志。 --- #### **三、关键配置说明** | 组件 | 配置要点 | |-------------|------------------------------------------------------------------------| | Spring Boot | 确保日志级别为 `INFO` 或更低,避免过滤关键信息 | | Logstash | 输入端口需与 Logback 配置一致,输出索引名建议按日期分片(如 `springboot-logs-%{+YYYY.MM.dd}`) | | Elasticsearch | 提前设置合理的分片数(`number_of_shards`)和副本数(`number_of_replicas`) | --- #### **四、常见问题与优化** 1. **日志丢失问题** - 检查 Logstash 输入端口防火墙设置; - 增加 Logstash 的 `pipeline.workers` 提升处理能力[^1]。 2. **性能瓶颈** - 使用异步日志输出(如 `AsyncAppender`)减少对应用性能影响; - Elasticsearch 分片过多时合并索引(`_forcemerge`)。 3. **字段解析失败** - 在 Logstash 的 `filter` 段添加 Grok 匹配规则(参考引用[3]); - 使用 `mutate` 插件修正字段类型。 --- ### **相关问题** 1. 如何通过 Logback 实现多环境(开发/生产)的差异化日志配置? 2. 在 Kubernetes 环境中部署 ELK 时如何优化日志采集效率? 3. 如何自定义 Kibana 仪表盘以展示特定业务指标的日志趋势? --- **附:引用内容整合说明** - 依赖版本需保持 ELK 各组件兼容性(如 Logstash 7.x 对应 Elasticsearch 7.x)[^2][^3]; - TCP 传输方式相比文件采集更实时,但需注意网络稳定性[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值