当前位置: 首页 > 知识库问答 >
问题:

Log4j 2未注销%可抛出

曹旭
2023-03-14
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="throwable: %throwable"/>
        </Console>
    </Appenders>
    <Loggers>
        <Root level="error">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>
    <dependencies>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.13.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.13.3</version>
        </dependency>
    </dependencies>
public class Main {
    public static void main(String[] args) {
        Logger logger = LogManager.getLogger();
        try {
            new FileInputStream("asdf");
        } catch(Exception e) {
            logger.error(e);
        }
    }
}
throwable: 
throwable: java.io.FileNotFoundException: asdf (No such file or directory)
    at java.io.FileInputStream.open0(Native Method)
    at java.io.FileInputStream.open(FileInputStream.java:195)
    at java.io.FileInputStream.<init>(FileInputStream.java:138)
    at java.io.FileInputStream.<init>(FileInputStream.java:93)
    at Main.main(Main.java:10)

任何帮助都会很好!

编辑:我正在使用Java 8

共有1个答案

后学
2023-03-14

您正在使用logger.error(Object)。具有单个对象参数的所有日志记录方法只记录该对象的toString()值,即使该对象是可抛出的。在您的示例中,appender模式不包含%m/%msg/%message,因此您只能在控制台输出中看到“throwable:”。
如果将消息添加到模式中,则输出为:

throwable: java.io.FileNotFoundException: asdf (The system cannot find the file specified) 

在使用Log4j2时,这是一个非常常见的缺陷,不幸的是,这一点在将来似乎不会改变。

要正确记录异常及其堆栈跟踪,您可以使用带有单独的Throwable参数的日志记录方法之一,例如logger.error(String,Throwable),也可以使用logger.catch(Level,Throwable)。但是,应该首选带有message参数的日志记录方法,因为它们允许您描述上下文。否则,您可能很难找到日志消息的实际创建位置。

 类似资料:
  • 我尝试了几乎所有我能在StackOverflow和其他地方找到的东西来让它工作,但它仍然不工作。我使用的是Spring框架4.1.6。发布,Spring安全4.0.0。释放。我配置了命名空间注销标记,我能够使会话无效的唯一方法是通过在我的控制器中使用HttpSession.invalidate()调用以编程方式执行它。 当请求注销时,我会被重定向到相应的页面,但是会话不会失效,JSSessionI

  • 问题内容: 我正在考虑为我的应用程序使用OAuth2。我尝试实现的体系结构如下: 我将拥有自己的(仅此)授权服务器 一些资源应用程序使用授权服务器验证对资源的访问 某些客户端应用程序(网络,移动设备)会将用户重定向到授权服务器进行身份验证,如果成功,则会在资源应用程序上使用api。 到目前为止,我已经成功实现了3个基本应用程序(1个身份验证服务器,1个资源服务器和1个客户端)之间的交互。我无法正常

  • 问题内容: 是否可以检测PC何时注销。我需要开发一个应用程序,在PC注销之前,该应用程序将有关注销时间的文本文档写入文本。 问题答案: 对于.NET,请参见以下问题:[c#中是否有方法可以检测Windows关闭/注销并取消该操作(询问用户之后)http://codingdict.com/questions/159553)

  • 我在Spring Security上遇到了麻烦。我可以登录但不能注销(至少不是按预期)。 登录后,我将被重定向到/secure/home.xhtml 这里是迄今为止的代码: 索引.xhtm spring-security.xhtml, http conf 这是我试图在stackoverflow上实现有关其他答案的注销的方式: 但这两个链接都不起作用。我得到了404。我还读到你应该替换请求。带有pa

  • 我在ADFS上有saml。一切正常,但我有不止一个依赖方的信任。然后,当我登录到我的一个webapp(信赖方信任)并注销时,一切都很好。 但当我登录到第一个web应用程序,然后再登录到第二个web应用程序时,我可以在ADF上使用cookie:samleSession,它结合了两个会话,然后当我从第一个web应用程序注销时,我会重定向到第二个web应用程序上的注销页面,并且不会删除网站1上的cook