SpringBoot中logback日志保存到mongoDB
版权声明:本文为博主武伟峰原创文章,转载请注明地址http://blog.csdn.net/tianyaleixiaowu。
前面提到过logback输出日志的多种方式,这一篇看一下自定义Appender,将logback输出的日志保存到mongo中。
自定义Appender非常简单,继承一下AppenderBase类即可。
可以看到有个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?
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如下:
[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?
@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的结构,然后入库。
在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?
<?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即可。就是这么简单。
SpringBoot中logback日志保存到mongoDB相关推荐
- SpringBoot中Logback常用配置以及自定义输出到MySql数据库
之前基于SpringBoot开发的项目运行一段时间后,客户使用网站偶尔会出现接口调用失败的情况,每次产品经理询问是怎么回事的时候,都需要让运维提下最近的日志才能分析具体原因,这样时效性和便利性不能满足 ...
- SpringBoot中LogBack日志输出配置记录
<?xml version="1.0" encoding="UTF-8"?><!-- Created by jinKai on 2017/1/ ...
- springboot yml怎么建常量_【Java】SpringBoot 中从application.yml中获取自定义常量
由于这里我想通过java连接linux,connection连接需要host.port.username.password及其他路径等等.不想每次修改的时候都去改源文件,所以想写在applicatio ...
- log4j2的一些配置,为某个类某个方法单独文件打印日志,定时删除日志和springboot的logback日志单独类打印
log4j2.xml配置如下:<?xml version="1.0" encoding="UTF-8"?> <!-- status=" ...
- Springboot中mongodb的使用
mongodb是最早热门非关系数据库的之一,使用也比较普遍,一般会用做离线数据分析来使用,放到内网的居多.由于很多公司使用了云服务,服务器默认都开放了外网地址,导致前一阵子大批 MongoDB 因配置 ...
- Pandas的学习(读取mongodb数据库集合到DataFrame,将DataFrame类型数据保存到mongodb数据库中)
1.读取mongodb数据库集合到DataFrame import pymongo import pandas as pdclient = pymongo.MongoClient("数据库连 ...
- python日志内容存储到文件里_Python中如何实现将logging日志保存到文件中
Python中如何实现将logging日志保存到文件中 发布时间:2020-11-09 17:03:14 来源:亿速云 阅读:66 今天就跟大家聊聊有关Python中如何实现将logging日志保存到 ...
- 分布式系统:SpringBoot中Dubbo以及Zookeeper依赖包冲突 LoggerFactory is not a Logback LoggerContext but Logback
目录 QUESTION:SpringBoot中Dubbo以及Zookeeper依赖包冲突? ANSWER: 导入curator-recipes依赖: 排除依赖: QUESTION:SpringBoot ...
- springboot中mongodb自定义类型转换器
文章目录 1 场景 1.1 BigDecimal写入mongo 1.2 人工转换 1.3 自定义转换器 2 版本 3 步骤 3.1 定义转换器 3.2 配置mongoDb工厂类 3.3 加载自定义转换 ...
最新文章
- 解决GPU模型训练的随机性
- Mac pycharm flask 用内网ip 运行 web
- python环境变量配置_Python的安装、认识、配置环境变量以及helloworld打印的两种方式
- Basic concepts behind Web Audio API
- Struts2 stracture
- 一个成型的awt所必须的frame组件
- 2014年计算机职称考试试题库,2014年职称计算机考试全真模拟试卷(1)
- foreach进不去报错java_为什么阿里巴巴Java开发手册中强制要求不要在foreach循环里进行元素的remove和add操作...
- ip地址怎么设置才有效_房产遗嘱怎么写才有效?需要公证吗?
- JAVA中文件下载和文件批量下载方法
- 手机远程锁定计算机,手机怎么控制电脑 手机远程控制电脑关机方法
- 解放军--女“黑客”
- linux中用来保存组账户的文件,Linux账户管理的几个文件
- HOJ 12814 SIRO Challenge (状态压缩DP)
- 3万字BI系统整体建设解决方案
- CRMchat 客服系统
- 破解“低代码”的4大误区,拥抱低门槛高效率的软件开发新选择 ZT
- HTML与CSS实现网页的超链接及美化
- Linux上安装ArcGIS for Server超详细教程——以Redhat6.5上安装ArcGIS for Server 10.3.1为例
- Scene…… couldn‘t be loaded because it has not been added to the build settings or the AssetBundle...
热门文章
- 山东财经大学python实验六答案_实验六(带答案)
- 统计学习方法笔记(三)-朴素贝叶斯原理及python实现
- 名校华人教授专门设局诈骗中国留学生,4年吸金超百万美元,连亲戚也没放过...
- AI学高数达到MIT本科水平,学了微积分线性代数概率论等6门课,不光能做题还能出题...
- 芯片开发者46%年收入达30万元,7纳米制程以内开发者30%超50万元
- 谷歌甲骨文Java专利大战终审判决:安卓使用Java不构成侵权
- 如何0代码、快速定制企业级NLP模型?百度技术大咖在线解析,可报名
- 皮猜按下谷歌招聘暂停键,疫情之下,「紧日子」来了
- 英语和汉语谁更高效?17大主流语言测试结果:没有优劣之分,带宽都是每秒39bit...
- VUE 动态给对象增加属性,并触发视图更新。