問題は解決しました-この投稿を正しいコードで編集します。
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; }
}
}
}
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>();
Type属性に使用する値は、クラスの完全修飾名です。これは、アペンダーのクラスへのフルパス(名前空間+クラス名)の後に、それが含まれるアセンブリの名前が続きます。コードの場合、これは次のようになります(アセンブリの名前がWindowsFormsApplication1
-であると仮定します)。これはプロジェクトのプロパティで確認できます):
<appender name="MessageBoxAppender"
type="WindowsFormsApplication1.MessageBoxAppender, WindowsFormsApplication1">
</appender>