代码编织梦想

spring-boot-starter-log

项目地址:GitHub - lisiwei1/spring-boot-starter-log: 日志框架starter

简介

此项目为日志框架的starter的源码,直接下载后打包到maven,然后其他工程通过maven导入即可(下面会详细描述使用方法)。

使用AOP拦截web请求和@Scheduled的定时任务,记录下相关的参数的日志,可以将此日志导入ELK实现秒查日志,并且支持链路追踪。

默认日志格式如下,如有需要可以自行修改源码。因为开发者技术水平有限,若有bug或者不合理的地方请见谅!

{
  "classMethod": "api",
  "hostName": "LAPTOP-572VT37S",
  "consumeTime": 57,
  "hostIp": "192.168.0.118",
  "responseTime": "2023-05-06 13:39:35.840",
  "requestParams": "{\"code\":\"22\"}",
  "serverName": "admin-server-01",
  "requestIp": "127.0.0.1",
  "className": "com.logdemo.test.web.TestController",
  "httpMethod": "GET",
  "url": "http://127.0.0.1:20230/test/api",
  "sqls": [],
  "requestTime": "2023-05-06 13:39:35.783",
  "responseParams": "调用成功!",
  "traceToken": "e9ff6423-d14c-470e-be32-3f953f89b2f3",
  "currentOrder": 1,
  "desc": "测试API接口"
}

效果演示

控制台输出:

 

ELK界面(下面会讲如何进行ELK配置和简单使用)

使用说明

导入starter

第一步,下载源码,用idea 打开,然后打开maven执行package,执行成功后在执行install,这样就把代码打包到本地maven仓库。

 

第二部,打开需要用到此starter的工程,打开pom导入starter,然后刷新maven。

<dependency>
    <groupId>com.lsw.log</groupId>
    <artifactId>spring-boot-starter-log</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</dependency>

 

 

上面都完成后,执行一个web请求即可看到控制台的日志输出。(建议先新建一个demo来测试)

 

配置日志中的serverName字段

日志中的serverName字段是读配置文件的serverName(默认 default-server-01),是用来定义服务节点名称的,建议最好配一下,每一个服务都不一样,方便后面查日志时区分是哪一个服务记录的日志。而配置文件中的excludeClassNames(默认空)是用于指定特定下的包跳过日志记录的,多个包名用英文逗号隔开。

 

跳过日志记录

有些接口的日志比较大不想记录,那么可以按照下面的方法进行配置跳过日志记录

1、注解方式

如果一些请求入参或者出参过大,不想记录,或者指定一些方法都不记录日志,直接在对应方法上添加@LogOperation注解来实现,比如@LogOperation(value = "测试API接口", skipReq= true)这个注解就记录当前注解所在的方法的方法描述为 "测试API接口",对应日志的desc字段,而skipReq= true表示此方法跳过日志入参,skipLog= true则是不记录日志。

