背景
日志模块是系统的重要组成部分,主要负责记录系统运行状态和定位错误问题的功能。通常,日志分为系统日志、操作日志和安全日志三类。虽然分布式数据平台是当前微服务架构中的重要部分,但本文的重点并不在此,而是聚焦于自定义 Appender 及一些成熟 Appender 的介绍。针对操作日志,我们仍然采用切面编程的方式。鉴于日志数量较大的特点,我们选择使用 MongoDB 进行日志存储,而未采用传统的日志平台解决方案。
本系统采用的日志方案是logback,所以下面的一些appender也是继承
ch.qos.logback.core.Appender类。
MongoDBAppender
类图
代码实现
实现也就是按服务分别存储到日志的集合中,同时也存储个日期,方便日后日志的清空操作。
@Override
protected 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