package com.websocket.logback.ws;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.Appender;
import ch.qos.logback.core.OutputStreamAppender;
import ch.qos.logback.core.util.OptionHelper;
import javax.websocket.Session;
import java.io.*;
import java.nio.charset.StandardCharsets;
public class LogbackWebsocketContext {
private final Logger logger;
private final Session session;
private static final String logPattern = "%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%15.15t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}";
public LogbackWebsocketContext(Logger logger, Session session) {
this.logger = logger;
this.session = session;
}
private PipedInputStream pipedInputStream;
private PipedOutputStream pipedOutputStream;
private Appender<ILoggingEvent> appender;
public void start() throws IOException {
pipedInputStream = new PipedInputStream();
pipedOutputStream = new PipedOutputStream(pipedInputStream);
appender = createAppender(logger, pipedOutputStream);
logger.addAppender(appender);
Thread thread = createWriteThread(session, pipedInputStream);
thread.start();
}
public void close() throws IOException {
appender.stop();
logger.detachAppender(appender);
pipedInputStream.close();
pipedOutputStream.close();
}
private Appender<ILoggingEvent> createAppender(ch.qos.logback.classic.Logger log, PipedOutputStream pipedOutputStream) {
OutputStreamAppender<ILoggingEvent> outputStreamAppender = new OutputStreamAppender<>();
outputStreamAppender.setContext(log.getLoggerContext());
PatternLayoutEncoder encoder = new PatternLayoutEncoder();
encoder.setPattern(OptionHelper.substVars(logPattern, log.getLoggerContext()));
encoder.setContext(log.getLoggerContext());
encoder.start();
encoder.setCharset(StandardCharsets.UTF_8);
outputStreamAppender.setEncoder(encoder);
outputStreamAppender.setOutputStream(pipedOutputStream);
outputStreamAppender.start();
return outputStreamAppender;
}
private Thread createWriteThread(Session session, PipedInputStream pipedInputStream) {
return new Thread(() -> {
InputStreamReader inputStreamReader = new InputStreamReader(pipedInputStream, StandardCharsets.UTF_8);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String s;
try {
while ((s = bufferedReader.readLine()) != null) {
session.getBasicRemote().sendText(s);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
});
}
}
将Logback日志输出到websocket
需积分: 0 199 浏览量
更新于2024-04-13
收藏 7KB ZIP 举报
标题中的“将Logback日志输出到websocket”指的是利用Logback这一强大的日志框架,结合WebSocket技术,实现实时的日志传输。Logback是Java世界中广泛使用的日志记录工具,它提供了高效的日志记录功能,而WebSocket则是一种在客户端和服务器之间建立持久连接的协议,允许双向通信。这种组合使得应用程序能够实时地将日志信息推送到前端展示,而不仅仅是通过传统的文件或日志服务器。
描述中的关键点包括:
1. **无需读取日志文件**:传统方式下,日志通常被写入到磁盘文件中,然后由其他进程读取分析。这种方式存在延迟,并且可能导致大量磁盘I/O。通过WebSocket,日志可以直接从应用程序发送到前端,省去了读取文件的步骤,提高了效率。
2. **对代码无侵入**:这意味着开发者可以在不修改原有业务代码的情况下,仅调整日志配置就能实现日志实时推送。这对于维护代码的整洁性和减少开发工作量至关重要。
3. **实时输出,0延时**:WebSocket提供的是实时的双向通信,因此日志一旦生成,就可以立即被传输到客户端,几乎不存在延时,这对于监控系统或者需要即时反馈的场景非常有用。
4. **可定制日志格式**:Logback支持自定义日志格式,这意味着你可以根据需求调整日志输出的样式,包括时间戳、级别、线程名、类名、消息等内容,以满足不同的分析和展示需求。
在“logback-websocket”这个压缩包中,可能包含以下内容:
- **配置文件**:如`logback.xml`,用于配置Logback如何将日志信息通过WebSocket发送出去,可能包括设置Appender(输出目标)为WebSocket,定义过滤器,以及定制日志格式等。
- **WebSocket服务器端代码**:这部分代码负责接收和处理来自Logback的日志信息,可能是一个独立的服务或者集成在现有的应用服务器中。
- **WebSocket客户端代码**:可能是JavaScript或者其他前端框架,用于在浏览器中接收并展示日志信息。
- **示例代码**:展示如何在Logback配置和应用程序中集成WebSocket日志输出。
- **文档**:详细说明如何配置和使用这套系统,包括安装、配置示例、问题排查等。
利用Logback和WebSocket实现日志实时传输,可以极大地提升日志管理和监控的效率,同时保持代码的简洁性。对于开发者而言,这是一项非常实用的技术,特别是在需要实时查看和分析日志的项目中。
qq_28452999
- 粉丝: 12
- 资源: 1
最新资源
- 6.1随机密码生成.py
- putty,linux客户端工具
- 丹佛丝堆垛机变频器参数配置起升、运行、货叉
- redhat-lsb-core,安装磐维数据库,安装oracle数据库等常用的依赖包
- lsb-release,安装磐维数据库,安装oracle数据库等常用的依赖包
- glibc-devel,安装磐维数据库,安装oracle数据库等常用的依赖包
- redhat-lsb-submit-security,安装磐维数据库,安装oracle数据库等常用的依赖包
- 可以在mac下开发的微雪esp32触摸屏开发板的支持包
- redhat-lsb-core,安装磐维数据库,安装oracle数据库等常用的依赖包
- redhat-lsb-core,安装磐维数据库,安装oracle数据库等常用的依赖包