2009-08-27 8 views
46

Voici ma configuration pour log4net:Get fichier log4net journal en C#

<log4net> 
    <appender name="MyLogger" type="log4net.Appender.RollingFileAppender"> 
     <file value="MyLog.log" /> 
     <appendToFile value="true" /> 
     <rollingStyle value="Size"/> 
     <maxSizeRollBackups value="20"/> 
     <maximumFileSize value="1000KB"/> 
     <layout type="log4net.Layout.PatternLayout"> 
      <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss},%p,%m%n" /> 
     </layout> 
    </appender> 
    <root> 
     <level value="DEBUG" /> 
     <appender-ref ref="MyLogger" /> 
    </root> 
</log4net> 

En C# Je suis en train d'obtenir le nom du fichier journal (qui est MyLog.log). J'ai googlé et essayé beaucoup de choses mais je n'ai pas réussi à le faire. De l'aide?

Merci!

+0

Voulez-vous dire que vous essayez d'analyser le fichier de configuration log4net dans une tentative pour obtenir le nom du fichier auquel vous vous connectez? La question ne le précise pas. Qu'est-ce que vous essayez exactement de faire, et quel est le problème? –

+0

J'essaie d'obtenir cette partie de la configuration "", j'essaie de m'éloigner de l'analyse moi-même (pour l'instant), parce que je pense que asp4net peut avoir de manière à le faire, seulement je ne peux pas le trouver. Sinon, je vais devoir faire l'analyse moi-même. – Carlo

Répondre

78

La solution est assez facile dans votre situation; il suffit d'utiliser ce code:

var rootAppender = ((Hierarchy)LogManager.GetRepository()) 
             .Root.Appenders.OfType<FileAppender>() 
             .FirstOrDefault(); 

string filename = rootAppender != null ? rootAppender.File : string.Empty; 
+0

A travaillé comme un charme. Merci! – Carlo

+1

j'ai utilisé la même chose. mais (FileAppender) ((log4net.Repository.Hierarchy.Hierarchy) LogManager.GetRepository()). Root n'a pas un tableau d'Appenders comme spécifié dans la solution ci-dessus. Des idées ??? – Sandeep

+0

user762730 avez-vous configuré la journalisation? Il n'y a pas d'appender si ce n'est pas le cas ... – Yakeen

-1

Je n'ai pas trouvé le code ci-dessus fonctionnant. Cela a fonctionné pour moi

var filename= ((log4net.Appender.FileAppender)(((log4net.Appender.IAppender[])((((((log4net.Repository.Hierarchy.Hierarchy)((((log4net.Core.LoggerWrapperImpl)(log)).Logger).Repository)).Root).Hierarchy.Root).Appenders).SyncRoot))[0])).File

+12

Wow ... ce code a l'air vraiment compliqué!Je me méfie immédiatement du code qui ressemble à ça. –

+0

où ce 'log' vient de cette partie' (log4net.Core.LoggerWrapperImpl) (log) '? –

0

Si votre config ne dispose pas d'un nœud racine < > alors la solution ci-dessus ne fonctionnera pas pour vous. Continuer à lire.

<log4net> 
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender"> 
    <file value="${LOCALAPPDATA}\Anonymous.log" /> 
    <appendToFile value="true" /> 
    <rollingStyle value="Size" /> 
    <maxSizeRollBackups value="10" /> 
    <maximumFileSize value="2000KB" /> 
    <staticLogFileName value="true" /> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> 
    </layout> 
    </appender> 
    <logger name="AnonymousLog"> 
    <level value="All" /> 
    <appender-ref ref="RollingFileAppender" /> 
    </logger> 
</log4net> 

Cette récupère le fichier journal:

string path = path = (LogManager.GetCurrentLoggers()[0].Logger.Repository.GetAppenders()[0] as FileAppender).File; 

Le (je l'espère) version anti-crash:

string path = null; 
if (LogManager.GetCurrentLoggers().Length > 0 && LogManager.GetCurrentLoggers()[0].Logger.Repository.GetAppenders().Length > 0) 
{ 
    path = (LogManager.GetCurrentLoggers()[0].Logger.Repository.GetAppenders()[0] as FileAppender).File; 
} 

Enfin, si vous êtes coincé avec log4net ajouter à votre <appsettings> section:

<add key="log4net.Internal.Debug" value="true"/> 
6

Comme j'avais déjà un logger défini dans la classe, je l'ai juste utilisé. Une chose à savoir est qu'il peut y avoir plus d'un appender et souvent le premier est la console (qui n'a pas de fichier). Voici ma solution pour ce que ça vaut.

using log4net; 
using log4net.Appender; 
using log4net.Repository; 

namespace MyNameSpace { 
public class MyClass { 

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

    public String GetLogFileName() { 

     String filename = null; 

     IAppender[] appenders = logger.Logger.Repository.GetAppenders(); 
     // Check each appender this logger has 
     foreach (IAppender appender in appenders) { 
      Type t = appender.GetType(); 
      // Get the file name from the first FileAppender found and return 
      if (t.Equals(typeof(FileAppender)) || t.Equals(typeof(RollingFileAppender))) { 
       filename = ((FileAppender)appender).File; 
       break; 
      } 
     } 
     return filename; 
    } 
} 

}

+0

J'aime celui-ci avec quelques ajustements pour rechercher un appender/logger particulier .. –

0
 String filename = null; 

     Hierarchy hierarchy = LogManager.GetRepository() as Hierarchy; 
     Logger logger = hierarchy.Root; 

     IAppender[] appenders = logger.Repository.GetAppenders(); 

     // Check each appender this logger has 
     foreach (IAppender appender in appenders) 
     { 
      Type t = appender.GetType(); 
      // Get the file name from the first FileAppender found and return 
      if (t.Equals(typeof(FileAppender)) || t.Equals(typeof(RollingFileAppender))) 
      { 
       filename = ((FileAppender)appender).File; 
       break; 
      } 
     } 

     System.Diagnostics.Process.Start(filename); //for example, open file in notepad 
12

Lorsque ayant appenders plusieurs fichiers, vous pouvez les obtenir par son nom. Aussi assurez-vous d'obtenir le appender même si elle n'est pas référencé par le noeud racine, le code suivant aide:

public static string GetLogFileName(string name) 
{ 
    var rootAppender = LogManager.GetRepository() 
            .GetAppenders() 
            .OfType<FileAppender>() 
            .FirstOrDefault(fa => fa.Name == name); 

    return rootAppender != null ? rootAppender.File : string.Empty; 
} 
+1

** Cela nécessite plus de votes! ** Court, élégant et permettant de choisir l'un des appenders par son nom. La plupart des autres solutions que j'ai vues ici choisissent juste le 1er appender qui n'est pas toujours correct. Selon la question que vous utiliseriez 'GetLogFileName (" MyLogger ")' – Matt

+2

La seule chose que je changerais est d'utiliser 'rootAppender? .File ?? string.Empty' (l'opérateur C# 6 ** ['Elvis'] (https://csharp.today/c-6-features-null-conditional-and-and-null-coalescing-operators/)) ** à la place de 'rootAppender! = null? rootAppender.File: string.Empty', qui est plus court. – Matt

Questions connexes