从命令行运行时,stacktrace中没有换行符吗?

时间:2016-02-25 15:57:05

标签: java command-line log4j2

当我从命令行运行我的应用程序(标准Windows 7)时,我的日志文件中的堆栈跟踪没有换行符。

(嗯,我想粘贴一个例子,但是当我从记事本中的日志中复制堆栈跟踪并将其粘贴到我的浏览器中时,突然出现换行符)

我也尝试使用editplus编辑器打开日志,但也没有运气,stacktraces没有换行符(进入)。

我的模式布局非常标准(log4j2):

<PatternLayout>
<Pattern>%d [%15.15t] %-5p %-30.30c{3} %10X{username} - %m%n</Pattern>
</PatternLayout>

我只是启动我的应用程序jar(runnable jar)

java -jar myapp.jar

当我从eclipse运行我的应用程序时,日志中的堆栈跟踪确实有换行/输入。

任何人都知道问题可能在哪里?

[编辑] 4个字符的十六进制,第1行的第一个字符和第2行的最后一个字符。

74 0A 09 61 

这是:

T - something that isn't a newline? - tab? - A

[edit]一个没有依赖关系的简单示例,除了log4j2:

import java.net.SocketTimeoutException;

public class App {
    private org.apache.logging.log4j.Logger log= org.apache.logging.log4j.LogManager.getLogger(App.class);
    public App() {  
        log.error("0", new SocketTimeoutException("test"));
        log.debug("starting");
        log.debug("starting2");
        log.debug("starting3");
        log.debug("starting4");
        log.debug("starting5");
        System.exit(1);
    }

    public static void main(String[] args) {
        new App();
    }
}

log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout>
                <Pattern>%d [%15.15t] %-5p %-30.30c{3} %10X{username} - %m%n</Pattern>
            </PatternLayout>
        </Console>
        <RandomAccessFile name="MyFile" fileName="client.log">
            <PatternLayout>
                <Pattern>%d [%15.15t] %-5p %-30.30c{3} %10X{username} - %m%n</Pattern>
            </PatternLayout>
        </RandomAccessFile>
    </Appenders>
    <Loggers>

        <Logger name="com.tate.world" level="debug" additivity="false">
            <AppenderRef ref="Console" />
            <AppenderRef ref="MyFile" />
        </Logger>


        <Root level="info">
            <AppenderRef ref="Console" />
        </Root>

    </Loggers>

</Configuration>

创建一个可运行的jar并从命令行运行它:

java -jar test.jar

现在用notepad打开client.log,SocketTimeoutException栈跟踪没有换行符。

这是我的manifest.mf:

Manifest-Version: 1.0
Class-Path: . app_lib/log4j-api-2.4.1.jar ap
 p_lib/log4j-core-2.4.1.jar
Main-Class: com.tate.world.test.App

(我也试过最新的2.5) 如何在堆栈跟踪中获取换行符(显示在记事本中)?

感谢阅读!

[edit]对于非常奇怪的事情,请注释:

log.debug("starting2");
log.debug("starting3");
log.debug("starting4");
log.debug("starting5");

然后从命令行再次运行,现在堆栈跟踪又重新换行了!

1 个答案:

答案 0 :(得分:0)

要回答我自己的问题,在log4j2中会出现堆栈跟踪的默认打印,其中包含2015年1月创建的错误报告: https://issues.apache.org/jira/browse/LOG4J2-939

它没什么大不了的。

幸运的是,解决方案很简单,只需在模式中包含异常,并且打印机会以正确的方式处理换行符来覆盖默认打印。