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接口"
}


效果演示

控制台输出:

springboot Async 日志丢失_java

 

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

springboot Async 日志丢失_字段_02

使用说明

导入starter

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

springboot Async 日志丢失_elk_03

 

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


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


springboot Async 日志丢失_es_04

springboot Async 日志丢失_java_05

 

 

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

springboot Async 日志丢失_es_06

 

配置日志中的serverName字段

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

springboot Async 日志丢失_java_07

 

跳过日志记录

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

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、配置文件方式

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

springboot Async 日志丢失_es_08

 

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

springboot Async 日志丢失_java_09

 

3、直接改starter源码

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

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

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

springboot Async 日志丢失_spring boot_10

获取方法名称/说明

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

springboot Async 日志丢失_java_11

springboot Async 日志丢失_spring boot_12

 

 

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

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

springboot Async 日志丢失_spring boot_13

 

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文件在 【日志配置文件】的文件夹中)

springboot Async 日志丢失_spring boot_14

 

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

springboot Async 日志丢失_spring boot_15

ELK文件配置

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

springboot Async 日志丢失_spring boot_16

往文件里面添加下面内容。其中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

springboot Async 日志丢失_elk_17

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

springboot Async 日志丢失_es_18

然后创建索引模式

springboot Async 日志丢失_字段_19

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

springboot Async 日志丢失_spring boot_20

springboot Async 日志丢失_java_21

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

springboot Async 日志丢失_字段_22

链路追踪

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

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

springboot Async 日志丢失_es_23

链路追踪配置

在创建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信息


springboot Async 日志丢失_java_24