14

system.out / errに多くのステートメントを書き込むレガシーコード(または、制御できないが使用する必要のあるコード)があります。

同時に、log4jにラップされたカスタムロギングシステムを使用するフレームワークを使用しています(残念ながら、これは制御できません)。

そのため、ログシステムを使用するカスタムPrintStreamにoutおよびerrストリームをリダイレクトしようとしています。System.setLog()とメソッドについて読んでいましたSystem.setErr()が、問題は、使用中のロギングシステムをラップする独自のPrintStreamクラスを作成する必要があることです。それは大きな頭痛の種になるでしょう。

これを達成する簡単な方法はありますか?

4

4 に答える 4

6

使用しているカスタムロギングシステムをラップアラウンドする必要はありません。アプリケーションが初期化されたら、LoggingOutputStreamを作成し、そのストリームをSystem.setOut()メソッドとSystem.setErr()メソッドに、それぞれに必要なログレベルで設定します。その時点から、アプリケーションで検出されたSystem.outステートメントはすべてログに直接移動する必要があります。

于 2013-02-05T20:18:14.600 に答える
6

PrintStreamが提供するコンストラクターを見てください。ロギング フレームワーク OutputStream を直接 PrintStream に渡し、System.out と System.err を設定して PrintStream を使用することができます。

編集:これは簡単なテストケースです:

public class StreamTest
{
    public static class MyOutputStream extends FilterOutputStream
    {
        public MyOutputStream(OutputStream out)
        {
            super(out);
        }

        @Override
        public void write(byte[] b, int off, int len) throws IOException
        {
            byte[] text = "MyOutputStream called: ".getBytes();         
            super.write(text, 0, text.length);
            super.write(b, off, len);
        }
    }

    @Test   
    public void test()
    {       
        //Any OutputStream-implementation will do for PrintStream, probably
        //you'll want to use the one from the logging framework
        PrintStream outStream = new PrintStream(new MyOutputStream(System.out), true);  //Direct to MyOutputStream, autoflush
        System.setOut(outStream); 

        System.out.println("");
        System.out.print("TEST");
        System.out.println("Another test");
    }
}

出力は次のとおりです。

MyOutputStream called: 
MyOutputStream called: TESTMyOutputStream called: Another testMyOutputStream called: 

2 行目には「空」の呼び出しがあります ( MyOutputStream が呼び出されます: -output の後に何もありません)。これは、println がまず Another テスト文字列を write-method に渡し、次に改行を付けて再度呼び出すためです。

于 2013-02-05T20:21:55.267 に答える
3

独自のOutputStreamを作成し、それを標準のPrintStreamにラップするだけです。OutputStreamには、実装する必要のあるメソッドが1つだけあり、パフォーマンス上の理由からオーバーライドする価値のあるメソッドがもう1つあります。

唯一のトリックは、バイトのストリームを個別のログメッセージにスライスすることです(たとえば、'\ n')が、これも実装するのはそれほど難しくありません。

于 2013-02-05T20:17:55.103 に答える