SpringBootxml配置(超全面)版权声明

原创
小哥 3年前 (2022-10-27) 阅读数 5 #大杂烩

更新日志:
20170810 更新通过 application.yml过程参数 logback 中。

[toc]
简明书籍不支持目录,一张截图。

image.png

默认日志 Logback

默认情况下,Spring Boot会用Logback要记录和使用INFO将输出电平发送到控制台。在运行应用程序和其他示例时,您应该已经看到了很多。INFO日志级别。

从上图可以看出,日志输出内容元素如下:

  • 时间和日期:精确到毫秒。
  • 日志级别:ERROR, WARN, INFO, DEBUG or TRACE
  • 进程ID
  • 分隔符:--- 标识实际日志的开始
  • 线程名:用方括号括起来(控制台输出可能会被截断)
  • Logger名称:通常使用源代码的类名。
  • 日志内容

添加日志依赖项

假如maven将添加依赖项。 spring-boot-starter-logging


    org.springframework.boot
    spring-boot-starter-logging

但是,我们不需要在实际开发中直接添加此依赖项。
你会发现 spring-boot-starter 其中包含 spring-boot-starter-logging ,依赖的内容是 Spring Boot 默认日志框架 logback 。在工程上有用 Thymeleaf ,而 Thymeleaf 依赖项包含 spring-boot-starter 最后,我只需要介绍一下 Thymeleaf 即可。


    org.springframework.boot
    spring-boot-starter-thymeleaf

控制台输出

日志级别从低到高为:

TRACE < DEBUG < INFO < WARN < ERROR < FATAL

如果已设置 WARN ,则低于 WARN 不会输出该信息。
Spring Boot 中的默认配置 ERRORWARNINFO 向控制台输出日志的级别。
您还可以启动应用程序。 --debug 启用“DEBUG”模式的标志(建议用于开发),可以采用以下两种方式:

  • 在运行命令后添加 --debug 标记如下: $ java -jar springTest.jar --debug
  • application.properties 中配置 debug=true ,则设置此属性 true 当核心 Logger (包括嵌入式容器,hibernate、spring)将输出更多内容,但您 不输出自己申请的日志 DEBUG 级别

如果每次都编写这行代码非常麻烦,您可以使用注释,但您需要使用它们。 lombok

  • 添加依赖项:

    //注解
    compile org.projectlombok:lombok:1.16.18
  • 安装 lombok 的插件:

    • Go to File > Settings > Plugins
    • Click on Browse repositories...
    • Search for Lombok Plugin
    • Click on Install plugin
    • Restart Android Studio
    • 允许批注处理,Settings -> Compiler -> Annotation Processors

可以使用 {} 占位符用于缝合字符串,而不使用 ““+”” 来连接琴弦。

文件输出

默认情况下,Spring Boot将日志输出到控制台,而不写入日志文件。

使用 Spring Boot 喜欢在 application.propertiesapplication.yml 配置,以便只能配置简单的场景、保存路径、日志格式等、复杂的场景(区分 info 和 error 日志、每天生成一个日志文件等)不能满足要求,只能定制,如下所示。

默认情况下,它将被设置。 path 生成一个 spring.log 文件。

如果您想写入除控制台输出之外的日志文件,则需要 application.properties 中设置 logging.filelogging.path 属性。

  • logging.file ,set file,可以是绝对路径也可以是相对路径。例如: logging.file=my.log
  • logging.path ,设置将在其下创建它的目录。 spring.log 文件并写入日志内容,如: logging.path=/var/log
    如果只是配置 logging.file ,将在项目的当前路径下生成一个。 xxx.log 日志文件。
    如果只是配置 logging.path ,在 /var/log 该文件夹将生成一个日志文件。 spring.log

注:两者不能同时使用。如果同时使用它们,则仅 logging.file 生效
默认情况下,日志文件的大小为 10MB 它将被拆分一次以生成新的日志文件。默认级别为: ERROR、WARN、INFO

