NLog控件到现有的RichTextBox Windows窗体

时间:2012-07-24 13:30:59

标签: c# nlog

下面是我的NLog配置,我想在Form1中将日志加载到名为rtMessage的现有RichTextBox中,但是NLog将创建一个新窗口,并将日志消息加载到RichTextBox中:

 <targets>
    <target xsi:type="RichTextBox" name="m" layout="${longdate}|${level:uppercase=true}|${logger}|${message}" 
            controlName="rtMessage" formName="Form1" />
  </targets>

  <rules>
    <logger name="*" minlevel="Debug" writeTo="m" />
  </rules>

谢谢。

5 个答案:

答案 0 :(得分:9)

我认为您可以在NLog Codeplex论坛here找到问题的答案。

如果您在static表单中的字段声明中直接初始化logger Form1,则Form1 实例将不存在, NLog将继续为RichTextBox目标创建一个新表单。

您需要做的是将logger的初始化延迟到Form1实例已初始化的时间,例如在Load事件处理程序中。

以下是Codeplex问题的功能代码摘录:

public partial class Form1 : Form
{
    private static Logger logger;// = LogManager.GetCurrentClassLogger();

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        logger = LogManager.GetCurrentClassLogger();
    }
}

为避免不必要的重新初始化,您可能只想在尚未初始化时初始化logger,即

    private void Form1_Load(object sender, EventArgs e)
    {
        if (logger == null) logger = LogManager.GetCurrentClassLogger();
    }

答案 1 :(得分:1)

1. winform1_Load中的正常初始化记录器 虽然它已完成InitializeComponent - &gt;已初始化您自己的RichTextBox。

2.然后让RichTextBoxTarget的{​​{1}}和FormName初始化确定。 如:

ControlName

更多可以参考my post

答案 2 :(得分:0)

以下是三个提示,可帮助您在现有RichTextBox中加载日志。

  1. 确保formName和controlName与实际用法一致
  2. 在NLog.config中设置allowAccessoryFormCreation="False"
  3. RichTextBoxTarget.ReInitializeAllTextboxes(this);在Form_Load中

PS:按照这种方式,您需要在NLog.config中配置RichTextBoxTarget,请参阅RictTextBoxTarget

答案 3 :(得分:0)

https://github.com/NLog/NLog.Windows.Forms/wiki/RichTextBoxTarget

我有类似的问题要登录到windows.form。我使用了NLog.Windows.Forms  从Nugget的Nlog和Nlog.config。 我从链接中遵循给定的模板,并使之无需任何手动初始化即可工作。我将部分代码提供到Nlog.config中。希望对您有所帮助。

<targets>
<target xsi:type="RichTextBox"
      name="richTextBox1"
      layout="${longdate}|${level:uppercase=true}|${logger}|${message}"
      height="30"
      autoScroll="true"
      maxLines="60"
      showMinimized="true"
      toolWindow="true"
      controlName="richTextBox1"
      formName="Form1"
      width="50"
      useDefaultRowColoringRules="true"
      allowAccessoryFormCreation="true"
      messageRetention="None"
      supportLinks="false"
>
</target>
</targets>

答案 4 :(得分:0)

别忘了添加

LogManager.ReconfigExistingLoggers();

如果通过编程将RichTextBox设置为记录器