2011-01-06 1 views
11

Je souhaite implémenter la fonction de journalisation dans une bibliothèque de classes, elle-même référencée dans un service Web. J'ai essayé d'ajouter app.config et j'ai tout fait, mais il semble que lorsqu'une exception est levée, log4net ne fait rien.Comment inclure log4net dans une bibliothèque de classes?

mon app.config

<configSections> 
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> 
    </configSections> 
    <log4net> 
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender"> 
     <file value="D:\\mylogfile.txt" /> 
     <appendToFile value="true" /> 
     <rollingStyle value="Size" /> 
     <maxSizeRollBackups value="5" /> 
     <maximumFileSize value="10MB" /> 
     <staticLogFileName value="true" /> 
     <filter type="log4net.Filter.StringMatchFilter"> 
     <stringToMatch value="test" /> 
     </filter> 
     <filter type="log4net.Filter.StringMatchFilter"> 
     <stringToMatch value="error" /> 
     </filter> 
     <filter type="log4net.Filter.DenyAllFilter" /> 
     <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date [%thread] %level %logger - %message%newline%exception" /> 
     </layout> 
    </appender> 
    <root> 
     <level value="INFO"/> 
     <appender-ref ref="RollingFileAppender"/> 
     <appender-ref ref="ConsoleAppender" /> 
    </root> 
    </log4net> 

dans AssemblyInfo.cs:

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "app.config")] 

dans LogManager.cs:

private static readonly ILog Log = log4net.LogManager.GetLogger 
      (MethodBase.GetCurrentMethod().DeclaringType); 
public static void WriteLog(Exception ex) 
{ 
    Log.Error(ex); 
} 

Pouvez-vous s'il vous plaît me dire ce qui ne va pas? Comment puis-je faire fonctionner log4net pour ma bibliothèque de classes?

Merci

+0

Comment le code ressemble-t-il à l'endroit où vous appelez le WriteLog? –

+0

btw, avez-vous essayé de définir votre niveau sur root à ALL, et essayez de supprimer tous ces filtres sur votre RollingFileAppender. –

+0

@Pauli: J'ai essayé comme vous l'avez suggéré, cela ne fonctionnait toujours pas :) – Vimvq1987

Répondre

1

S'il vous plaît voir ma réponse à la question suivante:

Use log4net in SDK

Il a une routine de configuration de journal qui construira un chemin complet vers un fichier de configuration log4net. Comme vous êtes dans un webservice, je ne cherche pas où vous attendez "app.config".

Assurez-vous également que vous avez l'autorisation d'écrire dans "D: \ mylogfile.txt" à partir de votre service Web.

+0

Bien que ce lien puisse répondre à la question, il est préférable d'inclure les parties essentielles de la réponse ici et fournir le lien pour référence. Les réponses à lien uniquement peuvent devenir invalides si la page liée change. - [À revoir] (/ review/low-quality-posts/17881155) –

6

Lors de l'exécution, le fichier de configuration est toujours utilisé à partir de l'application hôte, sauf indication contraire. Ici, dans le cas, web.config est utilisé non app.cofig. Mentionnez plutôt un autre nom de fichier de configuration personnalisé et assurez-vous que le fichier est copié dans le répertoire virtuel du service Web. Aussi, comme dit chibacity, assurer l'autorisation sur le fichier journal. Mieux vaut le conserver dans le dossier app_data pour l'hôte du service Web.

3

Vous pouvez utiliser une sorte d'injection, soit vous construire un simple comme:

public interface ILogger 
{ 
    void LogInfo(string message); 
     . 
     . 
     . 
} 

Et vous injecter quelque chose qui correspond à cette interface, comme une enveloppe pour log4net ou tel. Mais, je pense que la chose la plus correcte est de ne pas se connecter à la bibliothèque de classes. Pourquoi je pense que oui parce que la bibliothèque elle-même n'est pas l'application, votre service Web est ainsi votre service Web devrait décider ce qu'il faut se connecter. Si vous souhaitez enregistrer des exceptions, ne les capturez pas dans la bibliothèque de classes et laissez votre service Web gérer la journalisation. Cela facilitera également la centralisation de la journalisation.

+0

@Thomas Je suis d'accord re. en utilisant une abstraction, mais il existe de nombreuses bonnes raisons pour lesquelles vous souhaiterez peut-être qu'une bibliothèque se connecte, par ex.Diagnostic et audit. Si quelque chose ne va pas dans la bibliothèque, avoir des diagnostics qui peuvent être activés est une bonne chose. –

+0

@chibacity: Mon nom est Tomas pas Thomas;). Sauf que je suis d'accord avec vous sur ce point, mais je pense que cela devrait être le moins possible. Si quelque chose ne va pas dans la bibliothèque, l'exception devrait indiquer, et cela pourrait être enregistré plus haut dans la pile. Dans un monde idéal, une bibliothèque devrait être une tierce partie (mais vous pouvez être la troisième partie aussi) qui devrait être "fait". Ou parlez-vous d'autres "erreurs"? Erreurs qui ne lancent pas d'exceptions? –

+0

Désolé pour le nom orthographe :) Je fais référence à des informations qui peuvent aider à analyser les problèmes qui ne conduisent pas à des exceptions. Même dans les cas où il y a des exceptions, il est souvent utile d'avoir des informations de diagnostic pour voir les conditions qui mènent à une erreur. Cela peut être d'une importance particulière dans la production où le logiciel peut être utilisé de manière cruelle et inhabituelle;) –

Questions connexes