Springboot + slf4j日志

slf4j

springboot推荐的日志类库是slf4j、日志系统为logback。slf4j有个接口叫Logger,提供了丰富的日志输出方法,包含了所有日志级别的输出。使用方式也是特别的简单,用slf4j的工厂类获取一个logger ,然后就可以输出日志了,默认情况下,日志只会输出到控制台。

使用

package cn.com.infosec.netseal.common.core.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
 * web层通用数据处理
 *
 * @author lhx
 */
public class BaseController {
	protected final Logger logger = LoggerFactory.getLogger(BaseController.class);
}

但是这样有一个缺点,就是要在用到的类上都写一句LoggerFactory.getLogger(),是不是很繁琐

可以集成lombok,使用@slf4j注解

<dependency>
	<groupId>org.projectlombokgroupId>
	<artifactId>lombokartifactId>
dependency>

配置方式1:application.properties+logback-spring.xml

日志的输出路径和日志文件名由application文件指定时,需要注意application文件和logback配置文件两者的加载顺序问题

在application.properties文件中配置logging.file、logging.path可以控制日志文件的输出路径和文件名。
不过有些细节需要注意,否则配置不生效

logging.path=D:/data/mylog
logging.file=mylog.log

注意windos的路径(后面配置文件中也是/),此时并不会在d盘下生成日志文件,只会在项目的根目录下创建一个myLog.log的文件(workspace中,此项目的根目录)。

原因是,没有logback-spring.xml配置文件,系统只认识logging.file,不认识logging.path

所以要配置logback-spring.xml,spring boot会默认加载此文件,为什么不配置logback.xml,因为logback.xml会先application.properties加载,而logback-spring.xml会后于application.properties加载,这样我们在application.properties文中设置日志文件名称和文件路径才能生效。

logback-spring.xml

注意 $ {LOG_PATH}和$ {LOG_FILE}分别是获取配置文件中的路径和文件名称,必须使用这两个全局的配置去获取。

配置方式2:logback.xml

日志的输出路径和日志文件名,直接由logback配置文件指定,则配置文件名直接使用logback.xml

logback.xml

appender

appender是负责写日志的组件,主要用于指定日志输出的目的地,目的地可以是控制台、文件、远程套接字服务器、MySQL和其他数据库、JMS和远程UNIX Syslog守护进程等。

三种类型:
ConsoleAppender: 把日志打印到控制台,class=“ch.qos.logback.core.ConsoleAppender”

FileAppender: 把日志输出到文件

RollingFileAppender: 滚动记录地把日志输出到文件, 也就是可以支持日志文件按文件大小拆分,或者按日期拆分,class=“ch.qos.logback.core.rolling.RollingFileAppender”

一般项目都会使用RollingFileAppender,一天一个日志文件

logger

用来设置某一个包或者具体某一个类的日志打印级别、以及指定appender。可以包含零个或者多个元素,标识这个appender将会添加到这个logger。

一般使用中,一个logger标签,包含3个appender(info、error、debug三种指定),根据logger的级别决定到底输出在哪个文件

root

也是元素,但它是根logger,只有一个level属性,因为它的name就是ROOT

示例

logback.xml会先application.properties加载,所以在logback.xml中定义日志的存放位置log.path


<configuration>
	
 	
    <property name="log.path" value="/opt/infosec/NetSeal/log"/>
    <property name="console.log.pattern"
              value="%red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}%n) - %msg%n"/>
    <property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"/>

    
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${console.log.pattern}pattern>
            <charset>utf-8charset>
        encoder>
    appender>

    
    <appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
       	
        <file>${log.path}/sys-info.logfile>
        
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            
            <fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.logfileNamePattern>
            
            <maxHistory>60maxHistory>
        rollingPolicy>
        
        <encoder>
            <pattern>${log.pattern}pattern>
        encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            
            <level>INFOlevel>
            
            <onMatch>ACCEPTonMatch>
            
            <onMismatch>DENYonMismatch>
        filter>
    appender>

	
    <appender name="file_debug" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/sys-debug.logfile>
        
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            
            <fileNamePattern>${log.path}/sys-debug.%d{yyyy-MM-dd}.logfileNamePattern>
            
            <maxHistory>60maxHistory>
        rollingPolicy>
        <encoder>
            <pattern>${log.pattern}pattern>
        encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            
            <level>DEBUGlevel>
            
            <onMatch>ACCEPTonMatch>
            
            <onMismatch>DENYonMismatch>
        filter>
    appender>

	
    <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/sys-error.logfile>
        
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            
            <fileNamePattern>${log.path}/sys-error.%d{yyyy-MM-dd}.logfileNamePattern>
            
            <maxHistory>60maxHistory>
        rollingPolicy>
        <encoder>
            <pattern>${log.pattern}pattern>
        encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            
            <level>ERRORlevel>
            
            <onMatch>ACCEPTonMatch>
            
            <onMismatch>DENYonMismatch>
        filter>
    appender>

    
    <appender name="sys-user" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/sys-user.logfile>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            
            <fileNamePattern>${log.path}/sys-user.%d{yyyy-MM-dd}.logfileNamePattern>
            
            <maxHistory>60maxHistory>
        rollingPolicy>
        <encoder>
            <pattern>${log.pattern}pattern>
        encoder>
    appender>

    
    <logger name="cn.com.infosec.netseal" level="debug"/>
    
    <logger name="org.springframework" level="warn"/>
    
    <logger name="sys-user" level="info">
        <appender-ref ref="sys-user"/>
    logger>

    <root level="info">
        <appender-ref ref="console"/>
    root>
    <root level="debug">
        <appender-ref ref="console"/>
    root>

    
    <root level="info">
        <appender-ref ref="file_info"/>
        <appender-ref ref="file_error"/>
    root>

    
