当前位置:   article > 正文

日志组件Sl4j 介绍,xml配置文件 参数详解

sl4j

前言

日志 是程序运行过程中所打印出来的信息。
我们可以通过日志来实时了解程序运行的情况,在每一个时刻的各种情况。当出现问题时,可以快速的进行定位。

java程序员在学习java之后就会知道日志对于任何一个Java应用程序尤其是服务端程序是至关重要的。日志有很多的框架,如java.util.logging、Apache log4j、logback。

当我学习了springboot后,更加常用的就是SLF4J(Simple logging facade for Java)

SLF4J不同于其他日志类库,与其它日志类库有很大的不同。SLF4J不是一个真正的日志实现,而是一个抽象层( abstraction layer),它允许你在后台使用任意一个日志类库。如果是在编写供内外部都可以使用的API或者通用类库,那么你真不会希望使用你类库的客户端必须使用你选择的日志类库。

使用是比较简单的,下面也简单写了一下,但是xml的配置却是有点麻烦,我也来记录一下。也是本博客最重要的,也是我最想记录的。

一、Slf4j 日志使用

1. 老式用法

自己写日志的时候,肯定需要:

private final Logger logger = LoggerFactory.getLogger(LoggerTest.class);

logger.debug("debug");//默认日志级别为info
logger.info("info");
logger.error("error");
logger.warn("warn");
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

每次写新的类,就需要重新写logger

2. @Sl4j注解

a. maven依赖

lombok 插件中,包含了对sl4j的依赖

<dependency>
     <groupId>org.projectlombok</groupId>
     <artifactId>lombok</artifactId>
     <optional>true</optional>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5

b. 使用示例

  1. 在类上使用@Sl4j注解 进行标注
  2. 然后直接使用即可,如下:

/**
 * Created with IntelliJ IDEA.
 * User: 冯安晨.
 * Date: 2018/1/8.
 * Time: 下午 8:05.
 * Explain:日志测试
 */

@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class LoggerTest {
    private final Logger logger = LoggerFactory.getLogger(LoggerTest.class);

    /**
     * 传统方式实现日志
     */
    @Test
    public void test1(){
        logger.debug("debug");//默认日志级别为info
        logger.info("info");
        logger.error("error");
        logger.warn("warn");
    }

    /**
     * Slf4j注解方式实现日志
     */
    @Test
    public void test2(){
		log.fatal("这是fatal信息");
		log.error("这是error信息");
		log.warn("这是warn信息");
		log.info("这是info信息");//默认日志级别为info
		log.debug("这是debug信息");
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

3. 注意

如果注解@Slf4j注入后找不到变量log,需要IDEA安装lombok插件,

File → settings → Plugins

二 、日志级别

级别中文名称级别等级详解
OFF关闭1Level 是最高等级的,用于关闭所有日志记录。
FATAL致命的错误2level 指出每个严重的错误事件将会导致应用程序的退出。
ERROR错误3level 指出虽然发生错误事件,但仍然不影响系统的继续运行。
WARN警告4level 表明会出现潜在错误的情形。
INFO信息5level 表明 消息在粗粒度级别上突出强调应用程序的运行过程。
DEBUG调试6Level 指出细粒度信息事件对调试应用程序是非常有帮助的。
TRACE7与DEBUG 相比更细致化的记录事件消息。
ALL8Level 是最低等级的,用于打开所有日志记录。

从高到地低
OFF 、 FATAL 、 ERROR 、 WARN 、 INFO 、 DEBUG 、 TRACE 、 ALL

一般使用这5个:FATALERRORWARNINFODEBUG

三、日志的xml文件配置

1. 直接拿走使用的xml配置

springboot项目可以直接拿走使用:
logback-spring.xml

<?xml version="1.0" encoding="utf-8"?>
<configuration>

    <property name="APP_NAME" value="airport-objidentifytomq-s" />
    <property name="LOG_DIR" value="/var/log/imoslog/airport-objidentifytomq-s" />
    <property name="ENCODER_PATTERN" value="%d{yyyy-MM-dd  HH:mm:ss.SSS} [%thread] %highlight(%-5level) %logger{80} [%file : %line] - %msg%n" />
    <contextName>${APP_NAME}</contextName>


    <appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender" >
        <!--输出格式,改成 encoder 报错--->
        <layout class="ch.qos.logback.classic.PatternLayout">
            <!--<pattern>%d [%thread] %highlight(%-5level) %logger{36} %line - %msg%n</pattern>-->
            <pattern>${ENCODER_PATTERN}</pattern>
        </layout>
    </appender>
    <appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
        </filter>
        <file>/var/log/imoslog/airport-objidentifytomq-s/info.log</file>
        <encoder>
            <charset>utf-8</charset>
            <pattern>${ENCODER_PATTERN}</pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_DIR}/info.%d{yyyy-MM-dd}-%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>40MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>5</maxHistory>
        </rollingPolicy>
    </appender>


    <appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
        <file>/var/log/imoslog/airport-objidentifytomq-s/error.log</file>
        <encoder>
            <charset>utf-8</charset>
            <pattern>${ENCODER_PATTERN}</pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_DIR}/error.%d{yyyy-MM-dd}-%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>40MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>7</maxHistory>
        </rollingPolicy>
    </appender>

    <root level="info">
        <appender-ref ref="consoleLog"/>
        <appender-ref ref="fileInfoLog"/>
        <appender-ref ref="fileErrorLog"/>
    </root>
</configuration>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59

2. xml配置的详解(一)

logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">

	<!--property标签:设置属性值,为键值对。name为键,vale为值。可以通过${键}来取值,也就是vale的值 -->

    <!-- 应用名称 -->
    <property name="APP_NAME" value="logtest" />
    <!--日志文件的保存路径,首先查找系统属性-Dlog.dir,如果存在就使用其;否则,在当前目录下创建名为logs目录做日志存放的目录 -->
    <property name="LOG_HOME" value="${log.dir:-logs}/${APP_NAME}" />

    <!-- 日志输出格式 -->
    <!--
            %d{yyyy-MM-dd  HH:mm:ss.SSS} 时间格式 hh是12h制  HH是24h制
            [%thread]      线程
            %highlight(%-5level) 高亮级别
            %logger{36}    日志包     36包长度
            [%file : %line]   目标类  和  行数
            %msg           log信息
            -			   就是一个间隔符
            %n              换行
            (encoder必需的)-->
    <property name="ENCODER_PATTERN" 
    	value="%d{yyyy-MM-dd  HH:mm:ss.SSS} [%thread] %highlight(%-5level) %logger{80} %line - %msg%n" />
    <contextName>${APP_NAME}</contextName>
    
   
    <!-- 控制台日志:输出全部日志到控制台 -->
    <appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
    	<!--原来是 layout , 改成 encoder 报错-->
        <layout class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${ENCODER_PATTERN}</Pattern>
        </layout>
    </appender>

    <!-- 信息日志:输出全部日志到文件 -->
    <appender name="fileInfoLog"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 过滤器:只输出此级别以上的信息 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
        </filter>

		<!--正在记录的日志-->
        <file>/var/log/imoslog/airport-objidentifytomq-s/info.log</file>

		<!-- 输出格式 -->
		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
        	<charset>utf-8</charset>
            <pattern>${ENCODER_PATTERN}</pattern>
        </encoder>
        
        <!--滚动策略:输出规则-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        	<!--归档的日志文件路径-->
            <fileNamePattern>${LOG_DIR}/info.%d{yyyy-MM-dd}-%i.log</fileNamePattern>
            <!--每个文件最大 10M -->
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>40MB</maxFileSize> 
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--只保留五天的日志,5d周期-->
            <maxHistory>5</maxHistory>
        </rollingPolicy>
        
        
    </appender>

    <!-- 错误日志:用于将错误日志输出到独立文件 -->
    <appender name="fileErrorLog"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
		
		<!--正在记录的ERROR级别日志-->
        <file>/var/log/imoslog/airport-objidentifytomq-s/error.log</file>

		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
			<charset>utf-8</charset>
            <pattern>${ENCODER_PATTERN}</pattern>
        </encoder>
        
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
       		<!--归档的日志文件路径-->
            <fileNamePattern>${LOG_DIR}/error.%d{yyyy-MM-dd}-%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>40MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--只保留最近七天的日志-->
            <maxHistory>7</maxHistory>
        </rollingPolicy>
        
    </appender>

    <!-- 独立输出的同步日志 -->
    <appender name="SYNC_FILE"  class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/sync.%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>7</maxHistory>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${ENCODER_PATTERN}</pattern>
        </encoder>
    </appender>
    <logger name="log.sync" level="DEBUG" addtivity="true">
        <appender-ref ref="SYNC_FILE" />
    </logger>

	

    <root>
        <level value="DEBUG" />
        <appender-ref ref="consoleLog"/>
        <appender-ref ref="fileInfoLog"/>
        <appender-ref ref="fileErrorLog"/>
        <appender-ref ref="ERROR_FILE" />
    </root>

	<!--==================================指定包的日志======================================================-->
	<!--这个logger没有指定appender,它会继承root节点中定义的那些appender     -->
    <logger name="com.sk" level="info">
    <!-- <appender-ref ref="consoleLog"/>-->
    </logger>
 
    <!--通过 LoggerFactory.getLogger("Test3") 可以获取到这个logger
        additivity="false" 没有它  输出双倍   自身的和继承的root的appender-->
    <logger name="Test3" level="trace" additivity="false">
        <appender-ref ref="stdout"/>
        <appender-ref ref="file"/>
    </logger>
 
    <!--由于设置了 additivity="false" ,所以输出时不会使用rootLogger的appender-->
    <!--但是这个logger本身又没有配置appender,所以使用这个logger输出日志的话就不会输出到任何地方-->