级别控制

所有受支持的日志记录系统均可用 Spring 在环境中设置记录级别(例如 application.properties 中)
格式为: logging.level.* = LEVEL

logging.level :日志级别控制前缀,*为包名或Logger名
LEVEL :选项 TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF

举例:

logging.level.com.dudu=DEBUG:com.dudu包下所有class以DEBUG级别输出
logging.level.root=WARN:root日志以WARN级别输出


自定义日志配置

根据不同的日志系统,您可以按照以下规则组织配置文件名,然后才能正确加载:

  • Logback: logback-spring.xml, logback-spring.groovy, logback.xml, logback.groovy
  • Log4j: log4j-spring.properties, log4j-spring.xml, log4j.properties, log4j.xml
  • Log4j2: log4j2-spring.xml, log4j2.xml
  • JDK (Java Util Logging): logging.properties

Spring Boot 官方推荐的优先使用 -spring 文件名用作您的日志配置(例如 logback-spring.xml ,而不是 logback.xml ),命名 logback-spring.xml 日志配置文件, spring boot 你可以再加一些。 spring boot 唯一配置项(如下所述)。
默认命名规则,并放置在。 src/main/resources 下面即可

如果您想要完全控制日志配置,但不想使用它。 logback.xml 作为 Logback 配置的名称, application.yml 可以通过 logging.config 属性指定一个自定义名称:

logging.config=classpath:logging-config.xml

尽管通常不需要更改配置文件的名称,但如果您想要面向不同的运行时 Profile 此功能对于不同的日志配置非常有用。
此属性通常不是必需的,而是直接在 logback-spring.xml 中使用 springProfile 配置,否 logging.config 为不同的环境指定不同的配置文件。 springProfile 配置如下所述。


根节点包含的属性

  • scan:设置此属性时 true 如果配置文件更改,将使用缺省值重新加载 true
  • scanPeriod:设置监控配置文件是否被修改的时间间隔。如果未指定时间单位,则默认单位为毫秒。什么时候 scantrue 此属性生效。默认时间间隔为1分钟。
  • debug:设置此属性时 true 什么时候,就会打印出来。 logback 内部日志信息,实时查看。 logback 运行状态。缺省值为 false

根节点 <configuration> 有5子节点,其将在下面详细描述。


子节点一 <root>

root节点是指定最基本的日志输出级别所需的节点,只有一个level属性。

level:用于设置打印级别,不区分大小写:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,无法设置INHERITED或同义词NULL。
默认是DEBUG。
可以包含零个或多个元素来标识此appender将添加到此loger。


  
  

子节点2: <contextName> 设置上下文名称

每个logger都关联到logger上下文中,默认的上下文名称为“default“。但是,您可以使用设置为其他名称的记录来区分不同的应用程序。一旦设置,就不能修改,可以通过 %contextName 要打印日志上下文名称,通常不使用该属性,它是可选的。

logback


子节点3: <property> 设置变量

用于定义变量值的标签, 有两个属性,name和value;其中name的值是变量的名称,value变量定义的值。通过定义将值插入到logger上下文。在定义变量之后,您可以使“${}“使用变量。


这里经过后可以看到 application.yml 传递参数。


子节点四: <appender>

appender用于格式化日志输出节点,有两个属性name和class,class用于指定输出策略,通常使用的是控制台输出策略和文件输出策略。

