Diese Appender zeigt für die Fehlermeldungen aus log4net eine MessageBox an. Die Klasse wird wie folgt in der app.config eingebunden:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
</configSections>
<log4net>
<appender name="MessageBoxAppender" type="Softwareküche.Common.MessageBoxAppender,[NAME OF THE DLL]">
<layout type="log4net.Layout.PatternLayout" value="%message"/>
<filter type="log4net.Filter.LevelRangeFilter">
<levelMin value="ERROR" />
<levelMax value="FATAL" />
</filter>
</appender>
<root>
<level value="INFO"/>
<appender-ref ref="MessageBoxAppender" />
</root>
</log4net>
</configuration>
using System;
using System.Text;
namespace Softwareküche.Common
{
using System.Globalization;
using System.IO;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using log4net.Appender;
using log4net.Core;
using log4net.Layout;
using log4net.Util;
/// <summary>
/// MessageBox für log4net zum Anzeigen von "Error" und "Fatal" Fehlermeldungen.
/// </summary>
[ComVisible(false)]
public class MessageBoxAppender : AppenderSkeleton
{
private PatternLayout _titleLayout;
private readonly LevelMapping _LevelMapping = new LevelMapping();
/// <summary>
/// Überschreibt die Methode zum Anzeigen und durchreichen der Fehlermeldung
/// </summary>
/// <param name="loggingEvent">Logging Event der Append Methode</param>
protected override void Append(LoggingEvent loggingEvent)
{
MessageBoxIcon messageBoxIcon = MessageBoxIcon.Information;
LevelIcon levelIcon = (LevelIcon) this._LevelMapping.Lookup(loggingEvent.Level);
if (levelIcon != null)
{
messageBoxIcon = levelIcon.Icon;
}
// Fehlermessage generieren
string message;
if (loggingEvent.ExceptionObject != null)
{
// Fall eine Exception diese ausgeben,
message = loggingEvent.ExceptionObject.Message;
}
else
{
// Ansonsten die ersten 300 Zeichen
message = this.RenderLoggingEvent(loggingEvent);
if (message.IndexOf(Environment.NewLine) > 0)
{
message = message.Substring(0, message.IndexOf(Environment.NewLine) - 1);
}
if (message.Length > 300)
{
message = message.Substring(0, 300) + " ...";
}
}
// Titel ist der Fehlerlevel
string title;
if (this._titleLayout == null)
{
title = loggingEvent.Level.Name;
}
else
{
StringWriter titleWriter = new StringWriter(CultureInfo.InvariantCulture);
this._titleLayout.Format(titleWriter, loggingEvent);
title = titleWriter.ToString();
titleWriter.Dispose();
}
// Fehler anzeigen
MessageBox.Show(message, title, MessageBoxButtons.OK, messageBoxIcon, MessageBoxDefaultButton.Button1, 0);
}
/// <summary>
/// Überschreiben und durchreichen der Methode.
/// </summary>
/// <param name="mapping">Das Mapping</param>
public void AddMapping(LevelIcon mapping)
{
this._LevelMapping.Add(mapping);
}
/// <summary>
/// Überschreiben und durchreichen der Methode.
/// </summary>
public PatternLayout TitleLayout
{
get { return this._titleLayout; }
set { this._titleLayout = value; }
}
/// <summary>
/// Überschreiben und durchreichen der Methode.
/// </summary>
public override void ActivateOptions()
{
base.ActivateOptions();
this._LevelMapping.ActivateOptions();
}
}
/// <summary>
/// Icon, das angezeigt wird.
/// </summary>
[ComVisible(false)]
public class LevelIcon : LevelMappingEntry
{
/// <summary>
/// Überschreiben und durchreichen der Methode.
/// </summary>
public LevelIcon()
: base()
{
this._icon = MessageBoxIcon.None;
}
private MessageBoxIcon _icon;
/// <summary>
/// Icon für die Message Box
/// </summary>
public MessageBoxIcon Icon
{
get { return this._icon; }
set { this._icon = value; }
}
}
}
Kommentare zum Snippet