2014-11-06 49 views
4

問題解決了 - 我用正確的代碼編輯這篇文章。Log4Net自定義appender:如何記錄將使用自定義appender編寫的消息?

我試圖寫的「主」函數初始化log4net的記錄器+附件到自定義的appender和發送消息認爲它 - 這是我嘗試(沒有成功可惜)

什麼是錯的我初始化(下面的Form1.cs)?

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     ILog log = LogManager.GetLogger(typeof(Form1)); 

     public Form1() 
     { 

      log4net.Config.XmlConfigurator.Configure(); 
      InitializeComponent(); 
     } 



     private void button1_Click(object sender, EventArgs e) 
     { 
      log.Info("Creating log"); 
     } 
    } 

錯誤消息-Exception = { 「無法加載文件或程序集 'MessageBoxAppender' 或它的一個依賴系統無法找到指定的文件。」: 「MessageBoxAppender」} [IMG] http://i57.tinypic.com/qrjcjc.png[/IMG]

我嘗試寫從鏈接這個定製的appender代碼登錄以下

http://www.alteridem.net/2008/01/10/writing-an-appender-for-log4net/

消息我的目標是點擊一個按鈕,一條日誌消息將寫入思想的自定義appender。

我有3個文件/類。

1.Form1.cs windows窗體 - 只包含一個應寫入消息和初始化的按鈕。

2. 「MessageBoxAppender.cs」 - 自定義所附從 「AppenderSkeleton」

3.app.config繼承 - 爲對log4net的配置

的app.config

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
    <section name="log4net" 
    type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> 
    </configSections> 
    <log4net> 
    <appender name="MessageBoxAppender" 
     type="WindowsFormsApplication1.MessageBoxAppender, WindowsFormsApplication1"> 
     <layout type="log4net.Layout.PatternLayout"> 
     <ConversionPattern value="%m" /> 
     </layout> 
    </appender> 
    <root> 
     <level value="ALL"/> 
     <appender-ref ref="MessageBoxAppender" /> 
    </root> 
    </log4net> 
</configuration> 

MessageBoxAppender定製appender

using log4net.Appender; 
    using log4net.Core; 
    using System; 
    using System.Collections.Generic; 
    using System.Diagnostics; 
    using System.Linq; 
    using System.Text; 
    using System.Threading.Tasks; 
    using System.Windows.Forms; 

    namespace WindowsFormsApplication1 
    { 
     public class MessageBoxAppender : AppenderSkeleton 
     { 
      /// <summary> 
      /// Writes the logging event to a MessageBox 
      /// </summary> 
      override protected void Append(LoggingEvent loggingEvent) 
      { 
       string title = string.Format("{0} {1}", 
        loggingEvent.Level.DisplayName, 
        loggingEvent.LoggerName); 

       string message = string.Format(
        "{0}{1}{1}{2}{1}{1}(Yes to continue, No to debug)", 
        RenderLoggingEvent(loggingEvent), 
        Environment.NewLine, 
        loggingEvent.LocationInformation.FullInfo); 

       DialogResult result = MessageBox.Show(message, title,  MessageBoxButtons.YesNo); 

       if (result == DialogResult.No) 
       { 
        Debugger.Break(); 
       } 
      } 

      /// <summary> 
      /// This appender requires a <see cref="Layout"/> to be set. 
      /// </summary> 
      override protected bool RequiresLayout 
      { 
       get { return true; } 
      } 
     } 
    } 
  1. 我不知道這條線在App.config是正確的 - 得到的回答

    <appender name="MessageBoxAppender" 
    type="WindowsFormsApplication1.MessageBoxAppender, MessageBoxAppender"> 
    </appender> 
    

是慣例是

type="namespace + custom appender class name, custom appender class name> 

[編輯]我添加到我的代碼:

var errors = LogManager.GetRepository().ConfigurationMessages.Cast<log4net.Util.LogLog>(); 
+1

log4net的設計,如果配置無效不是拋出一個錯誤,但是你可以通過調用'VAR誤差= LogManager.GetRepository()ConfigurationMessages查詢配置錯誤。在調用'XmlConfigurator.Configure();' – stuartd 2014-11-07 00:37:41

+0

後調用();謝謝,我補充一下。得到這個錯誤「Exception = {」無法加載文件或程序集「MessageBoxAppender」或它的一個依賴項。系統找不到指定的文件。「:」MessageBoxAppender「}」 – shay12 2014-11-07 07:56:14

回答

7

用於type屬性的值是af班級的合格名稱。這是appender(命名空間+類名)的類的完整路徑,後面跟它所在的程序集的名稱。對於你的代碼,這將是(假設你的程序集叫做WindowsFormsApplication1 - 你可以檢查這個在項目的屬性):

<appender name="MessageBoxAppender" 
    type="WindowsFormsApplication1.MessageBoxAppender, WindowsFormsApplication1"> 
</appender> 
+0

謝謝,我在我的文章中編輯它。 – shay12 2014-11-07 07:56:44

相關問題