log4j2官方例子在spring boot中报错而且还是用的是org.apache.commons.dbcp包

我给改了一下使用org.apache.commons.dbcp2包

1.log4j2.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="error">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
</Console>
<JDBC name="DBLogger" tableName="MicroServiceLogHandle">
<ConnectionFactory class="com.malls.common.tool.LogConnectionFactory"
method="getDatabaseConnection" />
<Column name="RequestKey" pattern="${sd:RequestKey}" />
<Column name="LogType" pattern="${sd:LogType}" />
<Column name="RequestUrl" pattern="${sd:RequestUrl}" />
<Column name="UserName" pattern="${sd:UserName}" />
<Column name="OrderNo" pattern="${sd:OrderNo}" />
<Column name="Content" pattern="${sd:Content}" />
<Column name="Keyword" pattern="${sd:Keyword}" />
<Column name="ClientIP" pattern="${sd:ClientIP}" />
<Column name="TimeLong" pattern="${sd:TimeLong}" />
<Column name="LogTime" pattern="${sd:LogTime}" />
<Column name="DBCreateTime" literal="now()" />
<Column name="ServerDesc" pattern="${sd:ServerDesc}" />
<Column name="LogLevel" pattern="${sd:LogLevel}" />
<Column name="RequestServerIP" pattern="${sd:RequestServerIP}" />
<Column name="ServerIP" pattern="${sd:ServerIP}" />
<Column name="CurrentApiRequestKey" pattern="${sd:CurrentApiRequestKey}" />
</JDBC>
</Appenders>
<Loggers>
<AsyncLogger name="AsyncDBLogger" level="debug"
includeLocation="true">
<AppenderRef ref="DBLogger" />
</AsyncLogger>
<Root level="info">
<AppenderRef ref="Console" />
</Root>
</Loggers>
</Configuration>
AsyncLogger 表示是异步插入.需要在pom.xml中插入disruptor引用
        <dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId><!-- log4j异步插入用到 -->
<version>3.4.1</version>
</dependency>

2.创建LogConnectionFactory类:

package com.malls.common.tool;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; import javax.sql.DataSource; import org.apache.commons.dbcp2.ConnectionFactory;
import org.apache.commons.dbcp2.DriverManagerConnectionFactory;
import org.apache.commons.dbcp2.PoolableConnection;
import org.apache.commons.dbcp2.PoolableConnectionFactory;
import org.apache.commons.dbcp2.PoolingDataSource;
import org.apache.commons.pool2.ObjectPool;
import org.apache.commons.pool2.impl.GenericObjectPool; import com.malls.common.model.DBConfig; public class LogConnectionFactory { private static interface Singleton {
final LogConnectionFactory INSTANCE = new LogConnectionFactory();
} private DataSource dataSource; private LogConnectionFactory() { } private void initDataSource() { try {
//
// First, we'll create a ConnectionFactory that the
// pool will use to create Connections.
// We'll use the DriverManagerConnectionFactory,
// using the connect string passed in the command line
// arguments.
DBConfig dbConfig = ApplicationConfig.GetDbConfig("dblog");
ConnectionFactory connectionFactory = new DriverManagerConnectionFactory(dbConfig.getUrl(),
dbConfig.getUserName(), dbConfig.getPassword()); //
// Next we'll create the PoolableConnectionFactory, which wraps
// the "real" Connections created by the ConnectionFactory with
// the classes that implement the pooling functionality.
//
PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(connectionFactory,
null); //
// Now we'll need a ObjectPool that serves as the
// actual pool of connections.
//
// We'll use a GenericObjectPool instance, although
// any ObjectPool implementation will suffice.
//
ObjectPool<PoolableConnection> connectionPool = new GenericObjectPool<>(poolableConnectionFactory); // Set the factory's pool property to the owning pool
poolableConnectionFactory.setPool(connectionPool); //
// Finally, we create the PoolingDriver itself,
// passing in the object pool we created.
//
dataSource = new PoolingDataSource<>(connectionPool);
} catch (Exception e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
dataSource = null;
} } int i = 0;
private static Lock lock = new ReentrantLock(); public static Connection getDatabaseConnection() throws SQLException {
if (Singleton.INSTANCE.i == 0) {
//这儿如果第一次直接返回连接池的话会报错
//因为PoolableConnectionFactory也使用了log4j记录日志
//这儿是重点
Singleton.INSTANCE.i++;
DBConfig dbConfig = ApplicationConfig.GetDbConfig("dblog");
return DriverManager.getConnection(dbConfig.getUrl(), dbConfig.getUserName(), dbConfig.getPassword());
}
if (Singleton.INSTANCE.dataSource == null) {
lock.lock();
try {
if (Singleton.INSTANCE.dataSource == null) {
Singleton.INSTANCE.initDataSource();
}
} finally {
lock.unlock();
}
}
return Singleton.INSTANCE.dataSource.getConnection();
}
}

