首页 > 开发 > Java > 正文

SpringBoot中logback日志保存到mongoDB的方法

2024-07-13 10:14:00
字体:
来源:转载
供稿:网友

Springboot默认集成的就是logback,logback相对来说是优秀于log4j的,log4j2也是参考了logback的设计。

自定义Appender非常简单,继承一下AppenderBase类即可。

可以看到有个AppenderBase,有个UnsynchronizedAppenderBase,还有个AsyncAppenderBase继承了UnsynchronizedAppenderBase。从名字就能看出来区别,异步的、普通的、不加锁的。

我们定义一个MongoDBAppender继承UnsynchronizedAppenderBase

public class MongoDBAppender extends     UnsynchronizedAppenderBase<ILoggingEvent> {    @Override   protected void append(ILoggingEvent eventObject) {     MongoTemplate mongoTemplate = ApplicationContextProvider.getBean(MongoTemplate.class);     if (mongoTemplate != null) {       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());       mongoTemplate.insert(doc, "log");     }   }  } 

必须要实现一个append方法,这个方法就是logback输出日志的地方,日志都保存在eventObject对象中,我们只需要获取对象里的值并做自己的处理即可。

我们可以想象为,系统的ConsoleAppender就是不停的System.out.print(eventObject.getXXX),而FileAppender就是用OutpuptStream输出到文件里。

我们要做的就是把日志保存到mongo里,Springboot已经提供了MongoTemplate模板,需要注意日志输出是随着系统启动就开始的,而刚开始时MongoTemplate还没有被初始化,是需要等待Spring给MongoTemplate赋值的。所以刚开始时为null,需要等spring初始化完毕,MongoTemplate才有值。

由于这个Appender不归spring管理,所以我采用单独获取bean的方式。其中ApplicationContextProvider如下:

@Component public class ApplicationContextProvider implements ApplicationContextAware {   private static ApplicationContext context;    public static ApplicationContext getApplicationContext() {     return context;   }    @Override   public void setApplicationContext(ApplicationContext ac)       throws BeansException {     context = ac;   }    public static <T> T getBean(Class<T> tClass) {     return context.getBean(tClass);   }    public static <T> T getBean(String name, Class<T> tClass) {     return context.getBean(name, tClass);   } } 

上面mongo操作日志入库的比较简单,字段也没有用完,大家可以根据自己希望保存的属性来设计mongo的结构,然后入库。

pom.xml

    <dependency>      <groupId>org.mongodb</groupId>      <artifactId>mongo-java-driver</artifactId>      <version>3.4.2</version>    </dependency>    <dependency>      <groupId>ch.qos.logback</groupId>      <artifactId>logback-core</artifactId>      <version>1.1.11</version>    </dependency>    <dependency>       <groupId>ch.qos.logback</groupId>       <artifactId>logback-classic</artifactId>       <version>1.1.11</version>     </dependency> 

在Spring-logback.xml使用也很简单 

<?xml version="1.0" encoding="UTF-8"?> <configuration>   <include resource="org/springframework/boot/logging/logback/base.xml" />    <appender name="MY_FILE" class="com.example.demo.mongo.MongoDBAppender">   </appender>   <!-- 测试环境+开发环境. 多个使用逗号隔开. -->   <springProfile name="test,dev">     <logger name="org.springframework.web" level="INFO">       <appender-ref ref="MY_FILE"/>     </logger>     <logger name="com.example" level="INFO" />   </springProfile>   </configuration> 

只需要指明appender 的class即可。就是这么简单。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持VeVb武林网。


注:相关教程知识阅读请移步到JAVA教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表