控制台输出 ConsoleAppender

  • 示例一:

    
    
    
        logback-demo
    
        
        
            
            
                %d -1 %msg%n
            
        
    
        
        
            
                %d -2 %msg%n
            
        
    
        
        
            
            
            
        
    
    

    可以看到 layoutencoder ,您可以将事件转换为格式化日志记录,但控制台输出使用。 layout ,则使用文件输出。 encoder ,具体原因可见一斑。 http://blog.csdn.net/cw_hello1/article/details/51969554

  • 示例二:

    
    
    
        logback-demo
    
        
        
            
            
                
                    %d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n
                
            
            
        
    
        
        
            
            
            
        
    

    输出日志:

    18:15:22.148 logback-demo [http-nio-9010-exec-1] INFO  c.e.demo.controller.UserContorller - 日志输出 info
    18:15:22.148 logback-demo [http-nio-9010-exec-1] WARN  c.e.demo.controller.UserContorller - 日志输出 warn
    18:15:22.148 logback-demo [http-nio-9010-exec-1] ERROR c.e.demo.controller.UserContorller - 日志输出 error
    18:15:22.148 logback-demo [http-nio-9010-exec-1] INFO  c.e.demo.controller.UserContorller - name:inke , age:33
    18:15:22.149 logback-demo [http-nio-9010-exec-1] INFO  c.e.demo.controller.UserContorller - name:inke , age:33

    <encoder> 表示日志已编码:

    • %d{HH: mm:ss.SSS}--记录输出时间
    • %thread--输出日志的进程名称,位于中。Web它在应用程序和异步任务处理中很有用。
    • %-5level--日志级别,并使用。5字符左对齐
    • %logger{36}--日志输出名称。
    • %msg--记录消息
    • %n--站台换行。
      ThresholdFilter为系统定义的拦截器,例如,我们使用。ThresholdFilter来过滤掉ERROR该级别以下的日志不会输出到文件。如果你不必记得把它注释掉,否则你的主机会发现没有日志。~
    • *

输出到文件 RollingFileAppender

另一种常见的日志输出到文件,随着应用程序运行的时间越来越长,日志会越来越多,将它们输出到同一个文件并不是一个好的方式。 RollingFileAppender 对于切片文件日志:


    
    
        
        ERROR
        
        DENY
        
        ACCEPT
    
    
    ${logback.logdir}/info.${logback.appname}.log
    
    
        
        ${logback.logdir}/info.${logback.appname}.%d{yyyy-MM-dd}.log
        
        90
        
        
    
    
    
        UTF-8
        %d [%thread] %-5level %logger{36} %line - %msg%n
    



    
    
        Error
    
    
    ${logback.logdir}/error.${logback.appname}.log
    
    
        
        ${logback.logdir}/error.${logback.appname}.%d{yyyy-MM-dd}.log
        
        90
        
        
    
    
    
        UTF-8
        %d [%thread] %-5level %logger{36} %line - %msg%n
    

如果同时有 <File><FileNamePattern> 根据日期拆分日志,代码注释写得很清楚。

如果你想区分 InfoError 日志级别,则需要使用规则过滤策略,代码注释写得非常清楚。


子节点五 <loger>

<loger> 用于设置包或特定类的日志打印级别,并指定 <appender><loger> 仅有一个 name 属性,则为可选 level 和一个可选的 addtivity 属性。

  • name :用于指定主题。loger约束包或特定类。
  • level :用于设置打印级别,不区分大小写:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,还有一个特殊的价值。INHERITED或同义词NULL,代表执法上级的水平。如果未设置此属性,则当前loger上级的水平将被继承。
  • addtivity :是否给上级loger传递打印信息。缺省值为true。

loger在实际使用中有两种情况。
让我们来看看如何在代码中使用它。

package com.dudu.controller;
@Controller
public class LearnController {
    private Logger logger = LoggerFactory.getLogger(this.getClass());

    @RequestMapping(value = "/login",method = RequestMethod.POST)
    @ResponseBody
    public Map login(HttpServletRequest request, HttpServletResponse response){
        //日志级别从低到高TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果已设置WARN,则低于WARN不会输出该信息。
        logger.trace("日志输出 trace");
        logger.debug("日志输出 debug");
        logger.info("日志输出 info");
        logger.warn("日志输出 warn");
        logger.error("日志输出 error");
        Map map =new HashMap();
        String userName=request.getParameter("userName");
        String password=request.getParameter("password");
        if(!userName.equals("") && password!=""){
            User user =new User(userName,password);
            request.getSession().setAttribute("user",user);
            map.put("result","1");
        }else{
            map.put("result","0");
        }
        return map;
    }
}

