背景
日志模块是系统的重要组成部分,主要负责记录系统运行状态和定位错误问题的功能。通常,日志分为系统日志、操作日志和安全日志三类。虽然分布式数据平台是当前微服务架构中的重要部分,但本文的重点并不在此,而是聚焦于自定义 Appender 及一些成熟 Appender 的介绍。针对操作日志,我们仍然采用切面编程的方式。鉴于日志数量较大的特点,我们选择使用 MongoDB 进行日志存储,而未采用传统的日志平台解决方案。
本系统采用的日志方案是logback,所以下面的一些appender也是继承
ch.qos.logback.core.Appender类。
MongoDBAppender
类图
代码实现
实现也就是按服务分别存储到日志的集合中,同时也存储个日期,方便日后日志的清空操作。
@Overrideprotected void append(ILoggingEvent eventObject) {if (mongoTemplate == null) {mongoTemplate = SpringContextUtil.getBean(MongoTemplate.class);} else {if ("DEBUG".equals(eventObject.getLevel().toString())) {return;}String microServiceName = EnvUtil.single().getEnv("spring.application.name", "").toUpperCase();String activeProfile = EnvUtil.single().getEnv("spring.profiles.active", "").toUpperCase();final String documentName = microServiceName + "_" + activeProfile + CoreConstant.MongoDbLogConfig.MONGODB_LOG_SUFFIX.value();final BasicDBObject doc = new BasicDBObject();doc.append("level", eventObject.getLevel().toString());doc.append("logger", eventObject.getLoggerName());doc.append("thread", eventObject.getThreadName());doc.append("message", eventObject.getFormattedMessage());doc.append("microServiceName", microServiceName);try {doc.append("getArgumentArray", JSON.toJSONString(eventObject.getArgumentArray()));} catch (Exception e) {logger.error("日志参数转换错误!");}doc.append(CoreConstant.MongoDbLogConfig.CREATE_DATE_FIELD.value(), new Date(eventObject.getTimeStamp()));mongoTemplate.insert(doc, documentName);}}
JSON日志配置
引用包
要注意版本,如果启动有问题,可以根据异常去查找下,网上会给出正确的版本,我用的是springboot2.7.3,这里就用7.3版本。
<dependency><groupId>net.logstash.logback</groupId><artifactId>logstash-logback-encoder</artifactId><version>7.3</version></dependency>
logback配置
根据实际情况减少或者增加内容
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder"><providers><!-- 日志时间 --><timestamp><timeZone>UTC+08:00</timeZone></timestamp><!-- 日志级别 --><logLevel/><pattern><pattern>{"file": "%file","class": "%logger","line": "%line"}</pattern></pattern><!-- 线程名称 --><threadName/><!-- 记录器名称 --><loggerName/><!-- 日志消息 --><message/><!-- 异常堆栈信息 --><stackTrace/><!-- 自定义字段(如果有) --><mdc/><!-- repeats log arguments as root json fields --><arguments/><logstashMarkers/></providers></encoder></appender>
总结
在第二篇中我将对操作日志和安全日志的实现进行一些处理,本节相关代码链接如下。
GitCode - 全球开发者的开源社区,开源代码托管平台GitCode是面向全球开发者的开源社区,包括原创博客,开源代码托管,代码协作,项目管理等。与开发者社区互动,提升您的研发效率和质量。https://gitcode.com/YouYouLongLong/springcloud-framework/blob/master/core-common-parent/logs-common/src/main/java/org/cloud/logger/MongoDBAppender.java