configuration> 

<configuration>
	
 	
    <property name="log.path" value="/opt/infosec/NetSeal/log/web"/>
    <property name="console.log.pattern"
              value="%red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}%n) - %msg%n"/>
    <property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"/>

    
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${console.log.pattern}pattern>
            <charset>utf-8charset>
        encoder>
    appender>

    
    <appender name="log-info" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/info.logfile>
        
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            
            <fileNamePattern>${log.path}/info.%d{yyyy-MM-dd}.logfileNamePattern>
            
            <maxHistory>30maxHistory>
        rollingPolicy>
        <encoder>
            <pattern>${log.pattern}pattern>
        encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            
            <level>INFOlevel>
            
            <onMatch>ACCEPTonMatch>
            
            <onMismatch>DENYonMismatch>
        filter>
    appender>

    
    <appender name="log-debug" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/debug.logfile>
        
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            
            <fileNamePattern>${log.path}/debug.%d{yyyy-MM-dd}.logfileNamePattern>
            
            <maxHistory>30maxHistory>
        rollingPolicy>
        <encoder>
            <pattern>${log.pattern}pattern>
        encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            
            <level>DEBUGlevel>
            
            <onMatch>ACCEPTonMatch>
            
            <onMismatch>DENYonMismatch>
        filter>
    appender>

    
    <appender name="log-error" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/error.logfile>
        
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            
            <fileNamePattern>${log.path}/error.%d{yyyy-MM-dd}.logfileNamePattern>
            
            <maxHistory>30maxHistory>
        rollingPolicy>
        <encoder>
            <pattern>${log.pattern}pattern>
        encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            
            <level>ERRORlevel>
            
            <onMatch>ACCEPTonMatch>
            
            <onMismatch>DENYonMismatch>
        filter>
    appender>

    <logger level="info" name="cn.com.infosec" additivity="false">
        <appender-ref ref="log-debug" />
        <appender-ref ref="log-info" />
        <appender-ref ref="log-error" />
    logger>

	
	<logger level="debug" name="cn.com.infosec" additivity="false">
	    <appender-ref ref="console" />
	logger>

	
    <root level="info">
        <appender-ref ref="console" />
    root>

configuration>

动态修改日志等级

在实际应用中,上线的系统要排查问题,在界面开启dug日志可以很方便的排查。动态修改日志等级的方式有很多,描述如下:

方式1:开启logback的自动扫描更新


<configuration scan="true" scanPeriod="60 seconds" debug="false">
    
    ...
configuration>

上线的系统,直接修改该xml,无需重启即可完成日志等级修改。

方式2:springboot引入Actuator

  1. pom.xml增加相关依赖,引入Actuator包
<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-webartifactId>
dependency>

<dependency>
	<groupId>org.springframework.bootgroupId>
	<artifactId>spring-boot-starter-actuatorartifactId>
dependency>
  1. application.yml配置
# actuate监控只开启 日志等级管理
management:
  endpoint:
    loggers:
      enabled: true
  endpoints:
    web:
      exposure:
        include:
        - loggers

  1. 修改日志级别
    通过 http://ip:port/项目名/actuator/loggers 端点提供的 POST 请求,修改包路径com.xxx.aa的日志级别为DEBUG:
POST请求:
	http://ip:port/项目名/actuator/loggers/包路径
请求体:
	{
		"configuredLevel": "DEBUG"
	}

可设为定时任务,根据数据库配置定时更新日志级别。

springboot日志系统

对于web项目,已经引入了spring-boot-starter-web,默认已经自带了日志的spring-boot-starter-logging,已经默认引入了logback实现,只需要配置application.yml即可。

你可能感兴趣的:(SpringBoot,log4j2)