要注意注释的地方,第二次才返回连接池

3.创建DBLog类:

package com.malls.common.tool;

import java.time.Duration;
import java.time.LocalDateTime;
import java.util.UUID; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.message.StructuredDataMessage;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder; import com.malls.common.model.RequestModel; public class DBLog {
private static final Logger LOGGER = LogManager.getLogger("AsyncDBLogger"); public static void process(String logType, String content) {
process(logType, content, "");
} public static void process(String logType, String content, String keyWord) {
StructuredDataMessage msg = getataMessage(logType, content, keyWord);
addMsg(msg, "logLevel", "Process");
LOGGER.info(msg);
} public static void error(String logType, String content) {
error(logType, content, "");
} public static void error(String logType, String content, String keyWord) {
StructuredDataMessage msg = getataMessage(logType, content, keyWord);
addMsg(msg, "logLevel", "Error");
LOGGER.error(msg);
} public static void handle(String logType, String content) {
handle(logType, content, "");
} public static void handle(String logType, String content, String keyWord) {
StructuredDataMessage msg = getataMessage(logType, content, keyWord);
addMsg(msg, "LogLevel", "Handle");
LOGGER.info(msg);
} private static StructuredDataMessage getataMessage(String logType, String content, String keyWord) {
String confirm = UUID.randomUUID().toString().replace("-", "");
StructuredDataMessage msg = new StructuredDataMessage(confirm, "", "transfer");
RequestAttributes req = RequestContextHolder.currentRequestAttributes();
RequestModel requestModel = null;
if (req != null) {
requestModel = (RequestModel) req.getAttribute("RequestModel", RequestAttributes.SCOPE_REQUEST);
}
if (requestModel == null) {
requestModel = new RequestModel();
}
addMsg(msg, "RequestKey", requestModel.getRequestKey());
addMsg(msg, "RequestUrl", requestModel.getRequestUrl());
addMsg(msg, "UserName", String.valueOf(requestModel.getCurrentUserId()));
addMsg(msg, "OrderNo", requestModel.getOrderNo());
addMsg(msg, "LogType", logType);
addMsg(msg, "Content", content);
addMsg(msg, "Keyword", keyWord);
addMsg(msg, "ClientIP", requestModel.getClientIP());
long timeLong = Duration.between(requestModel.getBeginRequestTime(), LocalDateTime.now()).toMillis();
addMsg(msg, "TimeLong", String.valueOf(timeLong));
addMsg(msg, "ServerDesc", "777");
addMsg(msg, "RequestServerIP", requestModel.getRequestServerIP());
addMsg(msg, "ServerIP", requestModel.getServerIP());
addMsg(msg, "CurrentApiRequestKey", requestModel.getCurrentApiRequestKey());
addMsg(msg, "LogTime", LocalDateTime.now().toString());
return msg;
} private static void addMsg(StructuredDataMessage msg, String key, String val) {
if (val == null) {
msg.put(key, "");
} else {
msg.put(key, val);
}
}
}

这样就可以了.

