java · 2019-09-11 0

Java日志(slf4j+log4j2)

一、日志接口与实现

日志接口有:JCL、SLFJ

1.Apache Commons Logging (JCL)

jcl为每一种日志实现采用了一个适配器,具体采用哪个是根据动态的根据指定顺序查找classpath是否存在相应的实现,如果一个应用当中有多个classLoader,限制了jcl的正常使用

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)

slfj

二、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");
        }

    }
}

结果:

控制台输出

console

生成文件

file