簡體   English   中英

運行 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 記錄器記錄日志,但不能實際 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 &

卷曲錯誤信息

我的問題是:如何記錄錯誤並避免文件太大

有什么建議么

謝謝您的幫助

我相信您要實現的是將錯誤記錄到日志文件中,然后交叉檢查堆棧跟蹤。

您可以使用記錄器,例如log4jslf4j庫。 您可以指定在創建新文件之前文件可以達到的最大大小。

據我了解,您的記錄器配置為登錄到控制台,然后您將 output 重定向到文件。

相反,您應該將記錄器配置為寫入文件,然后很容易配置日志輪換策略( 請參閱 spring 引導文檔)。

如果您提供 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文件即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM