2009-12-21 3 views
0

J'ai une bibliothèque de frameworks qui ferait beaucoup de choses y compris la journalisation. Nous utilisons log4net pour la journalisation. Ce cadre a la classe d'enregistrement statique LogManager, une instance statique de ILog (enregistreur) et des méthodes statiques pour la connexion INFO, AVERTISSEMENT, DEBUG etc.Connexion log4net à partir de l'application Web

L'enregistreur d'instance statique est s'initialisé comme ceci:

public static class LogManager 
{   
    private static ILog Logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 

    static ActivityLogManager() 
    { 

    } 

    public static void LogDebugy(string message, params object[] messageParameters) 
    { 
     // Log the message here 
    } 
} 

J'ai mes propres doutes si c'est la bonne façon de le faire. Je vois de here que chaque classe qui doit se connecter, doit déclarer une instance statique de ILog.

Aussi, je vois que je devrais spécifier le fichier de configuration Log4net dans mon projet de cadre pour se connecter. Je pensais lire here que la config serait récupérée à partir de l'assemblage en cours d'exécution, mais je ne le vois pas arriver.

Est-il possible de faire ma journalisation à partir de ma classe de structure avec la configuration récupérée depuis mon application Web (pour mon application Web) ou un autre projet de bibliothèque d'entreprise (pour mes bibliothèques de classe affaires)? Je voudrais également ajouter quelques informations personnalisées dans mon journal (comme l'ID d'objet métier personnalisé, le pool d'applications, ServerName, ClientHostName, ClientBrowser, ClientOS, Client User, etc.). C'est possible?

J'utilise AdoNetAppender.

Édition1: J'utilise log4net.Config.XmlConfigurator(ConfigFile = @"log4net.config", Watch = true) dans mon assembly.cs pour pointer vers le fichier de configuration log4net.

Édition2: Mon ILog Logger est dans ma classe LogManager, donc une seule instance est générée pour mon application.

+0

Habituellement, chaque classe qui doit enregistrer quelque chose a ses propres instances ILog, de préférence avec un nom qui indique une sorte de hiearchy (Namespace + Type est commun.) Cela permet de filtrer les messages. NHibernate fait cela, ce qui vous permet, par exemple, de filtrer les messages de certaines sous-bibliothèques et de vider toutes les requêtes SQL (qui sont généralement enregistrées dans DEBUG). – Skurmedel

Répondre

2

Beaucoup de questions, mais au sujet de la première question, j'utilise ce style pour l'enregistreur:

private static ILog Log = LogManager.GetLogger(typeof(MyClass)); 

Bien sûr, vous pouvez nommer la variable que vous voulez, mais cela est recommandé par l'équipe de log4net Je pense que , car il en résulte une seule instance ILog par instance de votre classe.

Ceci est plus ou moins ce que vous faites déjà donc rien à craindre là-bas. Je ne suis pas sûr pourquoi vous allez le long chemin à travers la méthode d'exécution si.

Je place généralement la configuration dans Web.config ou App.config. Je ne pouvais pas déduire si vous utilisez l'un de ces pour config. Si vous les utilisez, c'est simple. Vous venez d'ajouter une section configuration pour log4net et d'ajouter les enregistreurs, appenders et filtres dont vous avez besoin.

Si vous souhaitez enregistrer des données personnalisées vous pouvez l'ajouter dans le journal message, par exemple:

Log.WarnFormat(
    "Reactor malfunction, temperature {0} celsius." 
    + "Evacuate sector {1} immediately", 
    temp, 
    sector); 

Ou si les valeurs nécessaires sont stockées dans un objet, vous pouvez faire un « renderer » pour ce type, qui sera imprimé lors de la remise de l'objet en tant que message de journalisation, par exemple Log.Warn(myObjWithCustomFormatting).

Un moteur de rendu d'objet doit dériver de IObjectRenderer et l'enregistrer dans la configuration.

+0

J'utilise ce qui précède mais avec System.Reflection.Methodbase.GetCurrentMethod(). DeclaringType() pour obtenir automatiquement le type de la classe. Puisque ceci se produit seulement quand le constructeur est appelé son assez bon marché. – GrayWizardx

+0

Je vois ce que tu veux dire. Une question de préférence, je suppose. – Skurmedel

+0

Merci Skurmedal: Je n'utilise pas web.config ou app.config, j'utilise assembly.cs (voir mon Edit). Aussi, je ne parle pas de format, quand je veux dire que je veux enregistrer des objets personnalisés. Je vois qu'utiliser InfoFormat ou WarnFormat l'enregistre dans ma colonne DB -message. Je voudrais créer une colonne personnalisée dans DB et stocker quelques informations personnalisées – ram

1

Nous utilisons log4net dans un certain nombre de nos webapps et ils vont bien.Une configuration spéciale doit être effectuée si vous souhaitez vous connecter au journal des événements à partir d'une application web, et cela dépend de la version de Windows que vous utilisez. En bref, vous devez autoriser l'utilisateur en cours à écrire dans le journal des événements. Sous Win 7, 2008 etc, vous devez accorder l'autorisation de l'ensemble de la branche, tous les autres sont juste l'app-log spécifique.

Si vous souhaitez vous connecter à un fichier, assurez-vous simplement que le fichier se trouve dans le répertoire des applications et que tout devrait bien se passer.

Si vous ne déclarez pas la configuration pour la journalisation dans votre structure de journal, mais que vous la retardez jusqu'à ce que votre application l'appelle, cela se produira par défaut avec la section de configuration log4net. Si elle est chargée plus tôt que non, la première version chargée sera utilisée, à moins que vous ne la surchargiez de code.