pom.xml
文件
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<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>
如果pom文件不配置排除,会报错,找到2个实现类
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/C:/mavenrepo/org/apache/logging/log4j/log4j-slf4j-impl/2.11.2/log4j-slf4j-impl-2.11.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/C:/mavenrepo/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
java.lang.StackOverflowError
log4j2.xml
配置文件
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
<properties>
<Property name="baseDir">logs</Property>
<Property name="filename">logs/log.log</Property>
</properties>
<Appenders>
<Console name="STDOUT" target="SYSTEM_OUT">
<PatternLayout pattern="%-d{yyyy-MM-dd HH:mm:ss,SSS}-[%l]-[LOGID:%X{logid}]-[%p] %m%n"/>
</Console>
<RollingRandomAccessFile immediateFlush="true" name="RollingFile" fileName="${filename}"
filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
<PatternLayout>
<Pattern>%d %p [%t] %c %L %M - %msg%xEx%n</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
<DefaultRolloverStrategy max="999">
<Delete basePath="${baseDir}" maxDepth="2">
<IfFileName glob="*/app-*.log.gz"/>
<IfLastModified age="15d"/>
</Delete>
</DefaultRolloverStrategy>
</RollingRandomAccessFile>
</Appenders>
<Loggers>
<!--没用logger具体指定级别,就默认是root的level-->
<Root level="info">
<AppenderRef ref="STDOUT"/>
<AppenderRef ref="RollingFile"/>
</Root>
<!--写法一 如果用这种写法,就会使用Root的 AppenderRef-->
<logger name="com.log.log.test" level="debug"/>
<!--写法二 如果用这种写法,只要有additivity="false",就必须有AppenderRef,否则不输出内容-->
<logger name="com.log.log.test" additivity="false" level="debug">
<AppenderRef ref="STDOUT"/>
</logger>
<!--上面这俩种写法,都可以指定默认输出info日志,指定的包下面输出debug日志-->
</Loggers>
</Configuration>
关于日志级别
按照阿里巴巴的规约,提示
info、debug、error都要判断日志级别再打印
if (logger.isInfoEnabled()) {
logger.info("info");
}
if (logger.isDebugEnabled()) {
logger.debug("debug");
}
if (logger.isErrorEnabled()) {
logger.error("error");
}
原因:如果打印的实参含有计算,不加logger.isDebugEnabled()的话也会进行计算,无辜消耗
- 打印日志的时候一定要想一下,定位问题的时候这行日志有没有用处
- 调用外部系统的时候一般要打印日志。
- 必须使用参数化信息的方式:
logger.debug("Processing trade with id:[{}] and symbol : [{}] ", id, symbol);
网友评论