Spring-boot2 中Starters包含log4j2,所以进入log4j2只要引入以下依赖性进入pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
但是springboot默认使用logback进行日志管理
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<?xml version="1.0" encoding="UTF-8"?>
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出 -->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数 -->
<Configuration status="WARN" monitorInterval="30">
<!--全局属性 -->
<Properties>
<Property name="LOG_FILE_PATH">D:/apache-tomcat-8.5.33/logs</Property>
<!-- linux日志存放路径 <Property name="LOG_FILE_PATH">/usr/logs</Property> -->
<Property name="PATTERN_FORMAT">%d{yyyy-MM-dd HH:mm:ss} %-5level %class{36} %L
%M - %msg%xEx%n</Property>
</Properties>
<CustomLevels>
<CustomLevel name="OPERATING" intLevel="350" />
</CustomLevels>
<Appenders>
<!--输出到控制台 -->
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="${PATTERN_FORMAT}" />
</Console>
<!--输出到文件 用来定义超过指定大小自动删除旧的创建新的的Appender. -->
<RollingFile name="RollingInfoFile" fileName="${LOG_FILE_PATH}/pinyu.log"
filePattern="${LOG_FILE_PATH}/$${date:yyyyMM}/info-%d{yyyyMMdd}-%i.log.gz">
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
<Filters>
<ThresholdFilter level="warn" onMatch="DENY"
onMismatch="NEUTRAL" />
<ThresholdFilter level="debug" onMatch="ACCEPT"
onMismatch="DENY" />
</Filters>
<PatternLayout>
<pattern>${PATTERN_FORMAT}</pattern>
</PatternLayout>
<Policies>
<!-- rollover on startup, daily and when the file reaches 10 MegaBytes -->
<OnStartupTriggeringPolicy />
<SizeBasedTriggeringPolicy size="100 MB" />
<TimeBasedTriggeringPolicy />
</Policies>
</RollingFile>
<!--保存到数据库配置文件 -->
<JDBC name="DatabaseAppender" tableName="sys_logs">
<ConnectionFactory
class="com.pinyu.system.global.config.log4j2.ConnectionFactory"
method="getDatabaseConnection" />
<!-- 方法名 -->
<Column name="function" pattern="%M" />
<!-- 日志级别 -->
<Column name="level" pattern="%level" />
<Column name="logger" pattern="%logger" />
<!-- 类 -->
<Column name="class" pattern="%C" />
<!-- 时间 -->
<Column name="create_date" pattern="%d{yyyy-MM-dd hh:mm:ss}" />
<!-- 日志内容 -->
<Column name="message" pattern="%message" />
<Column name="user_id" pattern="%X{userId}" />
<Column name="creater" pattern="%X{creater}" />
<Column name="ip" pattern="%X{ip}" />
<Column name="create_user_name" pattern="%X{createUserName}" />
<Column name="type" pattern="%X{type}" />
</JDBC>
</Appenders>
<Loggers>
<!--过滤掉spring和mybatis的一些无用的DEBUG信息 -->
<Logger name="org.springframework" level="INFO" />
<Logger name="org.mybatis" level="INFO" />
<!-- LOG "com.luis*" at TRACE level -->
<Logger name="com.luis" level="INFO" />
<!-- LOG everything at INFO level -->
<Root level="ALL">
<AppenderRef ref="Console" />
<AppenderRef ref="RollingInfoFile" />
<AppenderRef ref="RollingWarnFile" />
<AppenderRef ref="RollingErrorFile" />
<AppenderRef ref="DatabaseAppender" level="operating"/>
</Root>
<!-- <Root level="OPERATION"> -->
<!-- </Root> -->
</Loggers>
</Configuration>
在config路径下创建新的类ConnectionFactoryConfig,初始化Hikari的数据库连接池,返回一个Connection.
package com.sdk.management.config;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import java.sql.Connection;
import java.sql.SQLException;
/**
* @author caohongyun
*/
public class ConnectionFactoryConfig{
private static interface Singleton{
final ConnectionFactoryConfig INSTANCE = new ConnectionFactoryConfig();
}
private HikariDataSource dataSource;
private ConnectionFactoryConfig(){
//也可以使用配置文件直接加载
// HikariConfig config = new HikariConfig("application.properties");
// this.dataSource = new HikariDataSource(config);
String user = "xxxxx";
String password = "xxxxxx";
String url = "jdbc:mysql://127.0.0.1:3306/xxxxxx?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai";
String driverClassName = "com.mysql.cj.jdbc.Driver";
HikariConfig config = new HikariConfig();
config.setDriverClassName(driverClassName);
config.setJdbcUrl(url);
config.setUsername(user);
config.setPassword(password);
config.addDataSourceProperty("cachePrepStmts","true");
config.addDataSourceProperty("prepstmtCacheSize","250");
config.addDataSourceProperty("prepstmtCacheSqlLimit","2048");
//设置连接超时为8小时
config.setConnectionTimeout(8*60*60);
this.dataSource = new HikariDataSource(config);
}
public static Connection getDatabaseConnection() throws SQLException{
return Singleton.INSTANCE.dataSource.getConnection();
}
}
配置文件详解
(1).根节点Configuration有两个属性:status和monitorinterval,有两个子节点:Appenders和Loggers(表明可以定义多个Appender和Logger).
status:Configuration的属性,用来指定log4j本身的打印日志的级别.
monitorinterval:Configuration的属性,用于指定log4j自动重新配置的监测间隔时间,单位是s,最小是5s.
(2).Appenders节点,常见的有三种子节点:Console、RollingFile、File.
Console节点用来定义输出到控制台的Appender.
name:Console的属性,指定Appender的名字.
target:Console的属性,SYSTEM_OUT 或 SYSTEM_ERR,一般只设置默认:SYSTEM_OUT.
PatternLayout:Console的子节点,输出格式,不设置默认为:%m%n.
File节点用来定义输出到指定位置的文件的Appender.
name:File的属性,指定Appender的名字.
fileName:File的属性,指定输出日志的目的文件带全路径的文件名.
PatternLayout:File的子节点,输出格式,不设置默认为:%m%n.
RollingFile节点用来定义超过指定大小自动删除旧的创建新的的Appender.
name:RollingFilede的属性,指定Appender的名字.
fileName:RollingFilede的属性,指定输出日志的目的文件带全路径的文件名.
filePattern:RollingFilede的属性,指定新建日志文件的名称格式.
PatternLayout:RollingFilede的子节点,输出格式,不设置默认为:%m%n.
DefaultRolloverStrategy:RollingFilede的子节点,用来指定同一个文件夹下最多有几个日志文件时开始删除最旧的,创建新的(通过max属性)。
Policies:RollingFilede的子节点,指定滚动日志的策略,就是什么时候进行新建日志文件输出日志.
TimeBasedTriggeringPolicy:Policies子节点,基于时间的滚动策略,interval属性用来指定多久滚动一次,默认是1hour。modulate=true用来调整时间:比如现在是早上3am,interval是4,那么第一次滚动是在4am,接着是8am,12am...而不是7am.
SizeBasedTriggeringPolicy:Policies子节点,基于指定文件大小的滚动策略,size属性用来定义每个日志文件的大小.
Filters:RollingFilede的子节点,决定日志事件能否被输出。过滤条件有三个值:ACCEPT(接受), DENY(拒绝) or NEUTRAL(中立)(后面具体讲)
ACCEP和DENY比较好理解就是接受和拒绝的意思,在使用单个过滤器的时候,一般就是使用这两个值。但是在组合过滤器中,如果用接受ACCEPT的话,日志信息就会直接写入日志文件,后续的过滤器不再进行过滤。所以,在组合过滤器中,接受使用NEUTRAL(中立),被第一个过滤器接受的日志信息,会继续用后面的过滤器进行过滤,只有符合所有过滤器条件的日志信息,才会被最终写入日志文件。
ThresholdFilter:Filters的子节点
level:ThresholdFilterde的属性,将被过滤的级别。
onMatch:ThresholdFilterde的属性,默认值是NEUTRAL
onMismatch:ThresholdFilterde的属性,默认是DENY
(3).Loggers节点,常见的有两种:Root和Logger.
Root节点用来指定项目的根日志,如果没有单独指定Logger,那么就会默认使用该Root日志输出
level:Root属性,日志输出级别,共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.
appender-ref:Root的子节点,用来指定该日志输出到哪个Appender,通过ref指定.
Logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。
level:Logger属性,日志输出级别,共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.
name:Logger属性,用来指定该Logger所适用的类或者类所在的包全路径,继承自Root节点.
additivity:Logger属性
appender-ref:Logger的子节点,用来指定该日志输出到哪个Appender,如果没有指定,就会默认继承自Root.如果指定了,那么会在指定的这个Appender和Root的Appender中都会输出,此时我们可以设置Logger的additivity="false"只在自定义的Appender中进行输出。
/*
* 测试输出日志到数据库
* */
@GetMapping("warn")
public Object errorTest() {
logger.error("除数不能为0啊!");
int i=1/0;
return null;
}