JAVA也能用上Seq啦

打印 上一主题 下一主题

主题 853|帖子 853|积分 2559

媒介

在.NET生态中,Serilog依附其强大的结构化日记记录功能和与Seq的无缝集成,已经成为许多开发者的首选日记记录工具。Seq作为一个日记检索和仪表板工具,能够将日记中的插值转换为结构化数据,极大地方便了开发者快速检索日记、定位题目并进行简单的统计分析。这种便捷性让人难以割舍。
配景

最近需要搞一个JAVA项目,当开发环境转移到Java生态,尤其是采用Spring Boot框架时,许多开发者发现自己不得不面临一个新的寻衅。Spring Boot的默认日记框架Logback,在处置处罚日记结构化方面并不如Serilog那样给人以深刻印象。风俗了Seq带来的便捷,我自然盼望在Java环境中也能找到类似的解决方案。
荣幸的是,Seq提供了通过GELF(GrayLog Extended Log Format)吸收日记的本领,这为Java生态中的日记结构化提供了可能。在Spring Boot 3.2中,通过引入logback-gelf的JAR包,开发者可以实现将日记以GELF格式通过UDP发送到Seq,尽管这种方式对结构化支持并不是非常友好。
GELF服务端配置


  • 安装Seq
    1. version: '3'
    2. services:
    3.   seq-input-gelf:
    4.         image: datalust/seq-input-gelf:latest
    5.         depends_on:
    6.           - seq
    7.         ports:
    8.           - "12201:12201/udp"
    9.         environment:
    10.           SEQ_ADDRESS: "http://seq:5341"
    11.         restart: unless-stopped
    12.   seq:
    13.         image: datalust/seq:latest
    14.         ports:
    15.           - "5341:80"
    16.         environment:
    17.           ACCEPT_EULA: Y
    18.         restart: unless-stopped
    19.         volumes:
    20.           - ./seq-data:/data
    复制代码
  • 安装Gelf Input

Spring配置


  • 安装logback-gelf包
    gradle
    1. implementation 'de.siegmar:logback-gelf:6.0.0'
    复制代码
  • 添加 logback-spring.xml
    1. <configuration>
    2.         <appender name="ASYNC" >
    3.                
    4.                 <queueSize>512</queueSize>
    5.                
    6.                 <discardingThreshold>0</discardingThreshold>
    7.                
    8.                 <appender-ref ref="GELF" />
    9.         </appender>
    10.         <appender name="Console"
    11.                           >
    12.                 <encoder >
    13.                         <Pattern>
    14.                                 [%white(%d{HH:mm:ss.SSS}) %highlight(%-5level)] [%blue(%t)] %yellow(%C{1}): %msg%n%throwable
    15.                         </Pattern>
    16.                 </encoder>
    17.         </appender>
    18.         <appender name="GELF" >
    19.                
    20.                 <graylogHost>{{替换为Seq-Input-GELF的UDP的IP}}</graylogHost>
    21.                 <graylogPort>12201</graylogPort>
    22.                 <maxChunkSize>508</maxChunkSize>
    23.                 <compressionMethod>GZIP</compressionMethod>
    24.                 <messageIdSupplier />
    25.                 <encoder >
    26.                         <includeRawMessage>false</includeRawMessage>
    27.                         <includeKeyValues>true</includeKeyValues>
    28.                         <includeMarker>false</includeMarker>
    29.                         <includeMdcData>true</includeMdcData>
    30.                         <includeCallerData>false</includeCallerData>
    31.                         <includeRootCauseData>false</includeRootCauseData>
    32.                         <includeLevelName>false</includeLevelName>
    33.                         <shortMessageLayout >
    34.                                 <pattern>%msg%n</pattern>
    35.                         </shortMessageLayout>
    36.                         <fullMessageLayout >
    37.                                 <pattern>%msg%n</pattern>
    38.                         </fullMessageLayout>
    39.                         <numbersAsString>false</numbersAsString>
    40.                        
    41.                         <staticField>app_name:java-demo</staticField>
    42.                        
    43.                        
    44.                        
    45.                 </encoder>
    46.         </appender>
    47.        
    48.         <root level="info">
    49.                 <appender-ref ref="ASYNC" />
    50.                 <appender-ref ref="Console" />
    51.         </root>
    52. </configuration>
    复制代码
特别留意
logback-gelf提供的de.siegmar.logbackgelf.GelfEncoder并未进行格式化写入GELF,这自然不友好,以是直接深入源码找方案。经过一番努力,我发现,通过对Logback的encoder进行定制,可以创建一个专门的SeqEncoder,这样不但能够保持日记的结构化特性,还能够继续享受Seq带来的各种便利
以是com.leesiper.logseqsample.utils.SeqEncoder 类是override的,可以在Github(SeqEncoder)中找到
旨在解决logback日记参数格式化转换为K/V情势,在Seq上方便检索。
其中参数化format约定为"[边界][参数key]={}" 的,
边界可以为以下字符
  1. private static final char[] Delimiter = {',',' ','.','。'};
复制代码
比方你记录的日记如下:
  1. Logger logger = LoggerFactory.getLogger(LogseqsampleApplication.class);
  2. logger.info("Hello {}","World");
  3. logger.info("Hello world={}","World");
  4. logger.info("log config={}",Map.of("k1","v1"));
  5. logger.info("log config={}",Map.of("key",new String[]{"value1","value2"}));
  6. logger.info("log config={}",Map.of("key",Map.of("k1","v1")));
复制代码
可以看出 config或者world参数前都有空格,即边界符。
如果运气好,配置没什么题目,Seq上可以看到日记

这一发现对于风俗了.NET生态中Serilog和Seq搭配利用的开发者来说,无疑是一个好消息。它意味着,即使在转向Java生态时,也无需放弃认识的日记记录风俗和工具。通过得当的配置和一些定制化开发,开发者可以在Spring Boot项目中实现与.NET生态相似的日记记录体验,继续享受快速检索和日记题目定位的便利。
总之,通过探索和创新,Java生态中的开发者同样能够享受到Serilog和Seq带来的高效日记处置处罚体验。这不但展示了技能跨界整合的可能性,也再次证实了开发者社区在面临寻衅时不停探索和创新的精神。
Git示例堆栈
spring-logback-seq

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

渣渣兔

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表