1

FormwithTextBoxをアペンダーとして使用しようとしていますlog4netが、TextBox単にテキストを追加しないでください。なるほど、そのAppendTextメソッドは (UI スレッドから) 呼び出され、プロパティTextは変更されますが、追加された値が消えるだけで、Textプロパティはまだ空です。

問題があるかどうかはわかりませんlog4netが、問題はログでのみ発生します。

アプリケーションの起動とフォーム (InvokeIfRequiredここからの非常に一般的な拡張機能です: InvokeRequired コード パターンの自動化):

public partial class FormMain : Form, IAppender
{
    readonly ILog log;

    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        XmlConfigurator.Configure();

        Application.Run(new FormMain());
    }
    public FormMain()
    {
        log = LogManager.GetLogger(typeof(FormMain));

        InitializeComponent();
    }

    public void DoAppend(LoggingEvent le)
    {
        tbLog.AppendText("This msg is NOT shown");

        tbLog.InvokeIfRequired(() =>
            {
                // NOT SHOWN
                tbLog.AppendText(string.Format("{0:yyyyMMdd HH:mm:ss.fff}> [{1}] [{2}] {3}", le.TimeStamp, le.LoggerName, le.Level, le.MessageObject));
            });
    }

    private void bTestLog_Click(object sender, EventArgs e)
    {
        tbLog.AppendText("This msg is shown");

        log.Debug("Test logs");
    }
}

App.config:

<?xml version="1.0"?>
<configuration>

  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
  </configSections>

  <log4net>
    <appender name="FileAppender" type="log4net.Appender.FileAppender,log4net">
      <file value="mylogfile.txt" />
      <appendToFile value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger [%ndc] - %message%newline" />
      </layout>
    </appender>

    <appender name="FormMain" type="Client.FormMain,Client" />

    <root>
      <level value="DEBUG"/>
      <appender-ref ref="FormMain"/>
    </root>
  </log4net>

</configuration>

AssemblyInfo.cs:

[assembly: log4net.Config.XmlConfigurator(Watch = true)]

ボタンをクリックすると、「このbTestLogメッセージが表示されます」というメッセージが 1 つだけ表示されます。tbLog

UPDTextのプロパティを 監視tbLogしたところ、非常に奇妙であることがわかりました。最初に追加した後、予想どおり、「このメッセージが表示されます」です。しかし、プログラムがDoAppendメソッドに入ると、それは空です。さらに追加すると、期待どおりに変更されますが、元に戻ると、bTestLog_Click再び「このメッセージが表示されます」です!

4

1 に答える 1

2

わかりました、私はそれを手に入れたと思います

私はこれを強く疑っています:

<appender name="FormMain" type="Client.FormMain,Client" />

... の新しいインスタンスを作成するために log4net を取得していますFormMain。1 つのインスタンスが表示されていますが、表示されていない別のフォームがありますが、append 呼び出しを受け取っています。

デバッガーでそれを確認できるはずです。ブレークポイントを と の両方に配置するDoAppendbTestLog_Click、メソッドが呼び出されているインスタンスが異なることがわかります。

log4net を既存のオブジェクトにフックする最良の方法はわかりませんが、プログラムで log4net にアペンダーを追加するだけでよいことに気付くかもしれません。詳細については、API を参照してください。

余談ですが、おそらく「アペンダーであること」と「フォームであること」の懸念を分離しIAppenderます。コンストラクターで提供されるテキストボックスに追加する実装を作成し、関連するテキストを渡しますアペンダーを構築するときにフォームからボックス。それは少し違う問題ですが:)

于 2013-04-22T10:56:59.147 に答える