2017-09-18 100 views
0

我想將系統日誌與用戶日誌分開。系統日誌是開發人員和維護人員所關注的內容。用戶日誌爲用戶提供系統信息,而無需所有技術細節。我想將不同的日誌消息存儲在不同的文件中,一個用於技術人員,另一個用於用戶。配置多個log4j2記錄器

我看了很多選項,包括自定義級別和過濾器。我可以在過濾器可以用來識別用戶消息的消息開頭添加一個關鍵字。我正在試驗爲使用標準錯誤級別的用戶消息添加一個單獨的記錄器。

我寫了一個簡單的演示程序進行測試。它創建2個記錄器,然後生成一些錯誤消息。

package demo; 
import java.io.IOException; 
import org.apache.logging.log4j.Level; 
import org.apache.logging.log4j.LogManager; 
import org.apache.logging.log4j.Logger; 

public class Logdemo { 
private final static Logger logger = LogManager.getLogger(); 
private final static Logger userLog = LogManager.getLogger("demo.userMsg"); 

public static void main(String[] args) throws IOException { 
    try { 
     ((Object) null).toString(); 
    } catch (Exception e) { 
     logger.error("error message", e); 
    } 
    try { 
     ((Object) null).toString(); 
    } catch (Exception e) { 
     logger.fatal("User level Red message" ,e); 
    } 
    try { 
     ((Object) null).toString(); 
    } catch (Exception e) { 
     userLog.error("User level Amber message" ,e); 
    } 
    logger.info("Errors Logged"); 
    userLog.info("Lunch is served."); 
    } 
} 

在config文件中我有:

<Loggers> 
     <Root level="all"> 
      <AppenderRef ref="RollingFile" level="ALL"/> 
      <AppenderRef ref="Console" level="ALL"/> 
     </Root> 
     <userMsg name="demo.userMsg" level = "all"> 
      <AppenderRef ref="UserMsgFile" level="ALL"/> 
     </userMsg> 
    </Loggers> 
</Configuration> 

由此我得到的NetBeans以下錯誤消息:

run: 
2017-09-18 22:20:13,933 main ERROR Error processing element UserMsgFile [Appenders: null]): CLASS_NOT_FOUND 
2017-09-18 22:20:13,936 main ERROR Error processing element userMsg ([Loggers: null]): CLASS_NOT_FOUND 
22:20:14.038 [main] INFO demo.Logdemo - logger starting... 
22:20:14.040 [main] ERROR demo.Logdemo - error message 

所有的異常信息都寫入到控制檯,包括用於userLog的消息。所以我知道兩個記錄器都在工作。記錄器appender寫入文件確定。 userLog記錄器沒有創建任何文件,它使用幾乎相同的appender。

看來我還沒有正確地命名一些東西來讓log4j2找到記錄器。我嘗試過不同的命名組合,以便正確使用它,但我無法弄清楚問題所在。

我還沒有做的另一件事是在不同的類中使用userLog記錄器。我不需要知道用戶日誌消息是由哪個類生成的,所以我想在所有類中使用相同的記錄器名稱,而不使用類標識符。我懷疑我不能那樣做。

所以我的問題是: 我在配置文件中犯了什麼錯誤?
編輯: 以下配置條目起作用。這給了兩個記錄器。有兩個問題。一個是記錄器的名稱是包名。另一個是我沒有正確使用Logger這個詞。

<Loggers> 
    <Logger name="demo" level="all"> <!-- name = package name --> 
     <AppenderRef ref="UserLogFile" level="ALL" /> 
    </Logger> 
    <Root level="all"> 
     <AppenderRef ref="Console" level="ALL"/> 
     <AppenderRef ref="SystemLogFile" level="ALL"/> 
    </Root> 
</Loggers> 

我需要在每個類的記錄器啓動中包含類名嗎?
編輯:我需要包括包名稱。這花了我一段時間才弄清楚。

我遇到的另一個問題是打開log4j2的調試消息。這是通過以下方式實現的:

<Configuration status="WARN"> <!-- to debug, set status="TRACE" --> 

回答

0

我改變了我的方法。我使用了添加記錄器的標記功能。將標記添加到日誌消息允許我使用不同的appender來處理用戶消息。 示例代碼如下所示:

import java.io.IOException; 
import org.apache.logging.log4j.LogManager; 
import org.apache.logging.log4j.Logger; 
import org.apache.logging.log4j.MarkerManager; 
import org.apache.logging.log4j.Marker; 

    public class Logdemo { 

    private final static Logger logger = LogManager.getLogger(); 
    static final Marker usrMkr = MarkerManager.getMarker("USR"); 

    public static void main(String[] args) throws IOException { 
     logger.info("logger starting..."); 

     try { 
      ((Object) null).toString(); 
     } catch (Exception e) { 
      logger.fatal(usrMkr,"User message"); 
     } 
     try { 
      ((Object) null).toString(); 
     } catch (Exception e) { 
      logger.debug("Debug error message" ,e); 
     } 
     logger.info("Errors Logged"); 
     } 
    } 

配置文件的相關部分看起來像:

 <RollingFile 
     name="UserLogFile" 
     fileName="${basePath}/UserMsg.log" 
     immediateFlush="false" 
     filePattern="logs/$${date:yyyy-MM}/user-%d{MM-dd-yyyy}-%i.log"> 
     <MarkerFilter marker="USR" onMatch="ACCEPT" onMismatch="DENY"/> 
    </RollingFile> 
</Appenders> 

<Loggers> 
    <Logger name="demo" level="all"> 
     <AppenderRef ref="UserLogFile" level="ALL"/> 
    </Logger> 
    <Root level="all"> 
     <AppenderRef ref="Console" level="ALL"/> 
     <AppenderRef ref="RollingFile" level="ALL"/> 

    </Root> 

</Loggers> 

我創建了一個附加器與MarkerFilter命令添加的。 我將記錄器指向appender以將標記的消息轉移到單獨的文件中。 爲簡潔起見,我注意到了大量的xml文件。

+0

嗨,你的方法應該工作。我注意到你說過「給日誌消息添加一個標記允許我使用不同的appender來處理用戶消息」,但是可以在沒有標記的情況下執行此操作。我認爲你的標記是正確的,因爲如果你沒有使用標記,你將不得不創建多個記錄器,我發現它的可讀性較差。 –

+0

另一件事 - 如果你有你的「演示」記錄器的唯一原因是分配「UserLogFile」appender,那麼你真的不需要這個記錄器。由於你的appender有一個MarkerFilter,你可以將它分配給根記錄器,它應該以同樣的方式工作。 –

+0

Hi#D.B在爬上記錄器學習曲線(還有很長的一段路要走)之後,我寫的代碼完成了這項工作。我可以看到演示記錄器不是必需的,但我認爲在那裏忘記我所做的事情會讓我在幾年後更容易閱讀代碼。 – dazz