0

ログメッセージをサードパーティサービスに非同期で送信する責任があるカスタムLog4Jアペンダーを作成しました

したがって、これはミリ秒ごとに呼び出されることが期待されます

これは私のカスタムアペンダーコードです

このコードでFindbugsを実行しましたが、異常は報告されませんでした。

しかし、このコードを本番環境にリリースする前に、このコードに問題があるかどうかを知るにはどうすればよいでしょうか。

この目的のためのツールはありますか?

これについてあなたのアイデアを共有してください。よろしくお願いします。

package com;

import java.util.ArrayList;
import java.util.Iterator;

import org.apache.log4j.AppenderSkeleton;
import org.apache.log4j.spi.LoggingEvent;

public class MyAppender extends AppenderSkeleton {

    public MyAppender() {

    }

    public void append(LoggingEvent event) {
        ArrayList<LoggingEvent> buffer = new ArrayList<LoggingEvent>();
        buffer.add(event);
        flushBuffer(buffer);
    }

    public void flushBuffer(ArrayList<LoggingEvent> buffer) {
        for (Iterator<LoggingEvent> i = buffer.iterator(); i.hasNext();) {
            try {
                LoggingEvent logEvent = (LoggingEvent) i.next();
                String messageRecievied = (String) logEvent.getMessage();
                //System.out.println(messageRecievied);

            } catch (Exception e) {

            }

        }

    }

    @Override
    public void close() {

    }

    @Override
    public boolean requiresLayout() {

        return false;
    }

}
4

3 に答える 3

3

試して。

エッジケースを含め、ユースケースが何であるかを把握します。
単体テストを作成します。

コードを壊す可能性のある展開環境の変数を考えてください。
統合テストを作成して、これらのシナリオがすべて機能することを確認します。

偽のレシーバーを作成し、それに対してテストします。
レシーバーが適切に検証されていることを確認するには、レシーバーのテストを作成する必要があります。

于 2013-06-21T22:24:40.687 に答える
1

任意の入力で任意のコードの結果を予測できることは、NP 完全問題です。したがって、コードに問題がないことを保証する 100% 確実な方法はありません (少なくとも宇宙の熱死の前に)。したがって、あなたはリスク管理の領域にいます。

それで、あなたは何をしますか?

テスト 単体テストとシステム テストは、コードにバグがないことを確認するのに役立ちます。これを行うには、 JUnitなどを使用します。このようなスイートを使用すると、特定の入力を指定して、出力が有効であることを確認できます。ただし、これは提供された入力に対してのみテストされ、入力に対してはテストされないことに注意してください。したがって、非常に優れたテストスイートでさえ、誤った信頼を与える可能性があります. したがって、防御の第 2 ラインは...

メトリクス 測定していることを確認し、できる限りのことを可視化してください。新しいコードを本番環境に投入し、データベースへの書き込みが 10 倍に増加すると、問題が発生する可能性があります。または、エラー メッセージの速度が向上するか、ゼロに低下する可能性があります。主要なメトリックを監視していない限り、システムの正常性を確認することはできません。しかし、何かがうまくいかない場合はどうなりますか?

機能の制御 新しい機能を追加する複雑なシステムでは、それらの機能を制御することをお勧めしますこれは、古いコード パスと新しいパスを選択できるグローバル トグルと考えてください。例えば:

public void append(LoggingEvent event) {
    if (FeatureController.isActive(this.FEATURE_NAME)){
      ArrayList<LoggingEvent> buffer = new ArrayList<LoggingEvent>();
      buffer.add(event);
      flushBuffer(buffer);
    }
}

これにより、新しい機能が問題を引き起こしている場合に、それらをすばやく停止できます。

于 2013-06-21T22:42:22.100 に答える
0

そのようなツールは存在しません。そうでなければ、それは人工知能であり、あなたを必要とせずにコード全体を書くでしょう;-)

しかし、可能であればユニットテストを書いてください。優れた単体テストを使用すると、多くのタスクを展開でき、バグなしで初めて実行できます。(ツールは JUnit と呼ばれます)

2 番目のツール: EclEmma eclipse プラグイン: junit テスト カバレッジを表示します。カバー率は 80% 以上ですか? いいえ?(恥を知れ ;-))

apache log4j の src を見てください。いくつかの単体テストがあることを覚えています。おそらく、既存のアペンダー用のものもあります。

于 2013-06-21T22:33:35.763 に答える