gpt4 book ai didi

java - 修改为日志记录附加的 log4j 的最佳方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:39:18 25 4
gpt4 key购买 nike

我目前正在开发一个大型(功能明智的)rest web 服务,我想很好地捕获日志,这样我就可以很好地了解发生了什么。现在我使用 log4j 进行日志记录,使用这个附加设置:

<!-- Appenders -->
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<param name="Target" value="System.out" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p: %c - %m%n" />
</layout>
</appender>

产生这些类型的日志:

10:44:55,893 INFO  [STDOUT] INFO : my.package.MyClass - I'm class message
  1. 我怎样才能使这条消息看起来像

    10:44:55,893 INFO : my.package.MyClass - I'm class message
  2. 我可以制作一个特殊的 appender 或其他任何东西,并在某些类而不是所有类中使用它吗,即我想在我的一些日志中使用这个:

    • Payload:一些请求参数
    • 响应:我的服务返回的一些响应
    • extra data : 一些额外的数据

没有这些 INFO [STDOUT] INFO my.package.MyClass 在它前面

更新

我忘了在问题中提到我正在使用 Jboss 5。我认为 jboss 可能会将 10:44:55,893 INFO [STDOUT] 添加到我放入我的任何格式中log4j 配置。

赏金更新

我改变了这个:

<!-- ============================== -->
<!-- Append messages to the console -->
<!-- ============================== -->

<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
<errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"/>
<param name="Target" value="System.out"/>
<param name="Threshold" value="INFO"/>

<layout class="org.apache.log4j.PatternLayout">
<!-- The default pattern: Date Priority [Category] Message\n -->
<param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c{1}] %m%n"/>
</layout>
</appender>

为此:

<!-- ============================== -->
<!-- Append messages to the console -->
<!-- ============================== -->

<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
<errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"/>
<param name="Target" value="System.out"/>
<param name="Threshold" value="INFO"/>

<layout class="org.apache.log4j.PatternLayout">
<!-- The default pattern: Date Priority [Category] Message\n -->
<param name="ConversionPattern" value="%m%n"/>
</layout>
</appender>

它奏效了,但这样做似乎有点丑陋。还有别的办法吗?我正在使用 spring MVC/JBoss 组合。

我现在收到漂亮干净的消息:

10:44:55,893 INFO : my.package.MyClass - I'm class message

不烦人

10:44:55,893 INFO  [STDOUT]

前缀

最佳答案

问题 1:

为您的 appender 使用以下模式布局:

<param name="ConversionPattern" value="%d{ABSOLUTE} %-5p: %c - %m%n" />

您声明的配置文件中的转换模式不会产生您声明的那种日志。例如,日期/时间未包含在您的转换模式中。


问题 2:

您可以使用一个特殊的记录器,它使用另一个仅记录纯消息的附加程序。

例如,您的配置如下所示:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

<appender name="consoleAppender" class="org.apache.log4j.ConsoleAppender">
<param name="Target" value="System.out" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%m%n" />
</layout>
</appender>

<appender name="consoleAppender2" class="org.apache.log4j.ConsoleAppender">
<param name="Target" value="System.out" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{ABSOLUTE} %-5p: %c - %m%n" />
</layout>
</appender>

<logger name="specialLogger" additivity="false">
<level value="INFO" />
<appender-ref ref="consoleAppender" />
</logger>

<root>
<priority value="INFO" />
<appender-ref ref="consoleAppender2" />
</root>

</log4j:configuration>

您将 specialLogger 用于没有附加信息的纯消息。它可以在多个类中使用。

在 specialLogger 的配置中,additivity = "false" 是必需的,否则根记录器的附加程序 consoleAppender2 也会记录相同的消息。 (在这种情况下,消息将被记录两次。)

例如,您的代码可能如下所示:

public class TestClassA
{
private static Logger specialLogger = Logger.getLogger("specialLogger");
private static Logger logger = Logger.getLogger(TestClassA.class);

public TestClassA() {

}

public void doSomething() {
logger.info("Some message from TestClassA");
specialLogger.info("Some message via the specialLogger from TestClassA");
}
}

调用 doSomething 结果:

17:17:18,125 INFO : com.foo.TestClassA - Some message from TestClassA
Some message via the specialLogger from TestClassA

在你的主类中的某个地方,你需要像往常一样配置 log4j,例如:

DOMConfigurator.configureAndWatch("log4j.xml", 60 * 1000);

关于java - 修改为日志记录附加的 log4j 的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6558597/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com