web-dev-qa-db-ja.com

Log4Netカスタムアペンダー:カスタムアペンダーを使用して書き込まれるメッセージをログに記録する方法は?

問題は解決しました-この投稿を正しいコードで編集します。

Log4netロガーとカスタムアペンダーへの添付ファイルを初期化してメッセージを送信する「メイン」関数を作成しようとしています-これは私の試みです(残念ながら成功しませんでした)

初期化の何が問題になっていますか(以下の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'またはその依存関係の1つを読み込めませんでした。システムは指定されたファイルを見つけることができません。": "MessageBoxAppender"} [IMG] http://i57.tinypic .com/qrjcjc.png [/ IMG]

以下のリンクから、このカスタムアペンダーコードを使用してログメッセージを作成しようとしています

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

私の目標はボタンをクリックすることであり、ログメッセージはカスタムアペンダーを考えて書き込みます。

私は3つのファイル/クラスを持っています。

1.Form1.csウィンドウフォーム–メッセージと初期化を書き込む必要があるボタンのみが含まれています。

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カスタムアペンダー

    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>();
7
shay12

Type属性に使用する値は、クラスの完全修飾名です。これは、アペンダーのクラスへのフルパス(名前空間+クラス名)の後に、それが含まれるアセンブリの名前が続きます。コードの場合、これは次のようになります(アセンブリの名前がWindowsFormsApplication1-であると仮定します)。これはプロジェクトのプロパティで確認できます):

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