slf4j+logback示例

slf4j

SLF4J,即简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,它只服务于各种各样的日志系统。使用slf4时,需要配合其他的日志系统进行使用。

logback

logback是由log4j创始人设计的又一个开源日志组件,分为三个模块:

  1. logback-core:提供基础功能,是其他两个模块的基础模块。
  2. logback-classic:实现了slf4j的api。
  3. logback-access:用于与sevlet容器进行集成、提供网络访问日志的功能。

logback配置

logback初始化时,会去classpath路径下依次加载logback-test.xml、logback.groovy、logback.xml。如果找不到配置文件,则会为使用基础配置BasicConfigurator,用于将日志输出到控制台。官方文档如下:

Let us begin by discussing the initialization steps that logback follows to try to configure itself:

Logback tries to find a file called logback-test.xml in the classpath.

If no such file is found, logback tries to find a file called logback.groovy in the classpath.

If no such file is found, it checks for the file logback.xml in the classpath..

If no such file is found, service-provider loading facility (introduced in JDK 1.6) is used to resolve the implementation of com.qos.logback.classic.spi.Configurator interface by looking up the file META-INF\services\ch.qos.logback.classic.spi.Configurator in the class path. Its contents should specify the fully qualified class name of the desired Configurator implementation.

If none of the above succeeds, logback configures itself automatically using the BasicConfigurator which will cause logging output to be directed to the console.

示例

目录结构

目录结构

pom.xml文件

引入slf4j和logback依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.learn</groupId>
    <artifactId>logbackLearn</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.25</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-classic -->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.3</version>
        </dependency>

    </dependencies>

</project>

logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
     scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。
     debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration scan="true" scanPeriod="60 seconds" debug="false">

    <!-- 上下文变量设置,用来定义变量值,其中name的值是变量的名称,value的值时变量定义的值。
        通过<property>定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->
    <property name="CONTEXT_NAME" value="logback-test" />

    <!-- 上下文名称:<contextName>, 每个logger都关联到logger上下文,
        默认上下文名称为“default”。但可以使用<contextName>设置成其他名字,用于区分不同应用程序的记录。
        一旦设置,不能修改。 -->
    <contextName>${CONTEXT_NAME}</contextName>

    <!-- <appender>是<configuration>的子节点,是负责写日志的组件。
        有两个必要属性name和class。name指定appender名称,class指定appender的实现类。 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!-- 对日志进行格式化。 -->
        <encoder>
            <pattern>
                %d{yyyy-MM-dd HH:mm:ss.SSS}[%level][%class][%thread][%method][%line] -> %msg%n
            </pattern>
        </encoder>
    </appender>

    <!-- 用来设置某一个 包 或者具体的某一个 类 的日志打印级别、以及指定<appender>,
        name:用来指定受此logger约束的某一个包或者具体的某一个类。
        level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。如果未设置此属性,那么当前loger将会继承上级的级别。
        additivity:是否向上级logger传递打印信息。默认是true。(这个logger的上级就是上面的root)
        <logger>可以包含零个或多个<appender-ref>元素,标识这个appender将会添加到这个logger。-->
    <logger name="logback.LogTest" level="DEBUG" additivity="true"></logger>

    <!-- 特殊的<logger>元素,是根logger。只有一个level属性,应为已经被命名为"root".
        level:设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,不能设置为INHERITED或者同义词NULL。默认是DEBUG。
        <root>可以包含零个或多个<appender-ref>元素,标识这个appender将会添加到这个loger。 -->
    <root level="INFO">
        <appender-ref ref="STDOUT" />
    </root>

</configuration>
  1. 这里配置了一个控制台输出的appender,输出格式为%d{yyyy-MM-dd HH:mm:ss.SSS}[%level][%class][%thread][%method][%line] -> %msg%n
  2. 配置了一个looger用来指定LogTest.java类的日志输出级别为DEBUG。
  3. 配置root的日志输出级别为INFO。

LogTest.java

package logback;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Created by Yinevg on 2018/11/10
 */
public class LogTest {
    private static Logger log = LoggerFactory.getLogger(LogTest.class);

    public void logMsg(){
        log.info("info");
        log.warn("warn");
        log.debug("debug");
        log.error("error");
    }
}

Main.java

import logback.LogTest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Created by Yinevg on 2018/11/10
 */
public class Main {

    private static Logger log = LoggerFactory.getLogger(Main.class);

    public static void main(String[] args) {
        new LogTest().logMsg();
        log.info("info");
        log.warn("warn");
        log.debug("debug");
        log.error("error");
    }
}

输出

LogTest.java的日志级别为DEBUG,故输出了debug;Main.java的日志输出级别为INFO,故没有输出debug。

2018-11-10 10:31:22.900[INFO][logback.LogTest][main][logMsg][13] -> info
2018-11-10 10:31:22.915[WARN][logback.LogTest][main][logMsg][14] -> warn
2018-11-10 10:31:22.915[DEBUG][logback.LogTest][main][logMsg][15] -> debug
2018-11-10 10:31:22.915[ERROR][logback.LogTest][main][logMsg][16] -> error
2018-11-10 10:31:22.915[INFO][Main][main][main][14] -> info
2018-11-10 10:31:22.915[WARN][Main][main][main][15] -> warn
2018-11-10 10:31:22.915[ERROR][Main][main][main][17] -> error

猜你喜欢

转载自blog.csdn.net/YINLINNEVERG/article/details/83927386
今日推荐