2017-08-27 34 views
0

外工作,我有這樣的代碼NLOG不MainForm的

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

'SetupFormLogger'之後'LogManager.GetLogger( 「主」)'調用。只要讓記錄器非靜態並在'SetupFormLogger'後面創建記錄器即可。 – Julian

回答

1

我覺得順序很重要。在設置日誌記錄目標之前創建MyClass。我覺得這是......叫它創建日誌目標後或向上移動設置函數的調用和移動MyClass的創建到FormLoad ...

EDIT像ReconfigureExistingLoggers或類似的東西的功能: 剛開始使用從以前創建的MyClass gots開始重新配置ExistingLogger不會提供幫助,因此在有任何LoggingTarget之前發送日誌消息。

編輯2:你在哪裏打電話MyClass.Test?我只是複製你的代碼到一個空的表單,添加了一個RichTextBox和一個Button,稍微修改了你的代碼(日誌消息的內容,而不是硬編碼記錄器名稱)到這和它的工作。我使用NLOG 4.4.12和4.2.3 NLog.Windows.Forms

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

用戶單擊按鈕後,我調用MyClass.Test –

+0

我在SetupFormLogger之後移動了MainForm Load中的MyClass創建,現在它工作正常! –