1. 表结构:
CREATE TABLE `log_table` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键id',
`log_date` datetime DEFAULT NULL COMMENT '日志日期时间',
`log_level` varchar(32) DEFAULT NULL COMMENT '日志级别',
`log_class` varchar(255) DEFAULT NULL COMMENT '日志所在的类',
`line_number` int(255) DEFAULT NULL COMMENT '在类中的行数',
`log_detail` longtext COMMENT '日志详情',
`log_module` varchar(255) DEFAULT NULL COMMENT '标识,多个项目的时候,区分一下',
PRIMARY KEY (`id`)
)
2. 引入依赖的jar
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.39</version>
</dependency>
3. 数据源:
package com.cn.log;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import org.apache.log4j.jdbc.JDBCAppender;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
public class Log2ConnectionFactory extends JDBCAppender {
//Druid数据源
private DruidDataSource dataSource1;
private static Log2ConnectionFactory logConnectionFactory;
public Log2ConnectionFactory() {
super();
}
@Override
protected void closeConnection(Connection con) {
if (con != null) {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
@Override
protected Connection getConnection() throws SQLException {
if (dataSource1 == null) {
Properties result = new Properties();
result.put("driverClassName", "com.mysql.jdbc.Driver");
result.put("url", "jdbc:mysql://192.168.0.109:3309/test?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowMultiQueries=true");
result.put("username", "root");
result.put("password", "root");
try {
dataSource1 = (DruidDataSource) DruidDataSourceFactory.createDataSource(result);
} catch (Exception e) {
e.printStackTrace();
}
}
return dataSource1.getConnection();
}
public static Connection getDataSourceConnection() throws SQLException {
if (logConnectionFactory == null) {
logConnectionFactory = new Log2ConnectionFactory();
}
return logConnectionFactory.getConnection();
}
}
4. log4j2.xml文件配置:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<properties>
<!--存放目录-->
<property name="LOG_HOME">/log</property>
<!--表的名字-->
<property name="LOG_TABLE_NAME">log_table</property>
</properties>
<Appenders>
<!--控制台打印-->
<Console name="CONSOLE" target="SYSTEM_OUT">
<PatternLayout charset="UTF-8" pattern="[%-5p] %d %c - %m%n"/>
</Console>
<!--存储在文件-->
<File name="File" fileName="${LOG_HOME}/game-api.log">
<!--显示样式-->
<PatternLayout pattern="%d{yyyy-MMM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{15} - %msg%n"/>
</File>
<!--追加的形式存储在文件中-->
<RollingFile name="RollingFile" fileName="${LOG_HOME}/rar.log"
filePattern="${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{MM-dd-yyyy}-%i.log.gz">
<PatternLayout charset="UTF-8"
pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>
<!--日志文件最大值 第二天压缩-->
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="10 MB"/>
</Policies>
</RollingFile>
<!--jdbc的形式存储-->
<JDBC name="databaseAppender" tableName="${LOG_TABLE_NAME}">
<ConnectionFactory class="com.cn.log.Log2ConnectionFactory"
method="getDataSourceConnection"/>
<!--日期-->
<Column name="log_date" pattern="%d{yyyy-MM-dd HH:mm:ss}"/>
<!--日志级别-->
<Column name="log_level" pattern="%p"/>
<!--打印日志所在的类-->
<Column name="log_class" pattern="%c"/>
<!--日志在第几行-->
<Column name="line_number" pattern="%L"/>
<!--日志详情-->
<Column name="log_detail" pattern="%m"/>
<!--多个项目的时候做区分-->
<Column name="log_module" pattern="test"/>
</JDBC>
</Appenders>
<Loggers>
<root level="info">
<AppenderRef ref="CONSOLE"/>
<AppenderRef ref="File"/>
<AppenderRef ref="databaseAppender"/>
</root>
<!--所在包-->
<Logger name="com.cn" level="error">
<AppenderRef ref="databaseAppender"/>
</Logger>
</Loggers>
</configuration>
5. 测试:
package com.cn.log;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping(value = "/game-api/demo")
public class DemoController {
private static final Logger logger = LoggerFactory.getLogger(DemoController.class);
@GetMapping(value = "/test")
public void test() {
logger.error("hi,cn_yang");
}
}
6.效果: