2012-08-08 38 views
5

我想將日誌記錄組件添加到分佈式系統。它被寫入AspectJ以避免鏈接當前的源代碼。我使用套接字appender發送日誌,但我想嘗試一些更有效的方法。哪些Appender應該用於分佈式系統?如何配置它們?

我聽說我應該使用JMSAppenderAsyncAppender,但我沒有配置它。我應該創建Receiver哪些收集日誌並將它們傳遞到數據庫和GUI(我使用ChainSaw)?

我試圖按照turorial1tutorial2,但他們不夠清楚。

enter image description here

編輯:

在一個小的演示我準備我送6個日誌的請求(3個分量的模擬)

[2012-08-08 15:40:28,957] [request1344433228957] [Component_A] [start] 
[2012-08-08 15:40:32,050] [request1344433228957] [Component_B] [start] 
[2012-08-08 15:40:32,113] [request1344433228957] [Component_C] [start] 
[2012-08-08 15:40:32,113] [request1344433228957] [Component_C] [end - throwing] 
[2012-08-08 15:40:32,144] [request1344433228957] [Component_B] [end] 
[2012-08-08 15:40:32,175] [request1344433228957] [Component_A] [end] 

使用插座追加程序。所以我的log4j.properties是:

log4j.rootLogger=DEBUG, server 

log4j.appender.server=org.apache.log4j.net.SocketAppender 
log4j.appender.server.Port=4712 
log4j.appender.server.RemoteHost=localhost 
log4j.appender.server.ReconnectionDelay=1000 

所以我跑

>java -classpath log4j-1.2.17.jar org.apache.log4j.net.SimpleSocketServer 4712 log4j-server.properties 

與配置

log4j.rootLogger=DEBUG, CA, FA 

# 
log4j.appender.CA=org.apache.log4j.ConsoleAppender 
log4j.appender.CA.layout=org.apache.log4j.PatternLayout 
log4j.appender.CA.layout.ConversionPattern=[%d] [%t] [%c] [%m]%n 

# 
log4j.appender.FA=org.apache.log4j.FileAppender 
log4j.appender.FA.File=report.log 
log4j.appender.FA.layout=org.apache.log4j.PatternLayout 
log4j.appender.FA.layout.ConversionPattern=[%d] [%t] [%c] [%m]%n 

然後,我把我的日誌從文件到電鋸:

enter image description here

這是絕對基本的,但我想學習如何更好地做到這一點。首先,我想異步發送日誌。然後創建非常簡單的Receiver,例如可以將日誌傳遞給文件。

我試圖按照上面列出的教程,但我失敗了。所以問題是:你能否提供一些配置示例? Receiver.javalog4.properties文件的示例?

回答

2

最後我找到了如何配置它。我把2個文件放到src文件夾中。

jndi.properties

topic.logTopic=logTopic 

和log4j-jms.properties

log4j.rootLogger=INFO, stdout, jms 

## Be sure that ActiveMQ messages are not logged to 'jms' appender 
log4j.logger.org.apache.activemq=INFO, stdout 

log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 
log4j.appender.stdout.layout.ConversionPattern= 

## Configure 'jms' appender. You'll also need jndi.properties file in order to make it work 
log4j.appender.jms=org.apache.log4j.net.JMSAppender 
log4j.appender.jms.InitialContextFactoryName=org.apache.activemq.jndi.ActiveMQInitialContextFactory 
log4j.appender.jms.ProviderURL=tcp://localhost:61616 
log4j.appender.jms.TopicBindingName=logTopic 
log4j.appender.jms.TopicConnectionFactoryBindingName=ConnectionFactory 

然後我跑我的程序與VM參數

-Dlog4j.configuration=log4j-jms.properties 

,並在課堂上接收日誌Receiver.java

public class Receiver implements MessageListener { 

    PrintWriter pw = new PrintWriter("result.log"); 
    Connection conn; 
    Session sess; 
    MessageConsumer consumer; 

