下面是我的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>
谢谢。
答案 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中加载日志。
allowAccessoryFormCreation="False"
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设置为记录器