SpringBoot中logback日志保存到mongoDB-阿里云开发者社区

开发者社区> 互联网编程> 正文

SpringBoot中logback日志保存到mongoDB

简介: 版权声明:本文为博主武伟峰原创文章,转载请注明地址http://blog.csdn.net/tianyaleixiaowu。 前面提到过logback输出日志的多种方式,这一篇看一下自定义Appender,将logback输出的日志保存到mongo中。
+关注继续查看

版权声明:本文为博主武伟峰原创文章,转载请注明地址http://blog.csdn.net/tianyaleixiaowu

前面提到过logback输出日志的多种方式,这一篇看一下自定义Appender,将logback输出的日志保存到mongo中。

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

img_bc011d44efcfe51af9d0e41189c623cd.jpe
image

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

我们定义一个MongoDBAppender继承UnsynchronizedAppenderBase

[java] view plaincopy

<embed id="ZeroClipboardMovie_1" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="22" height="12" name="ZeroClipboardMovie_1" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=1&width=22&height=12" wmode="transparent" style="user-select: text !important;"> print?

  1. public class MongoDBAppender extends

  2. UnsynchronizedAppenderBase<ILoggingEvent> {

  3. @Override

  4. protected void append(ILoggingEvent eventObject) {

  5. MongoTemplate mongoTemplate = ApplicationContextProvider.getBean(MongoTemplate.class);

  6. if (mongoTemplate != null) {

  7. final BasicDBObject doc = new BasicDBObject();

  8. doc.append("level", eventObject.getLevel().toString());

  9. doc.append("logger", eventObject.getLoggerName());

  10. doc.append("thread", eventObject.getThreadName());

  11. doc.append("message", eventObject.getFormattedMessage());

  12. mongoTemplate.insert(doc, "log");

  13. }

  14. }

  15. }

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

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

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

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

[java] view plaincopy

<embed id="ZeroClipboardMovie_2" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="22" height="12" name="ZeroClipboardMovie_2" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=2&width=22&height=12" wmode="transparent" style="user-select: text !important;"> print?

  1. @Component

  2. public class ApplicationContextProvider implements ApplicationContextAware {

  3. private static ApplicationContext context;

  4. public static ApplicationContext getApplicationContext() {

  5. return context;

  6. }

  7. @Override

  8. public void setApplicationContext(ApplicationContext ac)

  9. throws BeansException {

  10. context = ac;

  11. }

  12. public static <T> T getBean(Class<T> tClass) {

  13. return context.getBean(tClass);

  14. }

  15. public static <T> T getBean(String name, Class<T> tClass) {

  16. return context.getBean(name, tClass);

  17. }

  18. }

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

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

[html] view plaincopy

<embed id="ZeroClipboardMovie_3" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="22" height="12" name="ZeroClipboardMovie_3" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=3&width=22&height=12" wmode="transparent" style="user-select: text !important;"> print?

  1. <?xml version="1.0" encoding="UTF-8"?>

  2. <configuration>

  3. <include resource="org/springframework/boot/logging/logback/base.xml" />

  4. <appender name="MY_FILE" class="com.example.demo.mongo.MongoDBAppender">

  5. </appender>

  6. <springProfile name="test,dev">

  7. <logger name="org.springframework.web" level="INFO">

  8. <appender-ref ref="MY_FILE"/>

  9. </logger>

  10. <logger name="com.example" level="INFO" />

  11. </springProfile>

  12. </configuration>

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Spring Boot 日志配置
Spring Boot 日志配置 默认日志 Logback: 默认情况下,Spring Boot会用Logback来记录日志,并用INFO级别输出到控制台。
1061 0
spring中日志相关对象的创建过程
spring中日志相关对象的创建过程,logback的扩展标签支持
2506 0
java B2B2C Springboot电子商务平台源码-统一日志管理ELK
什么是ELK?ELK是三个开源软件的缩写,分别表示:Elasticsearch , Logstash, Kibana , 它们都是开源软件。新增了一个FileBeat,它是一个轻量级的日志收集处理工具(Agent),Filebeat占用资源少,适合于在各个服务器上搜集日志后传输给Logstash,官方也推荐此工具。
1023 0
SSH框架系列:Spring AOP应用记录日志Demo
    分类: 【java】2013-12-10 18:53 724人阅读 评论(0) 收藏 举报 1.简介 Spring 中的AOP为Aspect Oriented Programming的缩写,面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。
672 0
SpringBoot中logback日志保存到mongoDB
版权声明:本文为博主武伟峰原创文章,转载请注明地址http://blog.csdn.net/tianyaleixiaowu。 前面提到过logback输出日志的多种方式,这一篇看一下自定义Appender,将logback输出的日志保存到mongo中。
1210 0
SpringBoot 修改启动日志输出
在 springboot 项目启动时我们可以自定义输出图案 springboot - start - log - println
1838 0
多模式日志数据流的实时加工与集散
日志处理是一个极其繁琐的过程,究其原因是日志的边界情况特别多,而且可能随时在变。阿里云 SLS 数据加工服务是专门针对日志规整、富化、集散等处理场景。本文主要介绍在多模式混杂的日志集散场景下,如何快速使用 SLS 数据加工服务完成需求。
85 0
Spring-Aop处理记录日志
AOP的几种通知类型: 1,前置通知(Before advice):在某连接点(JoinPoint)之前执行的通知,但这个通知不能阻止连接点前的执行 配置文件中使用 &lt;aop:before&gt;进行声明 注解使用 @Before 进行声明 2,后置通知(After advice):当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)。
2485 0
IDEA运行SpringBoot项目控制台输出颜色高亮的日志
IDEA运行SpringBoot项目控制台输出颜色高亮的日志
969 0
+关注
互联网编程
讲个笑话,我有50年的Java编程经验,哈哈哈
281
文章
2
问答
文章排行榜
最热
最新
相关电子书
更多
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载
《2021云上架构与运维峰会演讲合集》
立即下载