运行 jar 应用程序如何在某处记录错误信息
how does record error info in somewhere when running jar application
我有 spring 下面的启动应用程序是获取 RuntimeException 示例。
@RestController
public class HelloController {
@GetMapping("/getRuntimeError")
public String hello() {
throw new RuntimeException("error");
}
}
运行 在 linux
启动命令:
nohup java -jar app.jar > app.log
当 运行 发生时间错误时,我会使用 vim 编辑 app.log 检查错误是什么。
但是当app.log文件增长到2GB时,我无法查看具体错误是什么,因为文件太大了。
所以
我正在使用 log4j2 RollingFile logger 记录日志,但无法获取实际的 RuntimeException 堆栈信息。
这是 log4j2 配置
<?xml version="1.0" encoding="utf-8"?>
<configuration status="warn">
<Properties>
<Property name="LOG_EXCEPTION_CONVERSION_WORD">%xwEx</Property>
<Property name="LOG_DATEFORMAT_PATTERN">yyyy-MM-dd HH:mm:ss.SSS</Property>
<Property name="CONSOLE_LOG_PATTERN">%clr{%d{${LOG_DATEFORMAT_PATTERN}}}{faint} %clr{%5p} %clr{%pid}{magenta} %clr{---}{faint} %clr{[%15.15t]}{faint} %clr{%-40.40c{1.}}{cyan} %clr{:}{faint} %m%n${sys:LOG_EXCEPTION_CONVERSION_WORD}</Property>
</Properties>
<appenders>
<console name="Console" target="SYSTEM_OUT" follow="true">
<PatternLayout
pattern="${sys:CONSOLE_LOG_PATTERN}"/>
</console>
<RollingFile name="RollingFileInfo" fileName="logs/info.log"
filePattern="logs/log-INFO-%d{yyyy-MM-dd}_%i.log.gz"
append="false">
<PatternLayout pattern="${CONSOLE_LOG_PATTERN}"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="200MB"/>
</Policies>
<DefaultRolloverStrategy max="15"/>
</RollingFile>
</appenders>
<loggers>
<root level="info" includeLocation="false">
<appender-ref ref="Console"/>
<appender-ref ref="RollingFileInfo"/>
</root>
</loggers>
</configuration>
使用这个命令
nohup java -jar app.jar > /dev/null > 2>&1 &
我的问题是:如何记录错误并避免文件太大
任何建议
感谢您的帮助
我相信你要实现的是将错误记录到日志文件中,然后交叉检查堆栈跟踪。
你可以做的是使用记录器,例如 log4j 或 slf4j 库。您可以指定在创建新文件之前文件可以达到的最大大小。
据我了解,您的记录器配置为记录到控制台,然后您将该输出重定向到文件。
相反,您应该将记录器配置为写入文件,然后很容易配置日志轮换策略 (see spring boot documentation)。
如果您提供 log4j 配置,会更容易提供帮助。
编辑:
感谢您提供 log4j 配置。
问题可能是 spring 未加载您的 log4j 文件。如果你想使用 log4j 将你的文件放在资源文件夹中并将依赖项添加到你的 maven 或 gradle 文件:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
</dependencies>
记得排除spring-boot-starter-logging
。
您的日志现在应该在控制台中可见(这里的控制台是指 spring 引导应用程序所在的终端 运行,而不是 curl
客户端执行的终端)和 info.log
文件。
您也可以使用 logback 文件而不是 log4j 配置相同的东西。在这种情况下,您不必更改构建文件,只需将配置放入 spring 引导 application.properties
文件即可。
我有 spring 下面的启动应用程序是获取 RuntimeException 示例。
@RestController
public class HelloController {
@GetMapping("/getRuntimeError")
public String hello() {
throw new RuntimeException("error");
}
}
运行 在 linux
启动命令:
nohup java -jar app.jar > app.log
当 运行 发生时间错误时,我会使用 vim 编辑 app.log 检查错误是什么。
但是当app.log文件增长到2GB时,我无法查看具体错误是什么,因为文件太大了。
所以 我正在使用 log4j2 RollingFile logger 记录日志,但无法获取实际的 RuntimeException 堆栈信息。
这是 log4j2 配置
<?xml version="1.0" encoding="utf-8"?>
<configuration status="warn">
<Properties>
<Property name="LOG_EXCEPTION_CONVERSION_WORD">%xwEx</Property>
<Property name="LOG_DATEFORMAT_PATTERN">yyyy-MM-dd HH:mm:ss.SSS</Property>
<Property name="CONSOLE_LOG_PATTERN">%clr{%d{${LOG_DATEFORMAT_PATTERN}}}{faint} %clr{%5p} %clr{%pid}{magenta} %clr{---}{faint} %clr{[%15.15t]}{faint} %clr{%-40.40c{1.}}{cyan} %clr{:}{faint} %m%n${sys:LOG_EXCEPTION_CONVERSION_WORD}</Property>
</Properties>
<appenders>
<console name="Console" target="SYSTEM_OUT" follow="true">
<PatternLayout
pattern="${sys:CONSOLE_LOG_PATTERN}"/>
</console>
<RollingFile name="RollingFileInfo" fileName="logs/info.log"
filePattern="logs/log-INFO-%d{yyyy-MM-dd}_%i.log.gz"
append="false">
<PatternLayout pattern="${CONSOLE_LOG_PATTERN}"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="200MB"/>
</Policies>
<DefaultRolloverStrategy max="15"/>
</RollingFile>
</appenders>
<loggers>
<root level="info" includeLocation="false">
<appender-ref ref="Console"/>
<appender-ref ref="RollingFileInfo"/>
</root>
</loggers>
</configuration>
使用这个命令
nohup java -jar app.jar > /dev/null > 2>&1 &
我的问题是:如何记录错误并避免文件太大
任何建议
感谢您的帮助
我相信你要实现的是将错误记录到日志文件中,然后交叉检查堆栈跟踪。
你可以做的是使用记录器,例如 log4j 或 slf4j 库。您可以指定在创建新文件之前文件可以达到的最大大小。
据我了解,您的记录器配置为记录到控制台,然后您将该输出重定向到文件。
相反,您应该将记录器配置为写入文件,然后很容易配置日志轮换策略 (see spring boot documentation)。
如果您提供 log4j 配置,会更容易提供帮助。
编辑: 感谢您提供 log4j 配置。
问题可能是 spring 未加载您的 log4j 文件。如果你想使用 log4j 将你的文件放在资源文件夹中并将依赖项添加到你的 maven 或 gradle 文件:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
</dependencies>
记得排除spring-boot-starter-logging
。
您的日志现在应该在控制台中可见(这里的控制台是指 spring 引导应用程序所在的终端 运行,而不是 curl
客户端执行的终端)和 info.log
文件。
您也可以使用 logback 文件而不是 log4j 配置相同的东西。在这种情况下,您不必更改构建文件,只需将配置放入 spring 引导 application.properties
文件即可。