23.md 12.1 KB
Newer Older
W
mkdocs  
wizardforcel 已提交
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 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185
# 26\. 日志

Spring Boot使用[Commons Logging](https://commons.apache.org/logging)进行所有内部日志记录,但使基础日志实现开放。 默认配置提供了[Java Util Logging](https://docs.oracle.com/javase/7/docs/api/java/util/logging/package-summary.html)[Log4J2](https://logging.apache.org/log4j/2.x/)[Logback](http://logback.qos.ch/)。 在每种情况下,记录器都预先配置为使用控制台输出和可选文件输出都可用。

默认情况下,如果使用'Starters',将会使用Logback。 还包括适当的Logback路由,以确保使用Java Util Logging,Commons Logging,Log4J或SLF4J的依赖库都能正常工作。

> 有很多可用于Java的日志记录框架。 如果上面的列表看起来很混乱,别担心。 一般来说,您不需要更改日志依赖关系,并且Spring Boot默认值将正常工作。

### [](file:///C:/Users/geekidentity/AppData/Local/Youdao/YNote/markdown/index.html#261-日志格式)26.1 日志格式

Spring Boot的默认日志输出如下所示:

```
2014-03-05 10:57:51.112  INFO 45469 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/7.0.52
2014-03-05 10:57:51.253  INFO 45469 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2014-03-05 10:57:51.253  INFO 45469 --- [ost-startStop-1] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 1358 ms
2014-03-05 10:57:51.698  INFO 45469 --- [ost-startStop-1] o.s.b.c.e.ServletRegistrationBean        : Mapping servlet: 'dispatcherServlet' to [/]
2014-03-05 10:57:51.702  INFO 45469 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean  : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
```

输出以下项目:

*   日期和时间 - 毫秒精度并且容易排序。
*   日志级别 - ERROR, WARN, INFO, DEBUG, TRACE.
*   进程ID。
*   ---分隔符来区分实际日志消息的开始。
*   线程名称 - 括在方括号中(可能会截断控制台输出)。
*   记录器名称 - 这通常是源类名(通常缩写)。
*   日志消息。

> Logback没有FATAL级别(对映ERROR)

### [](file:///C:/Users/geekidentity/AppData/Local/Youdao/YNote/markdown/index.html#262-控制台输出)26.2 控制台输出

默认的日志配置会在控制台显示消息。 默认情况下会记录ERROR,WARN和INFO级别的消息。 您还可以通过--debug启动您的应用程序来启用“debug”模式。

```
$ java -jar myapp.jar --debug
```

> 您还可以在application.properties中指定debug=true。

当启用debug模式时,配置核心记录器(嵌入式容器,Hibernate和Spring Boot)的选择可以输出更多信息。 启用debug 模式不会将应用程序配置为使用DEBUG级别记录所有消息。

或者,您可以使用--trace启动应用程序(或在您的application.properties中为trace=true)启用“trace”模式。 这将为核心记录器(嵌入式容器,Hibernate模式生成和整个Spring组合)启用trace日志。

#### [](file:///C:/Users/geekidentity/AppData/Local/Youdao/YNote/markdown/index.html#2621-日志颜色输出)26.2.1 日志颜色输出

如果您的终端支持ANSI,颜色输出可以增加可读性。 您可以将spring.output.ansi.enabled设置为[支持的值](http://docs.spring.io/spring-boot/docs/1.5.2.RELEASE/api/org/springframework/boot/ansi/AnsiOutput.Enabled.html)来覆盖自动检测。

使用%clr关键字配置颜色编码。 在最简单的形式下,转换器将根据日志级别对输出进行着色,例如:

```
%clr(%5p)
```

日志级别映射到颜色如下:

*   blue
*   cyan
*   faint
*   green
*   magenta
*   red
*   yellow

### [](file:///C:/Users/geekidentity/AppData/Local/Youdao/YNote/markdown/index.html#263-文件输出)26.3 文件输出

默认情况下,Spring Boot将仅将日志输出到控制台,不会写到文件。 如果要将控制台上的日志输出到日志文件,则需要设置logging.file或logging.path属性(例如在application.properties中)。

下表显示了如何一起使用logging.*属性:

表26.1 Logging属性

| logging.file | logging.path | Example | Description |
| --- | --- | --- | --- |
| (none) | (none) |   | 仅控制台输出 |
| Specific file | (none) | my.log | 写入指定的日志文件。 名称可以是确切的位置或相对于当前目录。 |
| (none) | Specific directory | /var/log | 将spring.log写入指定的目录。 名称可以是确切的位置或相对于当前目录。 |

日志文件将在10 MB时滚动输出到文件,默认情况下会记录控制台输出,ERROR,WARN和INFO级别的消息。

> 日志记录系统在应用程序生命周期早期初始化,并且在通过@PropertySource注解加载的属性文件中将不会找到log属性[。](http://note.youdao.com/)

> 日志属性独立于实际的日志记录基础结构。 因此,特定配置key(如Logback的logback.configurationFile)不受Spring Boot管理。

### [](file:///C:/Users/geekidentity/AppData/Local/Youdao/YNote/markdown/index.html#264-日志级别)26.4 日志级别

所有支持的日志记录系统都可以在Spring Environment 中设置log级别(例如在application.properties中),使用‘logging.level.*=LEVEL’,其中'LEVEL'是TRACE,DEBUG,INFO,WARN,ERROR,FATAL, OFF之一。 可以使用logging.level.root配置根记录器。 示例application.properties:

```
logging.level.root=WARN
logging.level.org.springframework.web=DEBUG
logging.level.org.hibernate=ERROR
```

> 默认情况下,Spring Boot会重新启动Thymeleaf INFO消息,以便它们以DEBUG级别进行记录。 这有助于降低标准日志输出中的噪音。 有关如何在自己的配置中应用重映射的详细信息,请参阅[LevelRemappingAppender](https://github.com/spring-projects/spring-boot/tree/v1.5.2.RELEASE/spring-boot/src/main/java/org/springframework/boot/logging/logback/LevelRemappingAppender.java)。

### [](file:///C:/Users/geekidentity/AppData/Local/Youdao/YNote/markdown/index.html#265-自定义日志配置)26.5 自定义日志配置

可以通过在类路径中包含适当的库来激活各种日志系统,并通过在类路径的根目录中提供合适的配置文件,或在Spring Environment属性logging.config指定的位置进一步配置。

您可以使用org.springframework.boot.logging.LoggingSystem系统属性强制Spring Boot使用特定的日志记录系统。该值应该是LoggingSystem实现的全名。 您还可以使用`none`值完全禁用Spring Boot的日志记录配置。

> 由于在创建ApplicationContext之前初始化日志,因此无法在Spring @Configuration文件中控制@PropertySources的日志记录。 系统属性和常规的Spring Boot外部配置文件工作正常。

根据您的日志记录系统,将会加载以下文件:

| Logging System | Customization |
| --- | --- |
| Logback | logback-spring.xml, logback-spring.groovy, logback.xml or logback.groovy |
| Log4j2 | log4j2-spring.xml or log4j2.xml |
| JDK (Java Util Logging) | logging.properties |

> 如果可能,我们建议您使用-spring变体进行日志记录配置(例如使用logback-spring.xml而不是logback.xml)。 如果使用标准配置位置,则Spring无法完全控制日志初始化。

> Java Util Logging存在已知的类加载问题,从“可执行jar”运行时会导致问题。 我们建议您尽可能避免。

帮助定制一些其他属性从Spring环境转移到系统属性:

| Spring Environment | System Property | Comments |
| --- | --- | --- |
| logging.exception-conversion-word | LOG_EXCEPTION_CONVERSION_WORD | 记录异常时使用的转换字。 |
| logging.file | LOG_FILE | 如果定义了,则用于默认日志配置。 |
| logging.path | LOG_PATH | 如果定义了,则用于默认日志配置。 |
| logging.pattern.console | CONSOLE_LOG_PATTERN | 在控制台上使用的日志模式(stdout)。 (仅支持默认logback设置。) |
| logging.pattern.file | FILE_LOG_PATTERN | 在文件中使用的日志模式(如果LOG_FILE已启用)。 (仅支持默认logback设置。) |
| logging.pattern.level | LOG_LEVEL_PATTERN | 用于呈现日志级别的格式(默认%5p)。 (仅支持默认logback设置。) |
| PID | PID | 当前进程ID(如果可能的话,当未被定义为OS环境变量时被发现)。 |

支持的所有日志记录系统在分析其配置文件时可以查看系统属性。 有关示例,请参阅spring-boot.jar中的默认配置。

> 如果要在logging属性中使用占位符,则应使[用Spring Boot的语法](http://docs.spring.io/spring-boot/docs/1.5.2.RELEASE/reference/htmlsingle/#boot-features-external-config-placeholders-in-properties),而不是底层框架的语法。 值得注意的是,如果您使用Logback,您应该使用:作为属性名称与其默认值之间的分隔符,而不是`:-`。

> 您可以通过覆盖LOG_LEVEL_PATTERN(或Logback的log.pattern.level)来添加MDC和其他ad-hoc内容到日志行。 例如,如果使用logging.pattern.level = user:%X {user}%5p,则默认日志格式将包含“user”的MDC条目(如果存在)。

```
2015-09-30 12:30:04.031 user:juergen INFO 22174 --- [  nio-8080-exec-0] demo.Controller
Handling authenticated request
```

### [](file:///C:/Users/geekidentity/AppData/Local/Youdao/YNote/markdown/index.html#266-logback扩展)26.6 Logback扩展

Spring Boot包括大量的Logback扩展,可以帮助您进行高级配置。 您可以在logback-spring.xml配置文件中使用这些扩展。

> 您不能在标准logback.xml配置文件中使用扩展名,因为其加载时间太早。 您需要使用logback-spring.xml或定义logging.config属性。

> 扩展名不能与Logback的[配置扫描](http://logback.qos.ch/manual/configuration.html#autoScan)一起使用。 如果您尝试这样做,对配置文件进行更改将导致类似于以下记录之一的错误:

```
ERROR in ch.qos.logback.core.joran.spi.Interpreter@4:71 - no applicable action for [springProperty], current ElementPath is [[configuration][springProperty]]
ERROR in ch.qos.logback.core.joran.spi.Interpreter@4:71 - no applicable action for [springProfile], current ElementPath is [[configuration][springProfile]]
```

#### [](file:///C:/Users/geekidentity/AppData/Local/Youdao/YNote/markdown/index.html#2661-指定配置文件配置)26.6.1 指定配置文件配置

`<springProfile>`标签允许您根据活动的Spring配置文件可选地包含或排除配置部分。 配置文件部分支持`<configuration>`元素在任何位置。 使用name属性指定哪个配置文件接受配置。 可以使用逗号分隔列表指定多个配置文件。

```
<springProfile name="staging">
    <!-- configuration to be enabled when the "staging" profile is active -->
</springProfile>

<springProfile name="dev, staging">
    <!-- configuration to be enabled when the "dev" or "staging" profiles are active -->
</springProfile>

<springProfile name="!production">
    <!-- configuration to be enabled when the "production" profile is not active -->
</springProfile>
```

#### [](file:///C:/Users/geekidentity/AppData/Local/Youdao/YNote/markdown/index.html#2662-环境属性)26.6.2 环境属性

&lt;springProperty&gt;标签允许您从Spring环境中显示属性,以便在Logback中使用。 如果您在logback中访问application.properties文件中的值,这将非常有用。 标签的工作方式与Logback标准的&lt;property&gt;标签类似,但不是指定直接值,而是指定属性的来源(来自Environment)。 如果需要将属性存储在本地范围以外的位置,则可以使用scope属性。 如果在环境中未设置属性的情况下需要备用值,则可以使用defaultValue属性。

```
<springProperty scope="context" name="fluentHost" source="myapp.fluentd.host" defaultValue="localhost"/>
<appender name="FLUENT" class="ch.qos.logback.more.appenders.DataFluentAppender">
    <remoteHost>${fluentHost}</remoteHost>
    ...
</appender>
```

RelaxedPropertyResolver用于访问Environment属性。 如果以虚线表示法(my-property-name)指定源,则将尝试所有宽松的变体(myPropertyName,MY_PROPERTY_NAME等)。