2012-08-08 25 views
5

分散システムにログコンポーネントを追加しようとしています。チェーンの現在のソースコードを避けるために、AspectJに書かれています。私はソケットアペンダーを使用してログを送信しますが、もっと効果的なものを試してみたいと思います。どのAppenderが分散システムで使用されるべきですか?それらを設定するには?

私はJMSAppenderAsyncAppenderを使うべきだと聞いたことがありますが、設定に失敗しました。ログを収集してデータベースとGUIに渡すReceiverを作成する必要がありますか(私はChainSawを使用します)?

私はturorial1tutorial2に従おうとしましたが、十分明確ではありません。

enter image description here

編集:私はソケットアペンダを使用して、要求(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] 

のための6つのログを送っ用意しました小さなデモで

。だから私の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 

ので、私はその後、私は、ファイルからチェーンソーに自分のログを送信する設定

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 

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

を実行します。

enter image description here

それは絶対に基本的ですが、私はそれをより良くする方法を学びたいと思います。まず第一に、ログを非同期で送信したいと思います。次に非常に単純なReceiverを作成します。ログをファイルに渡すことができます。

上記のチュートリアルに従おうとしましたが、失敗しました。ですから、あなたはいくつかの設定例を提供することができますか? Receiver.javalog4.propertiesファイルの例?

答えて

2

最後に私はそれを設定する方法を見つけました。私はsrcフォルダに2つのファイルを入れました。

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を使用し、すべてのマシンにドライブをマウントします。各アプリケーションインスタンスに別のファイルへの書き込みをさせます。何台のマシンを使用していても、1つのディレクトリ(またはドライブ)内のすべてのログを見つけることができます。

私はNFSやCDFSを、待ち時間の長いグローバルWAN上で使用しません。 >往復50ミリ秒。この理由で、私はJMSを使用しましたが(log4jは使用しませんでした)

+0

マシン名ではなく、要求の種類ごとにログを別のファイルに分割する必要があります。出来ますか? – alicjasalamon

+0

これはほぼリアルタイムで行う必要がありますか、または夜間に処理することはできますか?要求ごとのファイルは非常に非効率的です。時間に敏感な何かをしているなら、私はlog4jを使用しません。 ;) –

+0

私の考えは:メッセージはJMSアペンダーによって非同期に 'Receiver'に送られました。 「Receiver」は、長時間のリクエストまたは50グループのリクエストを1つ選択し、ChainSawおよびデータベースに渡します。私はこの状況でlog4jを使うべきではありませんか?私は**簡単な**解決策を探しています – alicjasalamon

2

私の2セント..あなたが何をしていても、ログを受信者に配信するために非同期メカニズムを使用することを忘れないでください。アプリ。別の点として、ログを確実に配信するには、アペンダー自体に組み込まれたフェールオーバーメカニズムを考慮する必要があります。レシーバーが短期間または長期間オフラインになる可能性があります。ログを気にするならば、確実にフェイルオーバーが必要です。 (申し訳ありませんが、追加のために)similar systemを作成しましたが、好きな場合はアペンダー(downloadsをご覧ください)を使用することができます。無料でソースもあります。ビデオチュートリアルもあります。フェイルオーバーと柔軟な非同期メカニズムとバックアップのフォールバックがあります。

いくつのアペンダーを使用しますか? 1人のappenderがjvmごとに大丈夫です。設定ファイルはおそらく1つのjvmでなければなりません。どのようにレシーバーを実装するつもりでもない場合、アペンダーは通常、少なくともホストポートのペアであるレシーバーを見つける必要があります。データベースに関しては、私の経験は非常に荒いです(私たちはnosqlに移行しています)。しかし、何億ものレコード数を上回らなければ、ほとんどの商用データベースはいくらかの努力を払っています。私が言わなければならない単純な仕事ではなく、ちょっとした矩形で描いた商用品質システムを構築するために何年もかかりました:)

+0

確かに、簡単ではありません:)間違いなく2年生には当てはまりません。 LogFacesは素晴らしく、私はそれに触発されるでしょう、疑いはありません。あなたのアドバイスは非常に「ハイレベル」なので、詳細を記入するために私の質問を1分で編集します。私は、私が使用するすべてのテクノロジーには新しいものですが、間違いなくサポートが必要です。 – alicjasalamon

2

syslogと組み込みのsyslogアペンダーをお勧めします。信頼できるロギング(+ Asyc appender多分)またはUDPをfire-and-forgetロギングに使用してください。 必要に応じて、私はrsyslog設定を持っています。

+0

syslog appenderを使用しないことは、log4jに付属する構造化された情報をたくさん失うことです。開始点がlog4jでない場合は、確かに良い選択肢になります。 –

+0

同意する、今、3.5年後、私たちはsyslogをもう使用しない。 (ログバック+ログappender)。 – Jan

関連する問題