SpringBoot学习6之Logback日志导入mongodb
正如前文所说,springboot自带logback作为其日志新系统,但是在实际工作中,我们常常需要对日志进行管理或分析,如果只是单纯的将日志导入文本文件,则在查询时操作过于繁琐,如果将其导入mysql等关系型数据库进行存储,又太影响系统性能,同时由于Mysql其结构化的信息存储结构,导致在存储时不够灵活。因此,本文在此考虑将springboot系统中产出的日志(logback) 存入mongodb中。
实现步骤
1. 添加依赖
1 | <dependency> |
2. 在项目资源文件下src/main/resources下添加logback.xml
1 |
|
上文中分别配置了mongodb的appender, 并起名为MONGODB,并启用
3. 在项目Springboot.Springboot包下创建类MongoDBAppender
1 | public class MongoDBAppender extends UnsynchronizedAppenderBase<LoggingEvent> { |
4. 启动Mongodb服务器,运行项目
访问数据库发现,已经成功将日志插入
有待解决问题
- 系统启动速度巨慢无比,有待解决
- 有关数据库配置的问题,可以使用springboot的文件配置标签进行配置,将相关信息统一放在application.yml文件中,这样避免将数据库配置信息直接写在代码中,降低代码耦合性(具体详情请查阅SpringBoot学习2之配置文件)
问题解决
为了解决以上出现的两个问题,本人通过调研一些资料发现了解决办法,但是并没有弄清具体问题出现的原因。
问题1:启动速度慢
因为之前调用Mongodb是自己添加的java驱动,实际上springboot有自己内置的mongodb接口,可以直接使用, 我们使用这套方法,执行效率几乎不受任何影响
1. 替换依赖,将之前的依赖
1 | <dependency> |
替换成
1 | <dependency> |
2. 添加实体类
1 | public class MyLog { |
@Id 该标签对应Mongodb中的_id
3. 添加数据访问接口
1 | public interface LogRepository extends MongoRepository<MyLog, String> { |
4. 修改appender类
1 |
|
有的人看到这里可能疑惑了,为什么不直接使用@Autowired注解,直接将LogRepository注入到代码里,而非要使用实现ApplicationContextAware 接口的方法,重写public void setApplicationContext(ApplicationContext applicationContext) 手动注入呢?
这里本人遇到了一个坑,刚开始确实采用了@Autowired方法尝试注入,后来发现在日志读取过程中,logRepository一直是null,后来经过调查发现,**logback 的appender 在spring加载类之前创建,所以也即是说,在spring加载类之前该类已经投入使用,所以没有办法注入logRepository**
为了解决这个问题,只能“手动”注入了,将其声明为静态变量,并采用懒加载的方式进行加载。
问题2:数据库信息配置
在application.yml中配置如下即可
1 | spring: |
这里也可以使用带密码形式的设置
1 | spring: |
但是由于Mongdb进入3.0版本后更改了其默认认证方式,而springboot依然停留在老版本,所以虽然账号密码都输入正确,但是依然无法登陆成功。
在这里我们可以修改mongodb的默认认证方式
解决办法参考了解
http://blog.csdn.net/wlzx120/article/details/52311777