2010-09-03 37 views
2

我正在使用log4j來記錄我的應用程序發送的請求/響應XML。log4j和XML內容

問題是xml內容正在用換行符記錄。 任何有關如何格式化的建議,以保持xml結構,因爲它是接收?

以下是我的appender:

<appender name="xmlFileAppender" class="org.apache.log4j.RollingFileAppender"> 
    <param name="File" value="d:/LOG/log4j/appName_${weblogic.Name}_XMLS.log" /> 
    <param name="Append" value="true" /> 
    <rollingPolicy class="org.apache.log4j.rolling.TimeBasedRollingPolicy"> 
     <param name="ActiveFileName" value="d:/LOG/log4j/appName_${weblogic.Name}_XMLS.log" /> 
     <param name="FileNamePattern" value="d:/LOG/log4j/appName_${weblogic.Name}_XMLS.%d.log.gz" /> 
    </rollingPolicy> 
    <layout class="org.apache.log4j.PatternLayout"> 
    <param name="ConversionPattern" value="[%d{DATE}][%-p][%c{3}%x][%m]%n"/> 
    </layout> 
</appender> 

回答

0

您的轉換模式追加一個換行符。嘗試改變這一點:

<param name="ConversionPattern" value="[%d{DATE}][%-p][%c{3}%x][%m]%n"/> 

要這樣:

<param name="ConversionPattern" value="[%d{DATE}][%-p][%c{3}%x][%m]"/> 

,因爲它聽起來像移除%n會做你的需要。當然,請注意,任何日誌語句需要換行,並使用該附加器,就需要添加它明確,如:log.debug(msg + "\n");可以製成通用的,如果必要的話:

final String newLine = System.getProperty("line.separator"); 
... 
log.debug(msg + newLine); 

我希望幫助,

-gMale

+0

對不起,我想我的問題還不夠清楚。我想刪除出現在日誌消息本身內的新行。你建議修改轉換模式會導致日誌創建爲一行(不是我想要的)。 – 2010-09-20 11:02:15

+1

好的。我還不清楚你在問什麼。聽起來好像,您可以在進行日誌記錄調用時刪除換行符,也可以在內部覆蓋記錄器並刪除換行符。實現第一個選項的最簡單方法是使用一個Aspect,在進行日誌調用時交叉切割代碼。在那裏,沿着'logMessage.replaceAll(「\\ n」,「」);'的代碼會去掉換行符。問題在於,您想在哪裏放置該代碼:在一個方面,在Log4JLogger的子類中,或者在代碼中進行日誌調用的任何地方? – gMale 2010-09-20 13:38:36

0

gmale是正確的說,省略換行字符必須的代碼存在地方

但是,您必須小心;你只想從刪除某些記錄對象的換行符,而不是所有這些對象(從系統中的所有日誌調用中統一過濾掉換行符都有點矯枉過正,我認爲它是一個障礙)。

要做到這一點,你有兩個選擇:

  1. 手動調用傳遞到的log4j,使用gmale的例子之前清除從XML字符串換行符的方法(但是我會用System.getProperty("line.separator")或更換\n,如果您使用Commons LangSystemUtils.LINE_SEPARATOR)。
  2. 用自定義對象包裝您的XML字符串,並配置Log4J以添加ObjectRenderer,這會將您的自定義對象呈現爲字符串。

任何的這兩種方式會導致新行從您想要的內容完全相同的類型被刪除,而不是集體所有登錄這個星球上。