c# - 通过 Xml 文件配置 log4net TextBoxAppender(自定义 appender)

标签 c# log4net log4net-appender

这是我的问题的跟进:Flexible Logging Interface...

我现在想为我的 WinForms 2.0 应用程序为多行文本框编写自定义 log4net 附加程序。 StackOverflow 成员之一 devdigital 已将我指向此链接:

TextBox Appender

但是,这篇文章没有描述如何通过 Xml 文件配置这样的附加程序。配置此 appender 的独特问题是我们需要将对 TextBox 对象的引用传递给此 appender。

那么是否可以使用 Xml 文件对其进行配置?还是只能以编程方式配置此类附加程序?有哪些选项可以使其尽可能可配置或松散耦合,可以使用 Xml 文件和代码的组合?

谢谢。

最佳答案

这取决于您配置 log4net 的方式,但通常在 log4net 读取配置时不会创建表单(因此不会创建文本框)。因此,您需要为表单和文本框名称创建属性。并且您应该检查表单是否已打开并且它在附加日志记录事件之前提供了文本框。此外,从 AppenderSkeleton 继承比从头开始实现 IAppender 更好:

public class TextBoxAppender : AppenderSkeleton
{
    private TextBox _textBox;
    public string FormName { get; set; }
    public string TextBoxName { get; set; }

    protected override void Append(LoggingEvent loggingEvent)
    {
        if (_textBox == null)
        {
            if (String.IsNullOrEmpty(FormName) || 
                String.IsNullOrEmpty(TextBoxName))
                return;

            Form form = Application.OpenForms[FormName];
            if (form == null)
                return;

            _textBox = form.Controls[TextBoxName] as TextBox;
            if (_textBox == null)
                return;

            form.FormClosing += (s, e) => _textBox = null;
        }

        _textBox.AppendText(loggingEvent.RenderedMessage + Environment.NewLine);
    }
}

配置很简单(log4net 将读取 xml 元素并为同名属性提供值):

<appender name="textbox" type="Foo.TextBoxAppender, Foo">
  <formName value="Form1"/>
  <textBoxName value="textBox1"/>
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date %-5level %logger - %message" />
  </layout>      
</appender>
<root>
  <level value="INFO" />
  <appender-ref ref="textbox"/>
</root>

我没有提供任何错误处理代码或与多线程和线程同步相关的代码,因为问题是关于附加程序配置的。

关于c# - 通过 Xml 文件配置 log4net TextBoxAppender(自定义 appender),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14114614/

相关文章:

.net - 检查 log4net XmlConfigurator 是否成功

c# - log4net 模式为没有完整路径的文件名提供了什么

c# - Log4net 缓冲区不起作用

c# - Log4net EventLogAppender 只能在根记录器中工作,为什么?

c# - 无法在我的 DataGrid 中使用类型化的 DataRowView

c# - 如何在一个特定的序列化中序列化除特定属性之外的所有属性

c# - 以编程方式在 Visual Studio 项目文件中添加和编辑目标

c# - 如何使用 log4net 存储在数据库中了解当前日志级别

Log4Net:什么时候获取和释放文件句柄?

c# - WPF 将 UI 事件绑定(bind)到 ViewModel 中的命令