Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 修改日志记录附加的log4j的最佳方法_Java_Log4j_Jboss5.x - Fatal编程技术网

Java 修改日志记录附加的log4j的最佳方法

Java 修改日志记录附加的log4j的最佳方法,java,log4j,jboss5.x,Java,Log4j,Jboss5.x,我目前正在开发即将成为大型(功能方面的)RESTWeb服务,我希望能够很好地捕获日志,以便能够很好地了解正在发生的事情。现在,我使用log4j进行日志记录,使用以下附加设置: <!-- Appenders --> <appender name="console" class="org.apache.log4j.ConsoleAppender"> <param name="Target" value="System.out" /> <lay

我目前正在开发即将成为大型(功能方面的)RESTWeb服务,我希望能够很好地捕获日志,以便能够很好地了解正在发生的事情。现在,我使用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 : my.package.MyClass - I'm class message
    
  • 我可以制作一个特殊的appender或其他什么东西,并在某些类中使用它,而不是在所有类中使用它,例如,我希望在我的一些日志中包含以下内容:

    • 有效负载:一些请求参数
    • Response:我的服务返回的一些响应
    • 额外数据:一些额外数据
  • 在前面没有这些
    INFO[STDOUT]INFO my.package.MyClass的情况下

    更新

    我忘了在问题中提到我正在使用JBoss5。我认为jboss可能会将
    10:44:55893 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>
    
    不烦人

    10:44:55,893 INFO  [STDOUT]
    

    前缀问题1:

    为附加器使用以下图案布局:

    <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p: %c - %m%n" />
    
    调用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);
    

    尝试使用此模式,因为它将为您提供清晰的信息:

     <param name="ConversionPattern" value="%d{HH:mm:ss.SSS} %-5p %c %X %m/>
    

    信息[STDOUT]
    通常也来自log4j监听System.out。我们有一个类似的例子,应用程序本身有自己的log4j配置,因此有自己的根appender。这将记录到控制台,由JBoss log4j监听。这反过来会添加
    信息[STDOUT]
    ,就像您直接向
    System.out
    (或
    ERROR[STDERR]
    写入
    System.err
    )一样

    我们的解决方案是删除特定于应用程序的log4j配置,只使用JBoss写入的配置

    另一种方法可能是直接写入特定于应用程序的日志文件,而不是写入控制台。在服务器环境中,您最有可能引用日志文件

    对于第二部分,即自动扩展带有响应、请求等数据的日志:

    在一个例子中,我们有一个用于无状态会话bean的超类,该类提供了日志记录功能,并且每个实例都有一个(可覆盖的)记录器。然后,
    info
    等基本方法将调用记录器并自动添加所需的数据

    第二种方法可以是
    MCD
    ,即将一些数据(如请求)放入线程本地MDC(基本上是一个映射),然后在模式定义中访问它们

    例如,我们有几个类似的应用程序,每个应用程序都有一些类,而其他应用程序也有一些类。因此,我们需要消息来自哪个应用程序,从而将应用程序名称添加到MDC:

    在代码中:
    MDC.put(“app.name”、“myapplication”)

    在log4j模式配置中:
    (注意%X{app.name})

    我没有测试您是否可以将请求放入MDC,然后使用:
    %X{request.getAttribute('xyz')}
    ,但是如果它只获取MDC中的值并对其调用
    toString()
    ,您可以创建如下请求包装器:

    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");
        }
    }
    
    class RequestLogWrapper {
      private HttpServletRequest request; //initialize through constructor etc.
    
      public String toString() {
        return request.getAttribute("xyz") + ";" + request.getAttribute("abc") + ... //handle null etc. as well
      }
    }
    

    然后调用
    MDC.put(“request”,新的RequestLogWrapper(request))%X{request}

    仅打印消息,以下转换模式即可

    <param name="ConversionPattern" value="%m%n"/>
    
    
    
    根据您的需求,您可以将转换模式设置为您想要的任何模式

  • %-5p表示日志条目的类型。这将出现在 将文件记录为信息、调试、错误等。从技术上讲,%p就足够了 包括本说明;在-5中包含这个词 5个字符宽的列
  • %d指日期
  • %t指向引发此日志项的线程的名称
  • %c列出生成此日志的类别,通常是 类名
  • %m显示消息
  • %n添加回车符

  • 您是否只将所有相关信息放在消息中?我不确定,但这不是一个好主意。

    如果您不喜欢log4jxml配置文件,可以切换到属性文件。您不能使用简单属性文件配置过滤器,但因为您似乎不需要它们,所以这不应该是一个问题

    既然你是

    …目前正在开发即将成为大型(功能方面的)rest web服务,我希望能够很好地捕获日志,以便能够很好地了解正在发生的事情

    那么,我担心您所期望的输出根本不会给您提供很多见解,它不会很好地扩展,而且一旦应用程序如预期的那样变大,它会让您失去理智


    有关日志设计的良好参考,请参阅。请看所有的段落,包括最后的修饰性考虑。希望这能有所帮助。

    即使我使用了你建议的所有内容,我仍然无法摆脱这个恼人的“13:13:43428信息[STDOUT]”在我在appender中更改的任何内容之前,你的设置仍然有效,但只有在这一部分之后。不是JBoss而是%d{ABSOLUTE}给你10:44:55893的消息你能澄清一下设置自定义转换模式有什么不好吗?
    DOMConfigurator.configureAndWatch("log4j.xml", 60 * 1000);
    
     <param name="ConversionPattern" value="%d{HH:mm:ss.SSS} %-5p %c %X %m/>
    
    class RequestLogWrapper {
      private HttpServletRequest request; //initialize through constructor etc.
    
      public String toString() {
        return request.getAttribute("xyz") + ";" + request.getAttribute("abc") + ... //handle null etc. as well
      }
    }
    
    <param name="ConversionPattern" value="%m%n"/>