java 如何实现在线日志
创始人
2024-05-30 19:36:33
0

如何采集springboot日志至web页面查看

实现方案

基于Filter方式,在日志输出至控制台前,LoggerFitler 拦截日志通过websocket推送至前台页面

实现逻辑:
LoggerFilter采集日志添加至LoggerQueue队列,
LoggerConsumer 从LoggerQueue中采集推送至前台页面

pushpullsocketLoggerFilterLoggerQueueLoggerConsumerwsLog.html

1. 配置拦截器

  • logback 在appender中指定filter 拦截
%magenta(%d{yyyy-MM-dd HH:mm:ss.SSS}) %highlight(%-5level) %green([%thread]) %logger{40}: %m %nutf8

2. 代码逻辑

2.1 LoggerFilter 拦截日志来源

从ILoggingEvent 获取日志信息,封装为LoggerMessage ,添加至日志队列

public class LoggerFilter extends Filter {private String formatTime(long timestamp) {SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");return simpleDateFormat.format(new Date(timestamp));}/*** 解析日志事件信息内容 加入队列** @param event 日志事件*/@Overridepublic FilterReply decide(ILoggingEvent event) {LoggerMessage log = new LoggerMessage();log.setClassInfo(event.getLoggerName());log.setLogTime(formatTime(event.getTimeStamp()));log.setLogInfo(event.getFormattedMessage());log.setLogLevel(event.getLevel().levelStr);String exception = "";IThrowableProxy throwableProxy = event.getThrowableProxy();if (throwableProxy != null) {exception = ThrowableProxyUtil.asString(throwableProxy);}log.setErrorInfo(exception);LoggerQueue.getInstance().push(log);return FilterReply.ACCEPT;}
}

2.2 LoggerQueue 提供日志的存放与获取

内置队列管理器, 提供pull 和push方法
代码未优化,队列应该选择先进先出

public class LoggerQueue {/*** 最大队列大小*/public static final int QUEUE_MAX_SIZE = 10000;/*** 日志队列*/private static LoggerQueue loggerQueue = new LoggerQueue();/*** 阻塞队列*/private BlockingQueue blockingQueue = new LinkedBlockingQueue(QUEUE_MAX_SIZE);private LoggerQueue() {}public static LoggerQueue getInstance() {return loggerQueue;}/*** 推送最新日志消息** @param loggerMessage 日志消息* @return 是否成功*/public boolean push(LoggerMessage loggerMessage) {return this.blockingQueue.add(loggerMessage);//队列满了就抛出异常,不阻塞}/*** 拉取最新日志消息** @return 日志消息*/public LoggerMessage pull() {LoggerMessage loggerMessage = null;try {loggerMessage = this.blockingQueue.take();} catch (InterruptedException e) {e.printStackTrace();}return loggerMessage;}
}

2.4 WebSocketLoggerConsumer 实现消息推送至websocket

开启固定线程,获取日志队列信息,推送至websocket

@Component
public class WebSocketLoggerConsumer implements LoggerConsumer {@Resourceprivate SimpMessagingTemplate messagingTemplate;/*** 创建日志消费线程池*/@PostConstructpublic void createLogExecutor() {ExecutorService executorService = Executors.newFixedThreadPool(1);Runnable runnable = new Runnable() {@Overridepublic void run() {while (true) {LoggerQueue loggerQueue = LoggerQueue.getInstance();if (loggerQueue != null) {consumer(loggerQueue.pull());}}}};executorService.submit(runnable);}@Overridepublic void consumer(LoggerMessage loggerMessage) {messagingTemplate.convertAndSend("/topic/log", loggerMessage.toString());}
}

3. 测试

3.1 测试示例

1s 写入1条info日志,2s 写入1条warn 日志

    @Scheduled(fixedDelay = 1000)private void mockLogInfoData() {logger.info("logger info data!");}@Scheduled(fixedDelay = 2000)private void mockLogWarnData() {logger.warn("logger warn data!");}

3.2 idea 控制台日志:

在这里插入图片描述

3.3 socket日志效果

在这里插入图片描述

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...