    public Receiver() throws Exception { 


     ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616"); 
     Connection conn = factory.createConnection(); 
     Session sess = conn.createSession(false, Session.AUTO_ACKNOWLEDGE); 
     conn.start(); 
     MessageConsumer consumer = sess.createConsumer(sess.createTopic("logTopic")); 
     consumer.setMessageListener(this); 
    } 

    public static void main(String[] args) throws Exception { 
     new Receiver(); 

    } 

    public void onMessage(Message message) { 
     try { 
      LoggingEvent event = (LoggingEvent) ((ActiveMQObjectMessage) message).getObject(); 

      DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss,SSS"); 
      String nowAsString = df.format(new Date(event.getTimeStamp())); 

      pw.println("["+ nowAsString + "]" + 
        " [" + event.getThreadName()+"]" + 
        " ["+ event.getLoggerName() + "]" + 
        " ["+ event.getMessage()+"]"); 
      pw.flush(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 
2

我會使用NFS或CDFS並在所有機器上安裝一個驅動器。讓每個應用程序實例寫入不同的文件。無論您使用多少臺機器,您都可以在一個目錄(或驅動器)中找到所有日誌。

我不會在高延遲的全球廣域網上使用NFS或CDFS。 > 50 ms往返。在這個原因,我已經使用JMS(但我沒有使用log4j)

+0

我需要根據請求類型將日誌分割爲不同的文件,而不是機器名稱。可能嗎? – alicjasalamon 2012-08-08 11:26:53

+0

你是否需要近乎實時地做到這一點,或者是否可以在夜間進行處理?每個請求的文件可能非常低效。如果你對時間敏感,我不會以任何方式使用log4j。 ;) – 2012-08-08 11:33:56

+0

我的想法是:消息由JMS appender異步發送到'Receiver'。 Receiver在50組中選擇最長的請求或一個請求,然後將它們傳遞給ChainSaw和數據庫。在這種情況下我應該使用log4j嗎?我正在尋找** easy **解決方案 – alicjasalamon 2012-08-08 11:43:25

2

我的兩分錢..無論你做什麼,請確保你使用異步機制來傳遞你的日誌到接收器,否則它最終會拖延你的應用。另一點,爲了可靠地交付日誌,您應該考慮appender自身內置的故障轉移機制 - 如果您關心日誌,接收方可能會短時間或長時間脫機,但絕對需要故障轉移。我們已經建立了similar system你描述(抱歉添加),但如果你喜歡你可以使用我們的appender(在downloads),它是免費的,並有來源。還有一個視頻教程。它具有故障轉移和靈活的異步機制以及備份回退功能。

你應該使用多少個appender?每個jvm有一個appender會做好。配置文件應該是每個jvm,不知道你打算如何實現接收器,在任何情況下appender都需要找到通常是主機端口對的接收器。關於數據庫,我的經驗對RDBMS非常不利(我們正在轉向nosql),但如果不超過一億條記錄,大多數商業數據庫都會付出一些努力。不是一個簡單的任務,我必須說,花了我們幾年來建立商業質量體系,你只是畫了幾個瘦小的矩形:)

+0

這並不簡單,當然:)絕對不適合二年級學生。 LogFaces看起來很棒,我會從中受到啓發,毫無疑問。您的建議非常「高級」,因此我會在一分鐘內編輯我的問題以提供更多詳細信息。我對所有使用的技術都很陌生,肯定需要支持。 – alicjasalamon 2012-08-09 11:43:36

2

我推薦syslog和內置的syslog appender。使用TCP進行可靠的日誌記錄(可能是+ Asyc appender),或者使用UDP進行隨即忘記日誌記錄。 如果需要,我有一個rsyslog配置。

+0

使用系統日誌appender的負面影響是您失去了log4j附帶的許多結構化信息。如果起點不是log4j,肯定會是一個不錯的選擇。 – 2015-12-24 19:27:53

+0

同意,現在,3.5年後,我們不再使用系統日誌。 (logback + logentries appender)。 – Jan 2015-12-27 00:01:39