NLog 在 MainForm 之外不起作用 class
NLog does not work outside MainForm class
我有这个代码
public partial class MainForm : Telerik.WinControls.UI.RadForm
{
private static Logger logger = LogManager.GetLogger("Main");
private MyClass=new MyClass();
public MainForm()
{
InitializeComponent();
}
private void MainForm_Load(object sender, EventArgs e)
{
SetupFormLogger();
logger.Info(Properties.LogMessages.AppStarted); // this message appears in the richtextbox log
}
public void SetupFormLogger()
{
NLog.Windows.Forms.RichTextBoxTarget target = new NLog.Windows.Forms.RichTextBoxTarget();
target.Name = "control";
target.Layout = "${longdate} ${level:uppercase=true} ${logger} ${message}";
target.ControlName = richtextLog.Name;
target.FormName = this.Name;
target.TargetForm = this;
target.AutoScroll = true;
target.MaxLines = 10000;
target.UseDefaultRowColoringRules = false;
target.RowColoringRules.Add(
new RichTextBoxRowColoringRule(
"level == LogLevel.Trace", // condition
"WhiteSmoke", // font color
"Black", // background color
FontStyle.Regular
)
);
target.RowColoringRules.Add(new RichTextBoxRowColoringRule("level == LogLevel.Debug", "Gray", "Black"));
target.RowColoringRules.Add(new RichTextBoxRowColoringRule("level == LogLevel.Info", "WhiteSmoke", "Black"));
target.RowColoringRules.Add(new RichTextBoxRowColoringRule("level == LogLevel.Warn", "DarkRed", "Black"));
target.RowColoringRules.Add(new RichTextBoxRowColoringRule("level == LogLevel.Error", "White", "DarkRed", FontStyle.Bold));
target.RowColoringRules.Add(new RichTextBoxRowColoringRule("level == LogLevel.Fatal", "Yellow", "DarkRed", FontStyle.Bold));
AsyncTargetWrapper asyncWrapper = new AsyncTargetWrapper();
asyncWrapper.Name = "AsyncRichTextBox";
asyncWrapper.WrappedTarget = target;
SimpleConfigurator.ConfigureForTargetLogging(asyncWrapper, LogLevel.Debug);
}
}
class MyClass
{
public void Test()
{
Logger log=LogManager.GetLogger("MyClass");
log.Info("Text"); // THIS TEXT IS NOT LOGGED OR DISPLAYED IN RICHTEXTBOX
}
}
我觉得顺序很重要。 MyClass 是在您设置日志记录目标之前创建的。我认为有一个像 ReconfigureExistingLoggers
或类似的函数...在创建日志记录目标后调用它或将设置函数的调用上移并将 MyClass 创建移动到 FormLoad...
编辑:
仅使用 ReconfigureExistingLoggers 无济于事,因为之前创建了 MyClass,因此在有任何 LoggingTarget 之前发送日志消息。
EDIT2:你在哪里调用 MyClass.Test
?
EDIT3:我不知道你这边有什么问题,我只是将你的代码复制到一个空表单,添加了一个 RichTextBox 和一个 Button,稍微修改了你的代码(日志消息的内容,没有硬编码记录器名称)为此,它起作用了。我正在使用 NLog 4.4.12 和 NLog.Windows.Forms 4.2.3
public partial class Form1 : Form
{
private static Logger logger = LogManager.GetLogger(typeof(Main).Name);
private MyClass instance =new MyClass();
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
SetupFormLogger();
logger.Info("Some message"); // this message appears in the richtextbox log
}
public void SetupFormLogger()
{
NLog.Windows.Forms.RichTextBoxTarget target = new NLog.Windows.Forms.RichTextBoxTarget();
target.Name = "control";
target.Layout = "${longdate} ${level:uppercase=true} ${logger} ${message}";
target.ControlName = richTextBox1.Name;
target.FormName = this.Name;
target.TargetForm = this;
target.AutoScroll = true;
target.MaxLines = 10000;
target.UseDefaultRowColoringRules = false;
target.RowColoringRules.Add(new RichTextBoxRowColoringRule("level == LogLevel.Trace", "WhiteSmoke", "Black", FontStyle.Regular));
target.RowColoringRules.Add(new RichTextBoxRowColoringRule("level == LogLevel.Debug", "Gray", "Black"));
target.RowColoringRules.Add(new RichTextBoxRowColoringRule("level == LogLevel.Info", "WhiteSmoke", "Black"));
target.RowColoringRules.Add(new RichTextBoxRowColoringRule("level == LogLevel.Warn", "DarkRed", "Black"));
target.RowColoringRules.Add(new RichTextBoxRowColoringRule("level == LogLevel.Error", "White", "DarkRed", FontStyle.Bold));
target.RowColoringRules.Add(new RichTextBoxRowColoringRule("level == LogLevel.Fatal", "Yellow", "DarkRed", FontStyle.Bold));
AsyncTargetWrapper asyncWrapper = new AsyncTargetWrapper();
asyncWrapper.Name = "AsyncRichTextBox";
asyncWrapper.WrappedTarget = target;
SimpleConfigurator.ConfigureForTargetLogging(asyncWrapper, LogLevel.Debug);
}
private void button1_Click(object sender, EventArgs e)
{
instance.Test();
}
}
class MyClass
{
public void Test()
{
Logger log = LogManager.GetLogger(typeof(MyClass).Name);
log.Info("Text"); // THIS TEXT IS NOT LOGGED OR DISPLAYED IN RICHTEXTBOX
}
}
我有这个代码
public partial class MainForm : Telerik.WinControls.UI.RadForm
{
private static Logger logger = LogManager.GetLogger("Main");
private MyClass=new MyClass();
public MainForm()
{
InitializeComponent();
}
private void MainForm_Load(object sender, EventArgs e)
{
SetupFormLogger();
logger.Info(Properties.LogMessages.AppStarted); // this message appears in the richtextbox log
}
public void SetupFormLogger()
{
NLog.Windows.Forms.RichTextBoxTarget target = new NLog.Windows.Forms.RichTextBoxTarget();
target.Name = "control";
target.Layout = "${longdate} ${level:uppercase=true} ${logger} ${message}";
target.ControlName = richtextLog.Name;
target.FormName = this.Name;
target.TargetForm = this;
target.AutoScroll = true;
target.MaxLines = 10000;
target.UseDefaultRowColoringRules = false;
target.RowColoringRules.Add(
new RichTextBoxRowColoringRule(
"level == LogLevel.Trace", // condition
"WhiteSmoke", // font color
"Black", // background color
FontStyle.Regular
)
);
target.RowColoringRules.Add(new RichTextBoxRowColoringRule("level == LogLevel.Debug", "Gray", "Black"));
target.RowColoringRules.Add(new RichTextBoxRowColoringRule("level == LogLevel.Info", "WhiteSmoke", "Black"));
target.RowColoringRules.Add(new RichTextBoxRowColoringRule("level == LogLevel.Warn", "DarkRed", "Black"));
target.RowColoringRules.Add(new RichTextBoxRowColoringRule("level == LogLevel.Error", "White", "DarkRed", FontStyle.Bold));
target.RowColoringRules.Add(new RichTextBoxRowColoringRule("level == LogLevel.Fatal", "Yellow", "DarkRed", FontStyle.Bold));
AsyncTargetWrapper asyncWrapper = new AsyncTargetWrapper();
asyncWrapper.Name = "AsyncRichTextBox";
asyncWrapper.WrappedTarget = target;
SimpleConfigurator.ConfigureForTargetLogging(asyncWrapper, LogLevel.Debug);
}
}
class MyClass
{
public void Test()
{
Logger log=LogManager.GetLogger("MyClass");
log.Info("Text"); // THIS TEXT IS NOT LOGGED OR DISPLAYED IN RICHTEXTBOX
}
}
我觉得顺序很重要。 MyClass 是在您设置日志记录目标之前创建的。我认为有一个像 ReconfigureExistingLoggers
或类似的函数...在创建日志记录目标后调用它或将设置函数的调用上移并将 MyClass 创建移动到 FormLoad...
编辑: 仅使用 ReconfigureExistingLoggers 无济于事,因为之前创建了 MyClass,因此在有任何 LoggingTarget 之前发送日志消息。
EDIT2:你在哪里调用 MyClass.Test
?
EDIT3:我不知道你这边有什么问题,我只是将你的代码复制到一个空表单,添加了一个 RichTextBox 和一个 Button,稍微修改了你的代码(日志消息的内容,没有硬编码记录器名称)为此,它起作用了。我正在使用 NLog 4.4.12 和 NLog.Windows.Forms 4.2.3
public partial class Form1 : Form
{
private static Logger logger = LogManager.GetLogger(typeof(Main).Name);
private MyClass instance =new MyClass();
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
SetupFormLogger();
logger.Info("Some message"); // this message appears in the richtextbox log
}
public void SetupFormLogger()
{
NLog.Windows.Forms.RichTextBoxTarget target = new NLog.Windows.Forms.RichTextBoxTarget();
target.Name = "control";
target.Layout = "${longdate} ${level:uppercase=true} ${logger} ${message}";
target.ControlName = richTextBox1.Name;
target.FormName = this.Name;
target.TargetForm = this;
target.AutoScroll = true;
target.MaxLines = 10000;
target.UseDefaultRowColoringRules = false;
target.RowColoringRules.Add(new RichTextBoxRowColoringRule("level == LogLevel.Trace", "WhiteSmoke", "Black", FontStyle.Regular));
target.RowColoringRules.Add(new RichTextBoxRowColoringRule("level == LogLevel.Debug", "Gray", "Black"));
target.RowColoringRules.Add(new RichTextBoxRowColoringRule("level == LogLevel.Info", "WhiteSmoke", "Black"));
target.RowColoringRules.Add(new RichTextBoxRowColoringRule("level == LogLevel.Warn", "DarkRed", "Black"));
target.RowColoringRules.Add(new RichTextBoxRowColoringRule("level == LogLevel.Error", "White", "DarkRed", FontStyle.Bold));
target.RowColoringRules.Add(new RichTextBoxRowColoringRule("level == LogLevel.Fatal", "Yellow", "DarkRed", FontStyle.Bold));
AsyncTargetWrapper asyncWrapper = new AsyncTargetWrapper();
asyncWrapper.Name = "AsyncRichTextBox";
asyncWrapper.WrappedTarget = target;
SimpleConfigurator.ConfigureForTargetLogging(asyncWrapper, LogLevel.Debug);
}
private void button1_Click(object sender, EventArgs e)
{
instance.Test();
}
}
class MyClass
{
public void Test()
{
Logger log = LogManager.GetLogger(typeof(MyClass).Name);
log.Info("Text"); // THIS TEXT IS NOT LOGGED OR DISPLAYED IN RICHTEXTBOX
}
}