spring boot使用log4j2将日志写入mysql数据库的更多相关文章

  1. Spring Boot入门(2)使用MySQL数据库

    介绍   本文将介绍如何在Spring项目中连接.处理MySQL数据库.   该项目使用Spring Data JPA和Hibernate来连接.处理MySQL数据库,当然,这仅仅是其中一种方式,你也 ...

  2. Spring Boot项目中使用jdbctemplate 操作MYSQL数据库

    不废话,先来代码 pom文件: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http ...

  3. Spring Boot系列一:默认日志logback配置解析

    前言 今天来介绍下Spring Boot如何配置日志logback,我刚学习的时候,是带着下面几个问题来查资料的,你呢 如何引入日志? 日志输出格式以及输出方式如何配置? 代码中如何使用? 正文 Sp ...

  4. Spring Boot 学习摘要--关于日志框架

    date: 2020-01-05 16:20:00 updated: 2020-01-08 15:50:00 Spring Boot 学习摘要--关于日志框架 学习教程来自:B站 尚硅谷 1. 关于日 ...

  5. spring boot使用slf4j输出日志

    spring boot使用slf4j输出日志 https://blog.csdn.net/qq442270636/article/details/79406346 Spring Boot SLF4J日 ...

  6. Spring Boot Logback几种日志详解

    日志对于应用程序来说是非常重要的,Spring框架本身集成了不少其他工具,我们自身的应用也会使用到第三方库,所以我们推荐在Spring应用中使用SLF4J/Logback来记录日志. SLF4J与Lo ...

  7. Spring Boot中使用logback日志框架

    说明:Spring Boot在最新的版本中默认使用了logback框架.一般来说使用时只需在classpath下创建logback.xml即可,而官方推荐使用logback-spring.xml替代, ...

  8. Spring boot使用log4j打印日志

    先将maven中spring-boot-starter的日志spring-boot-starter-logging去掉 <dependency> <groupId>org.sp ...

  9. spring boot配置druid连接池连接mysql

    Spring Boot 集成教程 Spring Boot 介绍 Spring Boot 开发环境搭建(Eclipse) Spring Boot Hello World (restful接口)例子 sp ...

随机推荐

  1. Kitto2 now with free opensource Kide2 since September 2017(提供Web解决方案,大概是觉得Mobile开发快差不多了)

    Kitto2 is a tool for data-driven web application Development. It allows to create Rich Internet Appl ...

  2. WPF DataGrid 触发器

    <DataGrid.RowHeaderStyle> <Style TargetType="DataGridRowHeader"> <Style.Tri ...

  3. DotNetBar for Windows Forms 14.0.0.15_冰河之刃重打包版发布

    关于 DotNetBar for Windows Forms 14.0.0.15_冰河之刃重打包版 --------------------11.8.0.8_冰河之刃重打包版------------- ...

  4. Aspect Oriented Programming面向切面编程

    I简介 Aspect Oriented Programming(AOP),面向切面编程,是一个比较热门的话题.AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或 ...

  5. 图像滤镜艺术---(Sketch Filter)素描滤镜

    原文:图像滤镜艺术---(Sketch Filter)素描滤镜 (Sketch Filter)素描滤镜 素描滤镜的实现方法比较简单,这里我们直接写出算法过程如下: 1,对原图S进行去色命令得到灰度图A ...

  6. MugLife静态照片变3D动画算法研究

    原文:MugLife静态照片变3D动画算法研究 MugLife app是一款可以将静态照片变成3D动画的手机应用,如下效果图所示: 大家可以看到,这个静态图具有了类3D的动画特效,是不是很好玩? 这种 ...

  7. win10 uwp 如何打包Nuget给其他人

    原文:win10 uwp 如何打包Nuget给其他人 本文告诉大家,如果自己有做一些好用的库,如何使用 Nuget 打包之后上传,分享给大家. 首先需要知道一些 Nuget 打包需要知道的,请看 wi ...

  8. <input type="image"> 和 <img> 用法区别

    原文:<input type="image"> 和 <img> 用法区别 w3c定义如下: Image <input type="image ...

  9. 零元学Expression Blend 4 - Chapter 8 用实例了解布局容器系列-「Grid」

    原文:零元学Expression Blend 4 - Chapter 8 用实例了解布局容器系列-「Grid」 本系列将教大家以实做案例认识Blend 4 的布局容器,此章介绍的是Blend 4 里的 ...

  10. WP 8.1 中挂起时页面数据保存方式(1)

    1.保存到Applicaion Data配置信息中: 保存: privatevoid testTB_TextChanged(object sender, TextChangedEventArgs e) ...