版权声明:本文为博主武伟峰原创文章,转载请注明地址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即可。就是这么简单。

SpringBoot中logback日志保存到mongoDB相关推荐

  1. SpringBoot中Logback常用配置以及自定义输出到MySql数据库

    之前基于SpringBoot开发的项目运行一段时间后,客户使用网站偶尔会出现接口调用失败的情况,每次产品经理询问是怎么回事的时候,都需要让运维提下最近的日志才能分析具体原因,这样时效性和便利性不能满足 ...

  2. SpringBoot中LogBack日志输出配置记录

    <?xml version="1.0" encoding="UTF-8"?><!-- Created by jinKai on 2017/1/ ...

  3. springboot yml怎么建常量_【Java】SpringBoot 中从application.yml中获取自定义常量

    由于这里我想通过java连接linux,connection连接需要host.port.username.password及其他路径等等.不想每次修改的时候都去改源文件,所以想写在applicatio ...

  4. log4j2的一些配置,为某个类某个方法单独文件打印日志,定时删除日志和springboot的logback日志单独类打印

    log4j2.xml配置如下:<?xml version="1.0" encoding="UTF-8"?> <!-- status=" ...

  5. Springboot中mongodb的使用

    mongodb是最早热门非关系数据库的之一,使用也比较普遍,一般会用做离线数据分析来使用,放到内网的居多.由于很多公司使用了云服务,服务器默认都开放了外网地址,导致前一阵子大批 MongoDB 因配置 ...

  6. Pandas的学习(读取mongodb数据库集合到DataFrame,将DataFrame类型数据保存到mongodb数据库中)

    1.读取mongodb数据库集合到DataFrame import pymongo import pandas as pdclient = pymongo.MongoClient("数据库连 ...

  7. python日志内容存储到文件里_Python中如何实现将logging日志保存到文件中

    Python中如何实现将logging日志保存到文件中 发布时间:2020-11-09 17:03:14 来源:亿速云 阅读:66 今天就跟大家聊聊有关Python中如何实现将logging日志保存到 ...

  8. 分布式系统:SpringBoot中Dubbo以及Zookeeper依赖包冲突 LoggerFactory is not a Logback LoggerContext but Logback

    目录 QUESTION:SpringBoot中Dubbo以及Zookeeper依赖包冲突? ANSWER: 导入curator-recipes依赖: 排除依赖: QUESTION:SpringBoot ...

  9. springboot中mongodb自定义类型转换器

    文章目录 1 场景 1.1 BigDecimal写入mongo 1.2 人工转换 1.3 自定义转换器 2 版本 3 步骤 3.1 定义转换器 3.2 配置mongoDb工厂类 3.3 加载自定义转换 ...

最新文章

  1. 解决GPU模型训练的随机性
  2. Mac pycharm flask 用内网ip 运行 web
  3. python环境变量配置_Python的安装、认识、配置环境变量以及helloworld打印的两种方式
  4. Basic concepts behind Web Audio API
  5. Struts2 stracture
  6. 一个成型的awt所必须的frame组件
  7. 2014年计算机职称考试试题库,2014年职称计算机考试全真模拟试卷(1)
  8. foreach进不去报错java_为什么阿里巴巴Java开发手册中强制要求不要在foreach循环里进行元素的remove和add操作...
  9. ip地址怎么设置才有效_房产遗嘱怎么写才有效?需要公证吗?
  10. JAVA中文件下载和文件批量下载方法
  11. 手机远程锁定计算机,手机怎么控制电脑 手机远程控制电脑关机方法
  12. 解放军--女“黑客”
  13. linux中用来保存组账户的文件,Linux账户管理的几个文件
  14. HOJ 12814 SIRO Challenge (状态压缩DP)
  15. 3万字BI系统整体建设解决方案
  16. CRMchat 客服系统
  17. 破解“低代码”的4大误区,拥抱低门槛高效率的软件开发新选择 ZT
  18. HTML与CSS实现网页的超链接及美化
  19. Linux上安装ArcGIS for Server超详细教程——以Redhat6.5上安装ArcGIS for Server 10.3.1为例
  20. Scene…… couldn‘t be loaded because it has not been added to the build settings or the AssetBundle...

热门文章

  1. 山东财经大学python实验六答案_实验六(带答案)
  2. 统计学习方法笔记(三)-朴素贝叶斯原理及python实现
  3. 名校华人教授专门设局诈骗中国留学生,4年吸金超百万美元,连亲戚也没放过...
  4. AI学高数达到MIT本科水平,学了微积分线性代数概率论等6门课,不光能做题还能出题...
  5. 芯片开发者46%年收入达30万元,7纳米制程以内开发者30%超50万元
  6. 谷歌甲骨文Java专利大战终审判决:安卓使用Java不构成侵权
  7. 如何0代码、快速定制企业级NLP模型?百度技术大咖在线解析,可报名
  8. 皮猜按下谷歌招聘暂停键,疫情之下,「紧日子」来了
  9. 英语和汉语谁更高效?17大主流语言测试结果:没有优劣之分,带宽都是每秒39bit...
  10. VUE 动态给对象增加属性,并触发视图更新。