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