1

我正在尝试使用FormwithTextBox作为附加器,log4netTextBox根本不附加文本。我看到,该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");
    }
}

应用程序配置:

<?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>

装配信息.cs:

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

单击按钮后,bTestLog仅显示一条消息tbLog:“显示此消息”

UPD 我已经监视了它Text的财产,tbLog发现它很奇怪。在第一次附加之后,正如预期的那样,它是“显示此消息”。但是当程序进入DoAppend方法时,它是空的。进一步的附加按预期更改它,但是当回到bTestLog_Click它时再次显示“此消息显示”!

4

1 回答 1

2

好吧,我我明白了。

我强烈怀疑这是:

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

...正在让 log4net 创建一个FormMain. 因此,您已经显示了一个实例,但还有另一种形式没有显示,但正在接收附加调用。

您应该能够在调试器中看到这一点——如果您在DoAppendand中都设置断点bTestLog_Click,您将看到调用方法不同的实例。

我不知道将 log4net 挂钩到现有对象的最佳方法,但您可能会发现您可以通过编程方式在 log4net 中添加一个附加程序;您应该查看 API 以了解更多详细信息。

顺便说一句,我可能会将“作为附加程序”和“作为表单”的关注点分开 - 我会创建一个实现,IAppender它附加到其构造函数中提供的文本框,然后传递相关文本构建附加程序时从表单中获取框。不过,这是一个稍微不同的问题:)

于 2013-04-22T10:56:59.147 回答