Logmanager: comment "logger" de manière simple

Soyez le premier à donner votre avis sur cette source.

Snippet vu 6 048 fois - Téléchargée 14 fois

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

Ajouter un commentaire

Commentaires

cs_Bidou
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
43 -
C'est rigolo parce qu'il fût un temps, je tenais un discours +/- similaire... qui n'est pas vraiment réaliste. Une application (je ne parle pas des bricolages qu'on fait chez soit le week-end...) bouge, évolue, a d'autres besoins au fur et à mesure que le temps avance et c'est très utile d'utiliser ce qu'il existe déjà (qui est connu et donc éprouvé) avant de se lancer dans la conception et de réinventer la roue (en moins bien) même si la librairie en fait actuellement un peu trop par rapport à ce qu'on veut.

Aujourd'hui, parcourir le web comme tu dis, c'est une chose ABSOLUMENT INDISPENSABLE quand on commence un projet, pour limiter au maximum le travail qu'on va faire (et donc le coût) et reprendre ce qu'il existe déjà, surtout quand c'est le cas de librairie open source qui demande un investissement en temps d'une trentaine de minutes pour être mise en place comme log4net.

Après c'est sûr, c'est pas toujours si simple, si la lib est tellement grande que tu dois passer plusieurs dizaines d'heures dessus pour maîtriser le contenu alors que 1 ou 2h de travail aurait suffit à faire ce que tu veux.... mais dans le cas de log4net, ce n'est pas comme ça (ça fait partie de la phase de recherche d'évaluer ce genre de chose).

En résumé: toujours chercher ce qu'il existe, si possible prendre ce qui est connu et ce que les autres utilises aussi plutôt que de faire son bricolage fait maison...Cela dit, ceci ne remet nullement en cause la présence de cette source sur le site, elle peut toujours donner des idées à d'autres. Je mentionne juste qu'il existe d'autres solutions et que je n'encourage pas les membres à utiliser ce que tu proposes dans leur projet (pour les raisons évoquées ci-dessus).

Il s'agit de mon avis personnel avec mon expérience personnelle, je conçois qu'on ne soit pas d'accord sur la totalité....

http://www.csharpfr.com/tutoriaux/UTILISATION-LOG4NET_961.aspx
ricklekebekoi
Messages postés
303
Date d'inscription
mardi 11 février 2003
Statut
Membre
Dernière intervention
24 avril 2009
4 -
En fait, je suis certain que cette librairie peut faire beaucoup plus de chose que tes quelques lignes... sauf que mes quelques lignes répondent prafaitement a mes besoins, donc pourquoi commencer a chercher si quelquechose existe déjà quand, en quelque lignes, mon besoin est comblé, c'était ce que j'essayais de dire, non pas que mes quelques lignes étaient mieux que la lib que tu propose, ou bien que la taille de mon projet soit un élément crucial. Personellement je préfère faire mes propres petits trucs que d'inclure plein de librairies qui font plein de trucs, incluant un ptit ptit truc dont j'ai besoin, mais c'est un choix, je n'apportais pas ça comme un argument, c'est mon opinion, c'est tout, et je croyais l'avoir précisé.

Faut pas exagerer non plus ! Je comptais pas révolutionner le monde avec ma classe ! J'ai fait une petite classe qui en quelque ligne était pratique, j'ai réutiliser cette classe dans bon nombre de projets, ce qui m'a fait croire qu'elle pourrait être utile a d'autres personnes, je l'ai donc déposer ici. Maintenant si il aurait fallu que je parcours le web a la recherche de la moindre petite librairie existante permettant de pres ou de loin de faire ces quelques lignes avant de poster ici, bah c'est bon je vais garder mes petites classes pratiques pour moi et arrêter d'embeter les gens !

Mais bon si je suis tant dans le tord supprime la cette source tu en a le pouvoir, je n'en garderai pas rancune !
cs_Bidou
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
43 -
Cette librairie peut faire beaucoup plus de chose que tes quelques lignes... c'est extensible, bien programmé, probablement pas ou peu de bug car utilisé par énormément de personne: y'a aucune raison de s'en priver.

L'argument que tu mentionnes n'est pas valable. Depuis quand la taille d'un projet joue un rôle (surtout quand on sait quand le framework .NET lui-même fait plus de 20Mo)?
ricklekebekoi
Messages postés
303
Date d'inscription
mardi 11 février 2003
Statut
Membre
Dernière intervention
24 avril 2009
4 -
Personnelement quand j'ai besoin d'un petit truc minsucule comme cela je suis rétiscent a faire suivre une DLL a mon projet seulement pour quelques lignes de code. Mais ça c'est mon avis sur la question ^^

Merci pour le lien, je ne connaissais pas, mais je préfere de loin ma ptite classe simple ;)
cs_Bidou
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
43 -
Mouais, pas sûr que ce genre de code soit réellement utile!
Pourquoi réinventer la roue? log4net convient très bien pour ceci, gratuit et open source.

http://logging.apache.org/log4net/index.html

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.