C# NLog不在MainForm类之外工作

C# NLog不在MainForm类之外工作,c#,.net,winforms,nlog,C#,.net,Winforms,Nlog,我有这个密码 public partial class MainForm : Telerik.WinControls.UI.RadForm { private static Logger logger = LogManager.GetLogger("Main"); private MyClass=new MyClass(); public MainForm() { InitializeComponent(); } privat

我有这个密码

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

我认为订单很重要。MyClass是在设置日志目标之前创建的。我认为有一个类似于重新配置现有记录器之类的功能。。。在创建日志记录目标后调用它,或者向上移动setup函数的调用,并将MyClass创建移动到FormLoad

编辑: 仅仅使用ReconfigureExistingLoggers是没有帮助的,因为MyClass是在之前创建的,所以日志消息是在有任何LoggingTarget之前发送的

EDIT2:你把MyClass.Test称为哪里

EDIT3:我不知道你那边出了什么问题,我只是把你的代码复制到一个空表单上,添加了一个RichTextBox和一个按钮,稍微修改了日志消息中的代码内容,没有将记录器名称硬编码到这个表单上,它就工作了。我使用的是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
    }
}

我调用MyClass.Test一段时间后,当用户单击一个按钮时,我已经在SetupFormLogger之后在MainForm加载中移动了MyClass创建,现在它可以工作了!SetupFormLogger在LogManager.GetLoggerMain之后调用。只需使记录器非静态,并在SetupFormLogger之后创建记录器。
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
    }
}