前言 在.NET生態中,Serilog憑藉其強大的結構化日誌記錄功能和與Seq的無縫集成,已經成為許多開發者的首選日誌記錄工具。Seq作為一個日誌檢索和儀錶板工具,能夠將日誌中的插值轉換為結構化數據,極大地方便了開發者快速檢索日誌、定位問題併進行簡單的統計分析。這種便捷性讓人難以割捨。 背景 最近需 ...
前言
在.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
version: '3' services: seq-input-gelf: image: datalust/seq-input-gelf:latest depends_on: - seq ports: - "12201:12201/udp" environment: SEQ_ADDRESS: "http://seq:5341" restart: unless-stopped seq: image: datalust/seq:latest ports: - "5341:80" environment: ACCEPT_EULA: Y restart: unless-stopped volumes: - ./seq-data:/data
-
安裝Gelf Input
Spring配置
-
安裝logback-gelf包
gradleimplementation 'de.siegmar:logback-gelf:6.0.0'
-
添加 logback-spring.xml
<configuration> <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender"> <!-- 設置隊列的最大容量,預設值為 256 --> <queueSize>512</queueSize> <!-- 設置當隊列滿時是否丟棄新的日誌事件,預設為 false --> <discardingThreshold>0</discardingThreshold> <!-- 引用其他的 appender,例如控制台 appender --> <appender-ref ref="GELF" /> </appender> <appender name="Console" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <Pattern> [%white(%d{HH:mm:ss.SSS}) %highlight(%-5level)] [%blue(%t)] %yellow(%C{1}): %msg%n%throwable </Pattern> </encoder> </appender> <appender name="GELF" class="de.siegmar.logbackgelf.GelfUdpAppender"> <!--GELF Server--> <graylogHost>{{替換為Seq-Input-GELF的UDP的IP}}</graylogHost> <graylogPort>12201</graylogPort> <maxChunkSize>508</maxChunkSize> <compressionMethod>GZIP</compressionMethod> <messageIdSupplier class="de.siegmar.logbackgelf.MessageIdSupplier"/> <encoder class="com.leesiper.logseqsample.utils.SeqEncoder"> <includeRawMessage>false</includeRawMessage> <includeKeyValues>true</includeKeyValues> <includeMarker>false</includeMarker> <includeMdcData>true</includeMdcData> <includeCallerData>false</includeCallerData> <includeRootCauseData>false</includeRootCauseData> <includeLevelName>false</includeLevelName> <shortMessageLayout class="ch.qos.logback.classic.PatternLayout"> <pattern>%msg%n</pattern> </shortMessageLayout> <fullMessageLayout class="ch.qos.logback.classic.PatternLayout"> <pattern>%msg%n</pattern> </fullMessageLayout> <numbersAsString>false</numbersAsString> <!--增加app_name 區分服務--> <staticField>app_name:java-demo</staticField> <!--<staticField>os_arch:${os.arch}</staticField>--> <!--<staticField>os_name:${os.name}</staticField>--> <!--<staticField>os_version:${os.version}</staticField>--> </encoder> </appender> <!-- LOG everything at INFO level --> <root level="info"> <appender-ref ref="ASYNC" /> <appender-ref ref="Console" /> </root> </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]={}"
的,
邊界可以為以下字元
private static final char[] Delimiter = {',',' ','.','。'};
例如你記錄的日誌如下:
Logger logger = LoggerFactory.getLogger(LogseqsampleApplication.class);
logger.info("Hello {}","World");
logger.info("Hello world={}","World");
logger.info("log config={}",Map.of("k1","v1"));
logger.info("log config={}",Map.of("key",new String[]{"value1","value2"}));
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
本文來自博客園,作者:流年灬似氺,轉載請註明原文鏈接:https://www.cnblogs.com/lic0914/p/18169940/spring-logback-seq