<!--    <logger name="Test3" level="trace" additivity="false"></logger>-->
    
</configuration>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135

3. xml配置的详解(二)

  1. appender元素
    定义一个日志输出目的地。

name [#REQUIRED attribute] : 定义appender的名字,以便被后文引用
class [#REQUIRED attribute] : 定义appender对象所属的类的全名
param [* child] : 创建appender对象时传递给类构造方法的参数
layout [? child] : 该appender使用的layout对象

输出方式appender一般有5种:即appender中的 class属性值

org.apache.log4j.RollingFileAppender(滚动文件,自动记录最新日志)

org.apache.log4j.ConsoleAppender (控制台)

org.apache.log4j.FileAppender (文件)

org.apache.log4j.DailyRollingFileAppender (每天产生一个日志文件)

org.apache.log4j.WriterAppender (将日志信息以流格式发送到任意指定的地方)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  1. layout元素

定义与某一个appender相联系的日志格式化器。

class [#REQUIRED attribute] : 定义layout对象所属的类的全名
param [* child] : 创建layout对象时传递给类构造方法的参数

  1. logger元素

定义一个日志输出器。

name [#REQUIRED attribute] : 定义logger的名字,以便被后文引用
additivity [#ENUM attribute] : 取值为"true"(默认)或者"false",是否继承父logger的属性
level [? child] : 定义该logger的日志级别
appender-ref [* child] : 定义该logger的输出目的地

  1. root元素

定义根日志输出器root logger。

param [* child] : 创建root logger对象时传递给类构造方法的参数
level [? child] : 定义root logger的日志级别
appender-ref [* child] : 子标签。定义root logger的输出目的地

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/124262
推荐阅读
相关标签
  

闽ICP备14008679号