5

現在、アプリケーションからのメッセージを.logファイルに記録する作業を行っています。これは今のところ正常に機能していますが、同じメッセージをテキストエリアに出力しようとしています。私はこれらすべてにデフォルトのロガーを使用しています。

これにより、.logファイルにログを記録し、管理者が表示できるように同じ出力をテキストエリアに書き込むすべての作業を実行する1つのクラスができます。

これは、テキストエリアのみを含むJava Swing JFrameアプリケーションです(必要なものはすべて)。バックグラウンドで多くのことが行われており、レビュー/デバッグのためにそのすべてのアクティビティをログに記録する必要があります。

私は良い例を見つけるのに苦労していたので、皆さんが私を助けてくれるかどうか疑問に思いました。

4

3 に答える 3

9

あなたの場合、JDKのデフォルトのロギングを使用しているので、独自に作成java.util.Handlerしてpublishメソッドを実装することもできます。ややこのように:

public class TextAreaHandler extends java.util.logging.Handler {

    private JTextArea textArea = new JTextArea(50, 50);

    @Override
    public void publish(final LogRecord record) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                StringWriter text = new StringWriter();
                PrintWriter out = new PrintWriter(text);
                out.println(textArea.getText());
                out.printf("[%s] [Thread-%d]: %s.%s -> %s", record.getLevel(),
                        record.getThreadID(), record.getSourceClassName(),
                        record.getSourceMethodName(), record.getMessage());
                textArea.setText(text.toString());
            }

        });
    }

    public JTextArea getTextArea() {
        return this.textArea;
    }

    //...
}

次に、Swingアプリケーションのハンドラーから次のようにテキスト領域を取得できます。

for(Handler handler: logger.getHandlers()){
    if(handler instanceof TextAreaHandler){
        TextAreaHandler textAreaHandler = (TextAreaHandler) handler;
        getContentPane().add(textAreaHandler.getTextArea());
    }
}

次に、logging.propertiesファイルに新しいハンドラーの構成が含まれていることを確認します。

hackers.logging.TestDrive.level=INFO
hackers.logging.TestDrive.handlers=hackers.logging.TextAreaHandler

また、この構成をデフォルトのlogging.propertiesファイル(JRE libフォルダーにある)に配置しない場合は、アプリケーションの起動時に、カスタマイズlogging.propertiesしたファイルへのパスをプロパティに指定してください。

java -Djava.util.logging.config.file=my-customized-logging.properties ...
于 2012-05-28T15:55:56.257 に答える
4

StreamHandlerから拡張するだけです-これがConsoleHandlerとFileHandlerの動作方法です。そして、publish関数をオーバーライドします。

public class TextAreaHandler extends StreamHandler {
    JTextArea textArea = null;

    public void setTextArea(JTextArea textArea) {
        this.textArea = textArea;
    }

    @Override
    public void publish(LogRecord record) {
        super.publish(record);
        flush();

        if (textArea != null) {
            textArea.appendText(getFormatter().format(record));
        }
    }
}

メッセージをログに記録する前に、最初に出力場所を設定します。次に例を示します。

public TextAreaHandler textAreaHandler = new TextAreaHandler();
textAreaHandler.setTextArea(<your JTextArea control>);
于 2015-02-11T06:56:53.857 に答える
2

モノリットアプリケーションの場合は、textarealog4j custom appenderのコンテンツの更新を呼び出し、そこに新しい行を追加するように記述できます。
2つの独立したアプリケーション(1つはログを生成し、もう1つはログを表示する)がある場合は、それらの間に一種の接続(ソケット/メッセージングなど)を設定して、ログに記録された回線について管理アプリケーションに通知し、更新できます。

于 2012-05-28T13:40:52.400 に答える