2013-05-03 57 views
0

考慮以下代碼:最佳實踐在多線程環境中調用

if (param1 == null || param2 == null) { 
    logger.error("Failed to do stuff."); 
    logger.debug("param1: " + param1); 
    logger.debug("param2: " + param2); 
} 

這是非常具有可讀性,但在多線程環境中的原子邏輯日誌消息可以分爲三個部分。

現在,解決方案的一部分是簡單,可讀性不會受太大的影響:

if (param1 == null || param2 == null) { 
    logger.error("Failed to do stuff."); 
    logger.debug(
    "param1: " + param1 + System.getProperty("line.separator") 
    + "param2: " + param2 
); 
} 

如果稍微改變記錄儀輸出是OK,你可以寫:

if (param1 == null || param2 == null) { 
    String message = "Failed to do stuff."; 

    if (logger.isDebugEnabled()) { 
    message += System.getProperty("line.separator") 
     + "param1: " + param1 + System.getProperty("line.separator") 
     + "param2: " + param2; 
    } 

    logger.error(message); 
} 

清理日誌,但醜陋的代碼...

或者,你可以寫:

if (param1 == null || param2 == null) { 
    synchronized (logger) { 
    logger.error("Failed to do stuff."); 
    logger.debug("param1: " + param1); 
    logger.debug("param2: " + param2); 
    } 
} 

你有什麼建議?爲什麼?

+0

您正在使用哪個日誌記錄庫? – fglez 2013-05-03 12:45:37

回答

0

設計一個「LogEntry」類,它可以保存日誌文本 - 附加條目等

添加記錄器實例調用:

1)在一個線程安全的方式返回一個「LogEntry」類的實例,例如。 'LogEntry * GetLogEntry();'。

2)以線程安全的方式提交'LogEntry'類實例,例如。 'void SubmitLogEntry(LogEntry * thisLog);

SubmitLogEntry()應該將傳遞的LogEntry *排隊到記錄器線程 - 執行實際日誌寫入的一個線程。

1

配置記錄子系統,以確定其輸出記錄線程

timestamp process.thread_id severity Lorem ipsum dolor sit amet 
        ^^^^^^^^^ 

現在很容易將線穿入日誌在一起。