springboot项目在centos7 中按照日生成日志 同时包含标准输出
时间: 2025-08-02 21:24:35 浏览: 2
<think>我们正在处理用户关于在CentOS7上配置SpringBoot项目按日生成日志并包含标准输出的问题。用户使用了logback作为日志框架。根据用户需求,我们需要配置logback,使其按天滚动生成日志文件,并且捕获标准输出(即控制台输出)。步骤:1.在SpringBoot项目中,默认使用logback,因此我们需要在resources目录下创建logback-spring.xml配置文件。2.配置一个控制台Appender(用于输出到控制台)和一个按天滚动的文件Appender。3.配置日志文件的按天滚动策略,并设置日志文件名的模式,包括日期。4.确保标准输出(System.out)和标准错误(System.err)也被捕获到日志文件中。注意:logback默认不会捕获System.out,除非我们配置了`<consoleAppender>`,但通常我们使用日志框架的API(如logger.info)来记录日志。然而,有些第三方库可能会直接输出到控制台,因此我们需要将控制台输出重定向到日志文件。在SpringBoot中,默认已经将控制台输出(通过logback的ConsoleAppender)同时输出到了控制台和日志文件(如果配置了文件Appender)。但是,如果我们想要将标准输出(System.out)和标准错误(System.err)也写入文件,我们可以通过配置来实现。实际上,SpringBoot在启动时会将System.out和System.err重定向到logback,但默认情况下logback的ConsoleAppender只会输出到控制台。因此,我们需要在文件Appender中捕获这些输出。我们可以通过以下方式:-配置一个RollingFileAppender,按天滚动日志文件。-配置一个ConsoleAppender,用于在控制台输出,同时我们也可以将日志输出到文件。但是,为了捕获所有输出(包括System.out和System.err),我们需要确保这些输出被重定向到logback。SpringBoot已经做了这个工作,所以我们只需要配置好文件Appender,并将rootlogger的日志输出到文件和控制台(如果需要)即可。配置示例(logback-spring.xml):```xml<?xmlversion="1.0"encoding="UTF-8"?><configuration><!--定义日志文件的存储位置--><propertyname="LOG_PATH"value="/var/log/myapp"/><propertyname="LOG_FILE"value="${LOG_PATH}/application.log"/><!--控制台输出--><appendername="CONSOLE"class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{yyyy-MM-ddHH:mm:ss.SSS}[%thread]%-5level%logger{36}-%msg%n</pattern></encoder></appender><!--按天滚动日志文件--><appendername="FILE"class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${LOG_FILE}</file><rollingPolicyclass="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!--每日滚动,文件格式:application-2020-01-01.log--><fileNamePattern>${LOG_PATH}/application-%d{yyyy-MM-dd}.log</fileNamePattern><!--保留30天的日志--><maxHistory>30</maxHistory></rollingPolicy><encoder><pattern>%d{yyyy-MM-ddHH:mm:ss.SSS}[%thread]%-5level%logger{36}-%msg%n</pattern></encoder></appender><!--设置日志级别--><rootlevel="INFO"><appender-refref="CONSOLE"/><appender-refref="FILE"/></root></configuration>```注意:-日志文件将存储在`/var/log/myapp`目录下,请确保该目录存在且应用程序有写入权限。-我们配置了按天滚动,并且保留30天的日志。-同时输出到控制台和文件。但是,上述配置中,控制台输出(CONSOLEappender)会将日志输出到控制台,而文件输出(FILEappender)会输出到文件。由于rootlogger同时引用了这两个appender,所以日志会同时输出到两个地方。关于标准输出:SpringBoot在启动时会将System.out和System.err重定向到logback,所以通过System.out.println打印的内容也会被logback捕获,但是默认情况下,这些内容会被输出到控制台(通过CONSOLEappender)。如果我们希望将这些内容也写入文件,那么只需要将rootlogger配置为同时使用文件appender即可,如上配置。然而,需要注意的是,System.out.println输出的日志级别是INFO,所以会被rootlogger的INFO级别捕获,从而写入文件。另外,如果我们需要将标准输出和错误输出分开,可以单独配置,但上述配置已经将它们都包含在同一个日志文件中了。在CentOS7上部署时,我们还需要确保:1.日志目录存在:在服务器上创建日志目录,并赋予写权限。```bashmkdir-p/var/log/myappchown<user>:<group>/var/log/myapp#替换为运行SpringBoot的用户和组chmod755/var/log/myapp```2.在SpringBoot的application.properties中,我们可以通过`logging.file.name`或`logging.file.path`来指定日志文件,但是如果我们已经配置了logback-spring.xml,则logback的配置会覆盖application.properties中的配置。3.如果使用systemd服务来管理SpringBoot应用,我们也可以配置systemd的日志管理(如journald)来捕获日志,但这里我们使用logback来管理日志文件。4.如果希望将标准输出和错误输出重定向到文件,我们也可以在启动脚本中指定输出重定向,例如:```bashjava-jarmyapp.jar>>/var/log/myapp/console.log2>&1```但是这样做的话,日志文件就不会按天滚动了,而且会一直增长。因此,我们不推荐这种方式,而是使用logback的滚动功能。因此,我们推荐使用logback配置文件来管理日志。总结配置步骤:1.在SpringBoot项目的src/main/resources目录下创建logback-spring.xml文件,内容如上。2.在服务器上创建日志目录并设置权限。3.启动应用,检查日志是否按天生成。相关问题:§§相关问题§§1.如何在logback中配置日志文件的最大大小?2.如何将不同级别的日志输出到不同的文件?3.在CentOS7上,如何设置logback日志文件的自动清理?4.如何配置logback以同时输出JSON格式的日志?</think>### Spring Boot 在 CentOS 7 上配置按天生成日志(含标准输出)
以下是使用 Logback 在 CentOS 7 上实现 Spring Boot 日志按天滚动并捕获标准输出的完整配置方案:
#### 1. 添加 Logback 配置文件
在 `src/main/resources` 下创建 **logback-spring.xml**:
```xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 定义日志存储目录 -->
<property name="LOG_PATH" value="/var/log/myapp" />
<property name="LOG_FILE" value="${LOG_PATH}/application.log" />
<!-- 控制台输出(捕获标准输出) -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- 按天滚动的文件日志 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_FILE}</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 每日滚动日志文件 -->
<fileNamePattern>${LOG_PATH}/application-%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 保留30天日志 -->
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- 捕获 System.out -->
<appender name="STDOUT" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/stdout.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/stdout-%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%msg%n</pattern>
</encoder>
</appender>
<!-- 重定向 System.out 到日志 -->
<logger name="STDOUT_LOGGER" additivity="false">
<appender-ref ref="STDOUT" />
</logger>
<!-- 根日志配置 -->
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
</root>
</configuration>
```
#### 2. 重定向标准输出
在 Spring Boot 主类中添加初始化方法:
```java
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import java.io.PrintStream;
@SpringBootApplication
public class MyApplication {
// 创建专用 Logger
private static final Logger stdoutLogger =
LoggerFactory.getLogger("STDOUT_LOGGER");
public static void main(String[] args) {
// 重定向 System.out
System.setOut(new PrintStream(System.out) {
@Override
public void println(String x) {
stdoutLogger.info(x);
}
});
SpringApplication.run(MyApplication.class, args);
}
}
```
#### 3. CentOS 7 服务器配置
```bash
# 创建日志目录并授权
sudo mkdir -p /var/log/myapp
sudo chown -R $USER:$USER /var/log/myapp # 替换为实际运行用户
sudo chmod 755 /var/log/myapp
# 验证目录权限
ls -ld /var/log/myapp
# 期望输出: drwxr-xr-x 2 youruser yourgroup 4096 Jan 1 12:00 /var/log/myapp
```
#### 4. 应用部署命令
使用 nohup 确保后台运行:
```bash
nohup java -jar your-app.jar > /dev/null 2>&1 &
```
#### 5. 验证日志生成
```bash
# 查看当天日志
ls /var/log/myapp
# 应包含类似文件:
# application-2023-10-01.log
# stdout-2023-10-01.log
# 查看实时日志
tail -f /var/log/myapp/application.log
```
### 关键配置说明
1. **按天滚动机制**
```xml
<fileNamePattern>${LOG_PATH}/application-%d{yyyy-MM-dd}.log</fileNamePattern>
```
每天 00:00 自动创建新日志文件
2. **标准输出捕获**
通过重定向 `System.out` 到 SLF4J Logger,确保 `System.out.println()` 内容写入滚动日志
3. **日志保留策略**
```xml
<maxHistory>30</maxHistory> <!-- 自动保留最近30天日志 -->
```
4. **权限管理**
CentOS 的 `/var/log` 目录需要显式授权,避免出现 `Permission denied` 错误[^1]
> 提示:生产环境建议配合 `logrotate` 实现日志压缩和定期清理[^3]
阅读全文
相关推荐




















