当前位置: 移动技术网 > IT编程>开发语言>Java > SpringBoot中logback日志保存到mongoDB的方法

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

2019年07月19日  | 移动技术网IT编程  | 我要评论

唐易康官网,好视力眼贴产品介绍,王立群读史记之项羽

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即可。就是这么简单。

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网