博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring整合log4j过滤器,进行日志过滤,日志记录到数据库
阅读量:6834 次
发布时间:2019-06-26

本文共 3434 字,大约阅读时间需要 11 分钟。

hot3.png

很早以前弄过将log4j的日志存储到数据库,不过是配置在properties文件,包括数据库配置也是写死的。现在正好有个需求要把日志存储到数据库中,还要进行过滤,只有本项目的才会进行保存,像Spring,mybatis,zookeeper这类的日志不需要进行保存,而且现在配置是动态的,根据不同的环境,有不同的数据库,而使用properties达不到这么灵活的效果,只能把properties改为使用xml来配置,但是好多例子在xml也是写死的数据库配置,如果想达到动态配置,需要依赖一个logback扩展jar。

文档地址:,

先增加maven依赖:

org.logback-extensions
logback-ext-spring
0.1.4

logback.xml如下,配置的比较简单,还没配置输出到文件:

下面开始整合,使用的Spring的xml形式:

在web.xml中增加监听器配置,如下:

ch.qos.logback.ext.spring.web.LogbackConfigListener
logbackConfigLocation
classpath:logback.xml

文档中给出spring的bean配置类为:

ch.qos.logback.core.ConsoleAppender

但是这个类没有支持过滤器配置,所以建一个类,继承ConsoleAppender,如下:

import ch.qos.logback.core.filter.Filter;import java.util.List;public class ConsoleAppender extends ch.qos.logback.core.ConsoleAppender {    private List
filters; public List
getFilters() { return filters; } public void setFilters(List
filters) { this.filters = filters; if (this.filters != null) { for (Filter filter : filters) { addFilter(filter); } } }}

过滤器支持多个,所以使用List,在setFilters方法中遍历,将过滤器添加上,

下面为spring的xml配置:

LogFilter类代码为:

import ch.qos.logback.classic.spi.LoggerContextVO;import ch.qos.logback.classic.spi.LoggingEvent;import ch.qos.logback.core.filter.Filter;import ch.qos.logback.core.spi.FilterReply;import com.system.dao.log.Log;import com.system.service.log.LogService;import org.slf4j.Marker;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Component;import java.util.Date;import java.util.Map;public class LogFilter extends Filter
{ //日志保存的Service @Autowired private LogService LogService; @Override public FilterReply decide(LoggingEvent event) { String loggerName = event.getLoggerName(); /** * 项目本身的日志才会进行保存 */ if (loggerName.startsWith("com.system")) { Log log = new Log(); log.setClazzName(loggerName); Date date = new Date(event.getTimeStamp()); log.setLogTimestamp(date); log.setCreateTime(date); log.setUpdateTime(date); /** * 使用toString,会带有日志级别 */ log.setMessage(event.toString()); /** * 保存日志,使用Spring的异步执行 */ LogService.asyncSave(log); } return FilterReply.ACCEPT; }}

使用Spring的xml配置到此结束。

异常情况处理:

本地启动项目时是没问题的,日志也能进行保存,但是部署到测试环境出现了如下异常:

java.lang.ClassCastException:org.slf4j.impl.Log4jLoggerFactory

cannot be cast to ch.qos.logback.classic.LoggerContext,

通过使用IDEA查看pom文件的依赖树,发现zookeeper依赖了slf4j-log4j12,也同样实现了ILoggerFactory接口,但是没有实现Context接口,导致类转换失败,将依赖去掉即可,不影响项目的正常运行,如下:

com.101tec
zkclient
0.10
org.slf4j
slf4j-log4j12

 

转载于:https://my.oschina.net/857359351/blog/1593082

你可能感兴趣的文章
centos7源码安装php5.6并安装pthreads扩展
查看>>
网络基础~linux路由与网关、路由命令
查看>>
强大的联想4U机架式服务器ThinkSystem SR950
查看>>
美国防部:美国×××防御系统存在诸多安全问题
查看>>
阿里云搭建lamp平台
查看>>
Reverse Integer之Java实现
查看>>
Linux的SSH服务初学
查看>>
不同于FTP的另一款文件传输工具
查看>>
MYSQL 逻辑架构
查看>>
第11课--11_04_Linux网络配置之四 ifconfig及ip命令详解
查看>>
Linux命令之grep/sed/awk等行转列
查看>>
3.1 账户管理
查看>>
MySQL 多张表合并成一张表
查看>>
朋友圈广告投放优势及广告投放案例分享
查看>>
vivo Z3的Usb调试模式在哪里,开启vivo Z3Usb调试模式的教程
查看>>
能够让你提升的九个 Python 小技巧
查看>>
css3 greyscale实现去色 css3实现图片或页面变为黑白效果
查看>>
默认路由的配置
查看>>
AJPFX辨析Java中运算符 ++ 和 += 的区别
查看>>
如何在CAD中提取图纸上标注的内容
查看>>