一、日志接口与实现
日志接口有:JCL、SLFJ
1.Apache Commons Logging (JCL)
jcl为每一种日志实现采用了一个适配器,具体采用哪个是根据动态的根据指定顺序查找classpath是否存在相应的实现,如果一个应用当中有多个classLoader,限制了jcl的正常使用
2.Simple Logging Facade for Java (SLFJ 简单日志门面)
slfj基于静态绑定的方式,与jcl类似本身不提供日志具体实现,只对外提供接口或门面,与commons logging不同的是,其采用在classpath加入桥接jar包来表示具体采用哪种实现:
- slfj-log4j12表示桥接log4j
- log4j-slf4j-impl表示桥接log4j2
- logback-classic表示桥接logback
- slf4j-jcl表示桥接jcl
- slf4j-jdk14表示桥接jdk logging (jul)
二、maven依赖
log4j实现:log4j.jar
log4j2实现:log4j-ap、log4j-core
<!--slf4j门面-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<!--log4j-slf4j-impl桥接器-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.3</version>
</dependency>
<!--log4j实现-->
<!--<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>-->
<!--log4j2实现-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.7</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.7</version>
</dependency>
三、log4j2配置
在类路径下新建文件log4j2.xml
Log4j建议只使用四个级别,优先级从高到低分别是 ERROR、WARN、INFO、DEBUG
如果设置级别为INFO,则会显示ERROR、WARN、INFO日志信息,不会显示DEBUG日志信息
<?xml version="1.0" encoding="UTF-8"?>
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--
Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,
当设置成trace时,你会看到log4j2内部各种详细输出
monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数
-->
<Configuration status="info" monitorInterval="30">
<!-- 将一些常用值提取出来,然后在文件的其他部分通过${}的形式引用 -->
<Properties>
<!-- 定义日志文件根目录 -->
<Property name="logDir" value="logs" />
<!-- 定义日志的通用格式 -->
<Property name="genericPattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
<!-- 定义日志分卷文件通用文件名形式 -->
<Property name="genericFilePattern" value="%d{yyyy-MM-dd}-%i" />
</Properties>
<!--定义输出源-->
<Appenders>
<Console name="consoleAppender" target="SYSTEM_OUT">
<PatternLayout pattern="${genericPattern}" />
</Console>
<!--测试用 append是否追加,false会覆盖源文件-->
<File name="file" fileName="${logDir}/temp.log" append="false">
<PatternLayout pattern="${genericPattern}" />
</File>
<RollingRandomAccessFile name="rollingRandomAccessFileAppender"
fileName="${logDir}/all-temp.log"
filePattern="${logDir}/$${date:yyyy-MM-dd}/all-${genericFilePattern}.log"
append="true">
<PatternLayout pattern="${genericPattern}" />
<Policies>
<TimeBasedTriggeringPolicy interval="1" />
<SizeBasedTriggeringPolicy size="5KB" />
</Policies>
<!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件 -->
<DefaultRolloverStrategy max="5"/>
</RollingRandomAccessFile>
</Appenders>
<!--具体的日志配置-->
<Loggers>
<!--此logger监听name对对应的包名下的日志输出,lever表示日志级别-->
<!--<Logger name="com.example.logger" level="info" additivity="false">
<AppenderRef ref="consoleAppender" />
<AppenderRef ref="rollingRandomAccessFileAppender" />
</Logger>-->
<root level="all">
<AppenderRef ref="consoleAppender" />
<AppenderRef ref="file" />
<AppenderRef ref="rollingRandomAccessFileAppender" />
</root>
</Loggers>
</Configuration>
四、测试
package com.example.logger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class HelloSlf4j {
public static void main(String[] args) {
Logger logger = LoggerFactory.getLogger(HelloSlf4j.class);
for (int i = 0; i < 100;i++){
logger.info("This is info");
logger.error("This is error");
}
}
}
结果:
控制台输出
生成文件