log4j-将日志内容写到数据库
slf4j没有提供拦截日志内容的扩张,这里使用的是log4j提供的插件功能
编写插件
@Plugin(name = "MyLogFilter", category = Node.CATEGORY, elementType = Filter.ELEMENT_TYPE, printObject = true)
public class MyLogFilter extends AbstractFilter {
@SneakyThrows
@Override
public Result filter(LogEvent event) {
//利用LogEvent获取日志信息
Object traceid = event.getContextData().getValue("traceid");//自定义信息
String className = event.getSource().getClassName();//类名
//过滤掉无用的系统日志
if (traceid!=null && !"".equals(traceid)){
//封装log对象
Log log = new Log()
.setTraceId((String) traceid)
.setUserId((String) userid)
.setMsg(event.getMessage().getFormattedMessage())
.setDate(new Date())
.setLevel(event.getLevel().name())
.setClassName(className);
//将日志放入缓存队列
LogJob.queue.put(log);
}
return super.filter(event);
}
//插件工厂对象,控制此插件的创建
@PluginFactory
public static MyLogFilter createFiler(){
return new MyLogFilter();
}
}
注意:此插件会拦截大量的系统日志,注意过滤
激活插件
在resource的log4j2.xml中添加配置
<Loggers>
<!-- 根日志设置 -->
<Root level="debug">
<!--只需要这一个就可用了-->
<MyLogFilter />
<AppenderRef ref="CONSOLE" level="debug"/>
<AppenderRef ref="FILE-APPENDER" level="info"/>
</Root>
<!--spring日志-->
<Logger name="org.springframework" level="info"/>
<!-- mybatis日志 -->
<Logger name="com.mybatis" level="warn"/>
</Loggers>
写入数据库
@Component
public class LogJob {
@Autowired
private LogDao logDao;
//缓存队列
public static BlockingQueue<Log> queue = new LinkedBlockingQueue();
@PostConstruct
public void init(){
Thread thread = new Thread(()->{
execInsertLog();
});
thread.setName("log_job");
thread.start();
}
/**
* 添加日志
*/
@SneakyThrows
private void execInsertLog() {
while (true){
Log log = queue.take();
logDao.insert(log);
}
}
}
参考文章:
https://blog.csdn.net/SSAA123LJIO1/article/details/130422784
https://blog.csdn.net/zyx1260168395/article/details/126539475
也可用直接使用官方提供的功能,参考:
https://blog.csdn.net/qq_16127313/article/details/132917498