log4j-将日志内容写到数据库

log4j-将日志内容写到数据库

起男 351 2023-10-25

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