2009-08-27 30 views
46

Esta es mi configuración de log4net:Get log4net archivo de registro 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# que estoy tratando de obtener el nombre del archivo de registro (que es MyLog.log). Busqué en Google e intenté muchas cosas pero no lo hice. ¿Alguna ayuda?

Gracias!

+0

¿Quiere decir que usted está tratando de analizar el archivo de configuración de log4net en un intento de obtener la nombre de archivo al que está ingresando? La pregunta no aclara eso. ¿Qué estás tratando de hacer exactamente, y cuál es el problema? –

+0

Estoy tratando de obtener esta parte de la configuración "", estoy tratando de alejarme de analizarlo yo mismo (por ahora), porque creo que asp4net puede tener una base de esta manera, solo yo no puedo encontrarlo. Si no, tendré que hacer el análisis yo mismo. – Carlo

Respuesta

78

La solución es bastante fácil en su situación; solo use este código:

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

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

Funcionó como un encanto. ¡Gracias! – Carlo

+1

usé lo mismo. pero (FileAppender) ((log4net.Repository.Hierarchy.Hierarchy) LogManager.GetRepository()). Root no tiene una matriz de Appenders como se especifica en la solución anterior. Algunas ideas ??? – Sandeep

+0

user762730 ¿ha configurado el registro? No hay appenders si no ... – Yakeen

-1

No encontré el código anterior funcionando. Este trabajado para mí

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 ... ¡ese código parece realmente intrincado!Inmediatamente desconfío del código que se ve así. –

+0

de donde viene este 'log' en esta parte' (log4net.Core.LoggerWrapperImpl) (log) '? –

0

Si su configuración no tiene una raíz > nodo < continuación, la solución anterior no funciona para usted. Sigue leyendo.

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

Esto recupera el archivo de registro:

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

El (esperemos) a prueba de errores Versión:

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

Por último, si se queda atascado con log4net añadir esto a sus <appsettings> sección:

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

Como ya tenía un registrador definido en la clase, lo acabo de usar. Una cosa a tener en cuenta es que puede haber más de un appender y, a menudo, el primero es la consola (que no tiene un archivo). Aquí está mi solución para lo que vale.

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

Me gusta este con algunos ajustes para buscar algún appender/logger en particular ... –

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

Al tener múltiples appenders de archivos, es posible que desee obtener por su nombre. También para asegurarse de obtener el appender aunque no es referenciado por el nodo raíz, el código siguiente ayuda:

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

** ¡Esto necesita más votos! ** Corto, elegante y que permite elegir uno de los appenders por su nombre. La mayoría de las otras soluciones que vi aquí simplemente escogen el primer apéndice, que no siempre es correcto. De acuerdo con la pregunta que usaría 'GetLogFileName (" MyLogger ")' – Matt

+2

Lo único que cambiaría sería usar 'rootAppender? .File ?? string.Empty' (C# 6 ** ['Elvis' operator] (https://csharp.today/c-6-features-null-conditional-and-and-nales-coalescing-operators/)) ** en su lugar de 'rootAppender! = null? rootAppender.File: string.Empty', que es más corto. – Matt

Cuestiones relacionadas