这是一种登录判断方法,我们引入日志,并打印不同级别的日志,然后根据。logback-spring.xml中的配置,以查看打印的级别日志。


第一点: loger 配置,未指定级别,无 appender

logback-spring.xml 增加 loger 配置如下:

<logger name="com.dudu.controller" /> 将控制 controller 打印了该包下所有类的日志,但没有设置打印级别,所以他继承了上级的日志级别。 “info”
没有设置 addtivity ,默认为true,将此 loger 将打印信息发送给上级;
没有设置 appender ,此 loger 其本身不打印任何信息。
<root level="info">root 设置了打印级别 “info” ,使用名称指定 “console”appender

当执行 com.dudu.controller.LearnController 类的 login 方法时, LearnController 在包com.dudu.controller,所以先执行。 <logger name="com.dudu.controller"/> ,级别为 “info” 及大于 “info” 将日志信息传递到 root ,本身不打印;
root 收到下级发送的信息后,移交给已配置的名为“console”的 appender 处理, “console” appender 将信息打印到控制台;

打印结果如下:

16:00:17.407 logback [http-nio-8080-exec-8] INFO  com.dudu.controller.LearnController - 日志输出 info
16:00:17.408 logback [http-nio-8080-exec-8] WARN  com.dudu.controller.LearnController - 日志输出 warn
16:00:17.408 logback [http-nio-8080-exec-8] ERROR com.dudu.controller.LearnController -

第二:拥有多个 loger 配置,指定级别,指定。 appender

logback-spring.xml 增加 loger 配置如下:


    ...

    
    
        
    

控制 com.dudu.controller.LearnController 类的日志打印,打印级别为“ WARN ”;
additivity 属性为 false ,表示此 loger 打印信息不再传达给上级。;
用名称“指定” console ”的 appender ;

现在是执行的时候了 com.dudu.controller.LearnController 类的login方法,则首先执行。 <logger name="com.dudu.controller.LearnController" level="WARN" additivity="false"> ,级别将为“ WARN “并且大于”WARN“日志信息被提供给这个 loger 指定的名称“ console ”的 appender 在控制台处理、录入日志,不再交给上级。 root 传递打印信息。

打印结果如下:

16:00:17.408 logback [http-nio-8080-exec-8] WARN  com.dudu.controller.LearnController - 日志输出 warn
16:00:17.408 logback [http-nio-8080-exec-8] ERROR com.dudu.controller.LearnController - 日志输出 error

当然,如果你把 additivity="false" 改成 additivity="true" 如果是,则打印两次,因为打印信息是传输给上级的,logger它本身只打印一次,root收到后,重新打印。

注意:


    ...

    
       
    

    

    

如果范围重叠,则范围很小且有效。


多环境日志输出


    ...

    
    
        
            
        
    

    
    
        
            
        
    

application.yml 增加环境选择的配置。 active: dev

server:
  port: 9010

spring:
  profiles:
    active: dev
  datasource:
    url: jdbc:mysql://localhost:3306/test?characterEncoding=utf8
    username: root
    password: root

mybatis:
    type-aliases-package: org.larry.springboot.entity
    mapper-locations: classpath:mapper/**/*.xml
    check-config-location: true

active: 【test、dev、prod】 ,根据 active 环境,自动使用上述配置。 springProfilelogger 日志


自定义日志路径(application.yml)

application.yml 添加与日志相关的自定义配置

logback:
  logdir: /Users/inke/dev/log/tomcat/sell
  appname: sell

logback-spring.xml




    
    
    

    ${appname}

    
    
        
        
            
                %d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n
            
        
    
    。。。
    。。。
版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除