> For the complete documentation index, see [llms.txt](https://jack80342.gitbook.io/spring-boot/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://jack80342.gitbook.io/spring-boot/iv.-spring-boot-features/26.-logging/26.5.-custom-log-configuration.md).

# 26.5. 自定义日志配置

通过将相应的库添加到classpath可以激活各种日志系统，然后在classpath根目录下提供合适的配置文件可以进一步定制日志系统，配置文件也可以通过Spring `Environment`的`logging.config`属性指定。

使用`org.springframework.boot.logging.LoggingSystem`系统属性可以强制Spring Boot使用指定的日志系统，该属性值需要是`LoggingSystem`实现类的全限定名，如果值为`none`，则彻底禁用Spring Boot的日志配置。

**注** 由于日志初始化早于`ApplicationContext`的创建，所以不可能通过`@PropertySources`指定的Spring `@Configuration`文件控制日志，系统属性和Spring Boot外部化配置可以正常工作。

以下文件会根据你选择的日志系统进行加载：

| 日志系统                    |                                     定制配置                                    |
| ----------------------- | :-------------------------------------------------------------------------: |
| Logback                 | `logback-spring.xml`,`logback-spring.groovy`,`logback.xml`或`logback.groovy` |
| Log4j                   |                        `log4j.properties`或`log4j.xml`                       |
| Log4j2                  |                       `log4j2-spring.xml`或`log4j2.xml`                      |
| JDK (Java Util Logging) |                             `logging.properties`                            |

**注** 如果可能的话，建议你使用`-spring`变种形式定义日志配置（例如，使用`logback-spring.xml`而不是`logback.xml`）。如果你使用标准的配置路径，Spring可能不能够完全控制日志初始化。

**注** Java Util Logging从可执行jar运行时会导致一些已知的类加载问题，我们建议尽可能不使用它。

以下是从Spring `Envrionment`转换为System properties的一些有助于定制的配置属性：

| Spring Environment                  |         System Property         |                    Comments                   |
| ----------------------------------- | :-----------------------------: | :-------------------------------------------: |
| `logging.exception-conversion-word` | `LOG_EXCEPTION_CONVERSION_WORD` |                   记录异常使用的关键字                  |
| `logging.file`                      |            `LOG_FILE`           |               如果指定就会在默认的日志配置中使用               |
| `logging.file.max-size`             |       `LOG_FILE_MAX_SIZE`       |   最大日志文件大小（如果LOG\_FILE启用）。（只支持默认的Logback设置）   |
| `logging.file.max-history`          |      `LOG_FILE_MAX_HISTORY`     | 保留的归档文件的最大数量（如果LOG\_FILE启用）。（只支持默认的Logback设置） |
| `logging.path`                      |            `LOG_PATH`           |               如果指定就会在默认的日志配置中使用               |
| `logging.pattern.console`           |      `CONSOLE_LOG_PATTERN`      |    日志输出到控制台（stdout）时使用的模式（只支持默认的logback设置）    |
| `logging.pattern.dateformat`        |     `LOG_DATEFORMAT_PATTERN`    |          日志日期格式的输出格式（只支持默认的logback设置）         |
| `logging.pattern.file`              |        `FILE_LOG_PATTERN`       |  日志输出到文件时使用的模式（如果LOG\_FILE启用，只支持默认的logback设置） |
| `logging.pattern.level`             |       `LOG_LEVEL_PATTERN`       |      用来渲染日志级别的格式（默认`%5p`，只支持默认的logback设置）     |
| `PID`                               |              `PID`              |     当前的处理进程(process)ID（能够找到，且还没有用作OS环境变量）     |

所有支持的日志系统在解析配置文件时都能获取系统属性的值，具体可以参考`spring-boot.jar`中的默认配置。

* [Logback](https://github.com/spring-projects/spring-boot/tree/v2.0.0.RELEASE/spring-boot-project/spring-boot/src/main/resources/org/springframework/boot/logging/logback/defaults.xml)
* [Log4j 2](https://github.com/spring-projects/spring-boot/tree/v2.0.0.RELEASE/spring-boot-project/spring-boot/src/main/resources/org/springframework/boot/logging/log4j2/log4j2.xml)
* [Java Util logging](https://github.com/spring-projects/spring-boot/tree/v2.0.0.RELEASE/spring-boot-project/spring-boot/src/main/resources/org/springframework/boot/logging/java/logging-file.properties)

**注** 如果想在日志属性中使用占位符，你需要使用[Spring Boot的语法](http://docs.spring.io/spring-boot/docs/2.0.0.RELEASE/reference/htmlsingle/#boot-features-external-config-placeholders-in-properties)，而不是底层框架的语法。尤其是使用Logback时，你需要使用`:`作为属性名和默认值的分隔符，而不是`:-`。

**注** 通过覆盖`LOG_LEVEL_PATTERN`（Logback对应`logging.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
```
