2011-07-02 65 views
8

我目前正在開發很快(功能明智)的其他Web服務,我想捕獲日誌真的很好,所以我可以很好地瞭解發生了什麼。現在我使用log4j來進行記錄,使用此附加設置:爲日誌記錄修改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或任何它,並在一些類中使用它並不是所有,即我想h AVE在幾個我的日誌中這樣的:

    • Payload: some request parameters
    • Response: some response that my service returns
    • extra data : some extra data

而不必這些INFO [STDOUT] INFO my.package.MyClass in front of it

UPDATE

我忘記提到我正在使用Jboss 5.我認爲jboss可能會將10:44:55,893 INFO [STDOUT]添加到我放入log4j配置中的任何格式。

BOUNTY UPDATE

我改變了這個:

<!-- ============================== --> 
    <!-- 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] 

前綴

+0

不是JBoss,而是%d {ABSOLUTE}給你10:44:55,893消息 – Dima

+0

你能澄清一下 - 設置自定義轉換模式有什麼難處? – GargantuChet

回答

7

問題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",否則根記錄器的appender 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); 
+0

即使我使用所有建議,我仍然無法擺脫在我的appender中更改的任何內容的煩人「13:13:43,428 INFO [STDOUT]」,您的設置可以正常工作,但只有在此之後部分.. –

1

嘗試使用此模式,因爲它會給你乾淨消息:

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

這是一個好主意,一些獨特的價值添加到MDC當請求到來時,再加入%X {} uniqueValueKey你的格局。它將允許您跟蹤此獨特請求的日誌。

4

INFO [STDOUT]通常來自log4j,也會偵聽System.out。我們有一個類似的情況,應用程序本身有自己的log4j配置,因此有自己的根appender。這會記錄到JBoss log4j監聽的控制檯。這又增加了INFO [STDOUT],就好像您直接寫入System.out(或在寫入System.err時寫入ERROR [STDERR])。

我們的解決方案是刪除特定於應用程序的log4j配置,並使用JBoss寫入的配置。

另一種方式可能是直接寫入特定於應用程序的日誌文件,而不是寫入控制檯。在服務器環境中,您最有可能參考日誌文件。

至於第二部分,即自動延伸日誌與響應,請求等數據:

在一種情況下,我們有一個超類所提供記錄功能和具有每一個(重寫)記錄器無狀態會話bean實例。基本方法如info然後會調用記錄器並自動添加所需的數據。

第二種方法可能是MCD,即您將一些數據(如請求)放入線程本地MDC(基本上是一個映射),然後在您的模式定義中訪問它們。

例如,我們有幾個類似的應用程序,每個應用程序都有一些其他類別的應用程序。因此,我們需要的消息源自哪個應用程序,從而增加了應用程序的名稱爲MDC:

在代碼:
MDC.put("app.name", "myapplication");

在log4j的模式配置:
<param name="ConversionPattern" value="%d %-5p [%c (%X{app.name})] %m%n"/>(注意% X {} app.name

我沒有測試是否可以不喜歡把請求到MDC,然後使用:%X{request.getAttribute('xyz')}但如果它只是得到的MDC的價值和它調用toString(),你可能會創建一個請求包裝是這樣的:

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", new RequestLogWrapper(request));並且在配置使用%X{request}

0

只能打印郵件,下面的轉換模式會做。

<param name="ConversionPattern" value="%m%n"/> 

根據您的要求,您可以設置爲任何你想

  1. %-5p指日誌條目類型的轉換模式。這將在 日誌文件中顯示爲INFO,DEBUG,ERROR等。從技術上講,%p將足以包含此說明; 將包含此說明; -5在那裏包含 一個5個字符寬的列。
  2. %d是指日期。
  3. %t到引發此日誌條目的線程的名稱。
  4. %c列出生成此日誌的類別,通常是 類名稱。
  5. %m顯示消息
  6. %n添加回車符。

您是否只將所有相關信息放入消息中?我不確定,但它不是一個好主意。

1

如果您不喜歡log4j xml配置文件,則可以改爲使用屬性文件。你不能使用簡單的屬性文件來配置過濾器,但由於看起來你不需要它們,所以這不應該成爲問題。

既然你

...目前正在開發即將大(功能方面)REST Web服務,我想捕捉的日誌真的很好,所以我能有什麼是一個很好的洞察力去哪裏。

那麼我恐怕你所希望的輸出結果根本不會給你很多見解,它不會很好地擴展,一旦應用程序變得像預期的那樣大,它會讓你放鬆心情。

請參閱Log4j Best Practices,以便日誌設計的參考。請看全部其中的段落,包括在最後的美容考慮。希望這可以幫助。