/**
 * 日志注解
 * @Author lsw
 * @Date 2023/5/6 13:04
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LogOperation {
​
    String value() default "";//接口名字
​
    boolean skipLog() default false;//不记录整体日志
​
    boolean skipReq() default false;//不记录请求日志
​
    boolean skipRsp() default false;//不记录响应日志
​
    boolean skipSql() default false;//跳过sql
​
}

2、配置文件方式

指定特定包名下的类下的方法不记录日志。

 

注意是填package名,不要包含类名。(未实现指定类的功能 ,后面有时间再加上此功能。)

 

3、直接改starter源码

只记录某些注解下的日志或者不记录某些注解下的,比如指记录Get方法的日志,或者只记录@Scheduled下定时任务的日志

那直接修改代码,找到com.log.core.log包下的LogAspect文件进行修改。

比如不记录标有@GetMapping下的方法,那就删除对应切点(下图红框处)

获取方法名称/说明

获取到方法说明写入日志的desc字段

 

 

新建一个配置文件,实现MethodDescConfigurer接口,重写getMethodDesc方法,自己写获取指定注解的数据的逻辑

比如我现在的项目是使用我自己写的自定义注解@MethodDesc的value值来记录方法的说明的,那就按照下图的代码逻辑来获取方法说明。其他注解,比如swagger的@ApiOperation也是用相同逻辑获取注解里面的信息。

 

logback.xml配置文件

如果当前项目没有logback.xml,请复制starter中的logback.xml到本地,这样才能在控制台输出日志的同时将日志记录到本地日志文件,并且使用ELK时也要用到logback.xml。(logback.xml文件在 【日志配置文件】的文件夹中)

ELK配置与使用

如果原工程已有logback.xml文件,则直接复制下面的配置到日志配置文件

<!--输出到logstash的appender,需要用到ELK请取消注释-->
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<!--可以访问的logstash日志收集端口-->
<destination>127.0.0.1:4560</destination>
<encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder">
</encoder>
</appender>
​
<logger name="LogPackage" level="INFO">
<!--需要用到ELK请取消注释-->
<appender-ref ref="LOGSTASH" />
</logger>

如果原工程没用日志配置文件logback.xml,请直接复制ogback.xml文件在resources目录下,并取消下图中的注释配置。(logback.xml文件在 【日志配置文件】的文件夹中)

 

自行安装ELK(elasticsearch、Logstash和kibana),此处使用的是7.15版本,而且项目和ELK都是本机环境下运行的,如果不是请自行修改对应配置的地址和端口。

ELK文件配置

在logstash的bin目录下新增logstash.conf文件

往文件里面添加下面内容。其中input-tcp下的host和port要跟logbacj.xml中的destination配置一致。

然后修改output-elasticsearch-index的内容,即"weblog-info-test-%{+YYYY.MM.dd}",自定义索引名称请改weblog-info-test这部分,此处是设置日志索引名称的,后面创建索引模式需要用到,到时需要用到 weblog-info-test-*

input {
  tcp {
    mode => "server"
    host => "0.0.0.0"
    port => 4560
    codec => json_lines
  }
}
​
filter {
  json {
    # 不加这段会只有message字段,值都到message里面,没有各个字段的索引
    source => "message"
    remove_field => ["message"]
  }
}
​
output {
  elasticsearch {
    hosts => "127.0.0.1:9200"
    index => "weblog-info-test-%{+YYYY.MM.dd}"
  }
}

ELK启动

1.运行elasticsearch
双击执行bin目录下的elasticsearch.bat
启动后可以打开http://localhost:9200查看是否启动成功
​
2.运行Logstash
切换到bin目录,在地址栏输入cmd回车后,执行logstash -f logstash.conf
​
3.运行kibana
执行bin目录下的kibana.bat
然后打开http://localhost:5601/,此界面就是ELK的使用界面

ELK使用

ELK是可以设置密码的,有需要请自行设置

启动ELK后,用浏览器打开http://localhost:5601/

点击左侧的stack management

然后点击索引模式,再点击右上角的【创建索引模式】

然后创建索引模式

然后打开Discover选择刚刚创建的索引模式

然后就可以在ELK上愉快的查询日志了,可以指定时间,指定日志里面的字段进行查询,而且是秒查。

链路追踪

链路追踪是指一个web请求发送到服务A,然后服务A通过HTTP调用服务B的的web服务,这种情况下,服务A和服务B记录到的日志的tracetoken是一样的。那就可以使用日志中的tracetoken字段查出这两个服务之间调用时记录的日志。

使用tracetoken进行查询,就可以查到一个请求的完整链路,而且还可以根据currentOrder字段查看调用顺序,1为首次请求,2为第二次,依次递加。

链路追踪配置

在创建HTTP请求时,必须先在请求头header附上tracetoken和currentOrder,不然无法实现链路追踪。请参考下面代码:

private HttpHeaders createHttpHeaders() {
    HttpHeaders httpHeaders = new HttpHeaders();
    httpHeaders.add(LogVariableKey.TRACE_TOKEN, LogPackageHolder.getCurrentTraceToken());
    httpHeaders.add(LogVariableKey.TRACE_TOKEN, LogPackageHolder.getCurrentOrder().toString());
    return httpHeaders;
}

其他说明

SQL语句日志

此项目并未记录SQL日志,如工程中有sql相关的记录,请调用下面方法将SQL信息添加到日志

LogPackageHolder.addSQL(sqltext); // sqltext指具体sql信息

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ytyur6r/article/details/130757346

【springboot】数据校验api-爱代码爱编程

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ 数据校验API Sp