Logmanager: comment "logger" de manière simple

Contenu du snippet

Il m'est arrivé à plusieurs reprises de débugger avec la console quelquechose, et plus tard de vouloir avoir tout ce débug dans un fichier. Dans d'autre cas, j'aimais bien avoir un log des warnings et des erreurs dans la console, et avoir une trace des évenements du déroulement dans un autre fichier. Eh bien cette petite classe toute simple me permet de le faire rapidement en permettant de différencier les messages selon un degré d'importance. LogLevel est une enum représentant la disposition suggérée des niveaux d'erreur, mais au final lorsque vous vous abonnez à l'évenement, vous recevez un INT, alors à vous de l'utiliser comme bon vous semble.

Source / Exemple :


using System;

namespace UtilityLib
{
    /// <summary>
    /// Degré donné au message
    /// </summary>
    public enum LogLevel
    {
        MessageVeryLow = 0,
        MessageLow = 10,
        Message = 20,
        MessageHigh = 30,
        MessageVeryHigh = 40,
        WarningLow = 50,
        Warning = 60,
        WarningHigh = 70,
        ErrorLow = 80,
        Error = 90,
        ErrorHigh = 100
    }

    /// <summary>
    /// Delegate d'un log
    /// </summary>
    /// <param name="from">Source du message</param>
    /// <param name="message">Le message</param>
    /// <param name="level">Le degré du message (Voir "LogLevel" pour des valeurs préféfinies) (plus il est élevé, plus il est important)</param>
    public delegate void LogDelegate(string from, string message, int level);

    public static class LogManager
    {
        /// <summary>
        /// Évenement déclenché lorsque quelqu'un log quelquechose
        /// </summary>
        public static event LogDelegate MessageLogged;

        /// <summary>
        /// Log d'un message formatté
        /// </summary>
        /// <param name="from">Source du message</param>
        /// <param name="format">Message formatté</param>
        /// <param name="args">Argument du message formaté</param>
        public static void Log(string from, string format, params object[] args)
        {
            Log((int)LogLevel.Message, from, format, args);
        }

        /// <summary>
        /// Log d'un message formatté
        /// </summary>
        /// <param name="level">Élément LogLevel déterminant le degré du message</param>
        /// <param name="from">Source du message</param>
        /// <param name="format">Message formatté</param>
        /// <param name="args">Argument du message formaté</param>
        public static void Log(LogLevel level, string from, string format, params object[] args)
        {
            Log((int)level, from, format, args);
        }

        /// <summary>
        /// Log d'un message formatté
        /// </summary>
        /// <param name="level">Nombre déterminant le degré du message (plus il est élevé, plus il est important)</param>
        /// <param name="from">Source du message</param>
        /// <param name="format">Message formatté</param>
        /// <param name="args">Argument du message formaté</param>
        public static void Log(int level, string from, string format, params object[] args)
        {
            if (MessageLogged != null)
                MessageLogged(from, String.Format(format, args), level);
        }
    }
}

///////////////////////////
///////////////////////////
// EXEMPLE D'UTILISATION //
///////////////////////////
///////////////////////////
    public partial class MainForm : Form
    {
        StreamWriter lowlogger;
        StreamWriter logger;
        Tournament tournoi;

        public MainForm()
        {
            InitializeComponent();
            LogManager.MessageLogged += new LogDelegate(LogManager_MessageLogged);
            btnStartTournament_Click(this, new EventArgs()); // Automatic start !
        }

        void LogManager_MessageLogged(string from, string message, int level)
        {
            DateTime now = DateTime.Now;
            String strNow = String.Format("{0:0000}-{1:00}-{2:00} {3:00}:{4:00}:{5:00}.{6:000}", now.Year, now.Month, now.Day, now.Hour, now.Minute, now.Second, now.Millisecond);
            string msg;
            if( level >= (int)LogLevel.ErrorLow )
                msg = String.Format("[{0}]<{1}> !!!!!! ERROR !!!!!! {2}", strNow, from, message);
            else
                msg = String.Format("[{0}]<{1}> {2}", strNow, from, message);
            if (level >= (int)LogLevel.Message)
            {
                Console.WriteLine(msg);
                lock (logger)
                {
                    logger.WriteLine(msg);
                }
            }
            lock (lowlogger)
            {
                lowlogger.WriteLine(msg);
            }
        }
        private void btnStartTournament_Click(object sender, EventArgs e)
        {
            logger = new StreamWriter("log.txt");
            lowlogger = new StreamWriter("logDetail.txt");
            btnStartTournament.Enabled = false;
            tournoi.StartTournament();
        }

        private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (logger != null)
                logger.Flush();
            if (lowlogger != null)
                lowlogger.Flush();
            logger.Close();
            lowlogger.Close();
        }
    }

Conclusion :


Très simple d'utilisation, rapide et jusqu'à présent dans mon cas, efficace !

Ensuite, pour logger, il suffit de faire comme suit:
LogManager.Log("Admin","Je log un truc");
LogManager.Log("Bob","Je log {0} trucs", 5); // *
LogManager.Log(55,"root","Je log un truc qui a un peu d'importance");
LogManager.Log(95,"root","Je log un truc super important");
LogManager.Log(LogLevel.ErrorHigh,"ErrorManager","Erreur Fatale: 404 - Fichier non trouvé");

//* A noter que les formattage est le même que celui de string.Format et s'utilise exactement de la même façon, en effet, je n'ai rien inventé ici :)

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.