68 votes

Obtenir le fichier journal de log4net en C#

Voici ma configuration pour log4net :

<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#, j'essaie d'obtenir le nom du fichier journal (qui est MyLog.log). J'ai fait des recherches sur Internet et essayé de nombreuses choses, mais je n'y suis pas parvenu. Vous pouvez m'aider ?

Gracias.

0 votes

Voulez-vous dire que vous essayez d'analyser le fichier de configuration de log4net afin d'obtenir le nom du fichier vers lequel vous vous connectez ? La question n'est pas claire. Qu'est-ce que vous essayez de faire exactement, et quel est le problème ?

0 votes

J'essaie d'obtenir cette partie de la configuration "<file value="MyLog.log" />", j'essaie d'éviter de l'analyser moi-même (pour l'instant), parce que je pense qu'asp4net peut avoir un moyen intégré de le faire, mais je ne peux pas le trouver. Si ce n'est pas le cas, je devrai faire l'analyse syntaxique moi-même.

103voto

Yakeen Points 997

La solution est assez simple dans votre cas ; il suffit d'utiliser ce code :

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

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

2 votes

J'ai utilisé la même chose. Mais (FileAppender)((log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository()).Root n'a pas de tableau d'Appenders comme spécifié dans la solution ci-dessus. Une idée ?

1 votes

Quelle est la classe "Hiérarchie" et de quelle référence et espace de nom ai-je besoin pour l'utiliser ?

2 votes

Using log4net ; using log4net.Appender ; using log4net.Repository.Hierarchy ;

35voto

falstaff Points 572

Lorsque vous disposez de plusieurs appenders de fichiers, vous pouvez souhaiter les récupérer par nom. De plus, pour être sûr de récupérer l'appender même s'il n'est pas référencé par le noeud racine, le code suivant est utile :

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;
}

4 votes

Il faut plus de votes ! Court, élégant et permettant de choisir l'un des appentis par son nom. La plupart des autres solutions que j'ai vues ici choisissent simplement le premier appender, ce qui n'est pas toujours correct. Selon la question, vous devriez utiliser GetLogFileName("MyLogger")

6 votes

La seule chose que je changerais est d'utiliser rootAppender?.File ?? string.Empty (le C# 6 Opérateur 'Elvis'. ) au lieu de rootAppender != null ? rootAppender.File : string.Empty qui est plus courte.

0 votes

Notez que la valeur de retour est chemin complet du fichier journal

9voto

user3853130 Points 1

Comme j'avais déjà un logger défini dans la classe, je l'ai simplement utilisé. Une chose dont il faut être conscient 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 qu'elle 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 votes

J'aime bien celui-là avec quelques ajustements pour rechercher un appender/logger particulier

1voto

Andrey Prokhorov Points 455
        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

0voto

stevieg Points 63

Si votre configuration ne comporte pas de nœud <Root>, la solution ci-dessus ne fonctionnera pas pour vous. Lisez la suite.

<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>

Cela permet de récupérer le fichier journal :

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

La version (espérons-le) à l'épreuve des accidents :

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 bloqué avec log4net, ajoutez ceci à votre section <appSettings> :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X