I'm have spring boot application below is get RuntimeException sample.
@RestController
public class HelloController {
@GetMapping("/getRuntimeError")
public String hello() {
throw new RuntimeException("error");
}
}
run on linux
start command:
nohup java -jar app.jar > app.log
when runtime error occurred I'd use vim edit app.log check what error is.
but when app.log file growth size 2GB, I can't view what exactly the error because file too large.
so I'm using log4j2 RollingFile logger record log, but can't actual RuntimeException stack info.
this is log4j2 config
<?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>
using this command
nohup java -jar app.jar > /dev/null > 2>&1 &
I'm problem is: how can record Error and also avoid file too large
any suggestions
Thanks for the help
I believe what you what to achieve is to be logging the errors to a log file and later cross check the stacktrace.
What you can do is use a logger, for example log4j or slf4j library. You can specify the the maximum size which the file can reach before a new one is created.
From what I understand your logger is configured to log to the console and then you redirect that output to the file.
Instead you should configure logger to write to a file and then it's easy to configure log rotation policy ( see spring boot documentation ).
Would be much easier to help if you provide your log4j configuration.
Edit: Thanks for providing log4j config.
The problem can be that your log4j file is not loaded by spring. If you want to use log4j place your file in the resources folder and add dependencies to your maven or gradle file:
<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>
Remember to exclude the spring-boot-starter-logging
. Your logs should be now visible in the console (by console I mean the terminal where spring boot application is running, not where curl
client is executed) and in the info.log
file.
You could also configure the same thing using logback file instead of log4j. You wouldn't have to change your build file in this case, just put the confing into spring boot application.properties
file.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.