Feedback

C# - MessageBox Appender für LOG4NET

Veröffentlicht von am 08.12.2008
(1 Bewertungen)
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; }
        }
    }
}
Abgelegt unter log4net, MessageBox, Appender.

Kommentare zum Snippet

 

Logge dich ein, um hier zu kommentieren!