JAVA也能用上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>{{替换为GELF的UDP端口}}</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
JAVA也能用上Seq啦的更多相关文章
- Java FtpClient 实现文件上传服务
一.Ubuntu 安装 Vsftpd 服务 1.安装 sudo apt-get install vsftpd 2.添加用户(uftp) sudo useradd -d /home/uftp -s /b ...
- Java基础知识【上】(转载)
http://blog.csdn.net/silentbalanceyh/article/details/4608272 (最终还是决定重新写一份Java基础相关的内容,原来因为在写这一个章节的时候没 ...
- JAVA中使用FTPClient上传下载
Java中使用FTPClient上传下载 在JAVA程序中,经常需要和FTP打交道,比如向FTP服务器上传文件.下载文件,本文简单介绍如何利用jakarta commons中的FTPClient(在c ...
- HTTP请求中的Body构建——.NET客户端调用JAVA服务进行文件上传
PS:今日的第二篇,当日事还要当日毕:) http的POST请求发送的内容在Body中,因此有时候会有我们自己构建body的情况. JAVA使用http—post上传file时,spring框架中 ...
- java微信接口之四—上传素材
一.微信上传素材接口简介 1.请求:该请求是使用post提交地址为: https://api.weixin.qq.com/cgi-bin/media/uploadnews?access_token=A ...
- Java中实现文件上传下载的三种解决方案
第一点:Java代码实现文件上传 FormFile file=manform.getFile(); String newfileName = null; String newpathname=null ...
- 【原创】用JAVA实现大文件上传及显示进度信息
用JAVA实现大文件上传及显示进度信息 ---解析HTTP MultiPart协议 (本文提供全部源码下载,请访问 https://github.com/grayprince/UploadBigFil ...
- 浅入深出之Java集合框架(上)
Java中的集合框架(上) 由于Java中的集合框架的内容比较多,在这里分为三个部分介绍Java的集合框架,内容是从浅到深,如果已经有java基础的小伙伴可以直接跳到<浅入深出之Java集合框架 ...
- Java面向对象 网络编程 上
Java面向对象 网络编程 上 知识概要: (1)网络模型 (2)网络通讯要素 (3)UDP TCP 概念 (4)Socket (5)UDP TCP 传输 ...
- Java面向对象 集合(上)
Java面向对象 集合(上) 知识概要: (1)体系概述 (2)共性方法 (3)迭代器 (4)list集合 (5)Set 集合 体系概述: 集 ...
随机推荐
- CentOS 安装webmin
下载地址 http://download.webmin.com/download/yum/ 安装依赖 sudo yum -y install openssl perl perl-Net-SSLeay ...
- rv1126 mpp部署加解决问题
rv1126 mpp部署 + test 执行失败问题 1.1 mpp 环境部署 首先在我们自己的sdk中 ~/rv1126_linux_240110/external/mpp 将改目录拷贝到需要的 ...
- 01 jQuery初使用
01 jQuery初使用 jQuery是一个曾经火遍大江南北的一个Javascript的第三方库. jQuery的理念: write less do more. 其含义就是让前端程序员从繁琐的js代码 ...
- 【VMware vSAN】创建vSAN Max集群并配置挂载远程数据存储。
VMware Explore 2023大会上,VMware正式发布了vSAN Max,这是VMware的一种全新分解存储架构,可以为vSphere集群提供PB级分解存储.vSAN Max是基于vSAN ...
- #dp#洛谷 2679 子串
题目 有两个仅包含小写英文字母的字符串 \(A\) 和 \(B\). 现在要从字符串 \(A\) 中取出 \(k\) 个互不重叠的非空子串,然后把这 \(k\) 个子串按照其在字符串 \(A\) 中出 ...
- SQL FOREIGN KEY 约束- 保障表之间关系完整性的关键规则
SQL FOREIGN KEY 约束 SQL FOREIGN KEY 约束用于防止破坏表之间关系的操作.FOREIGN KEY 是一张表中的字段(或字段集合),它引用另一张表中的主键.具有外键的表称为 ...
- MogDB/openGauss 自定义snmptrapd告警信息
MogDB/openGauss 自定义 snmptrapd 告警信息 在实际使用中,默认的报警规则信息并不能很好的满足 snmp 服务端的需求,需要定制化报警信息,这里以添加 ip 为例,看似一个简单 ...
- HarmonyOS Codelab 优秀样例——溪村小镇(ArkTS)
一. 介绍 溪村小镇是一款展示溪流背坡村园区风貌的应用,包括园区内的导航功能,小火车行车状态查看,以及各区域的风景展览介绍,主要用于展示HarmonyOS的ArkUI能力和动画效果.具体包括如下功能 ...
- CDH5.15.1集群安装部署
CDH集群安装部署 大数据平台软件清单 本文部署的大数据基础平台为CDH,操作系统的版本为CentOS6.8,JDK的版本为1.8,Cloudera Manager与CDH的版本为5.15.1,数据库 ...
- WPF开发随笔收录-获取程序专有内存
分享一个C#获取程序当前所占用的内存大小的方法,实测跟任务管理器上的内存值一样 /// <summary> /// 性能计数器组件类 /// </summary> privat ...