2009-08-27 11 views
46

To jest moja konfiguracja log4net:Get log4net plik dziennika w 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> 

W języku C# Próbuję uzyskać nazwę pliku dziennika (co jest MyLog.log). Szukałem go i próbowałem wielu rzeczy, ale nie udało mi się tego zrobić. Jakaś pomoc?

Dzięki!

+0

Czy mówisz, że próbujesz przeanalizować plik konfiguracyjny log4net, próbując uzyskać nazwa pliku, do którego logujesz się? Pytanie to nie wyjaśnia. Co dokładnie próbujesz zrobić i na czym polega problem? –

+0

Próbuję uzyskać tę część konfiguracji "", próbuję odejść od parsowania go samodzielnie (na razie), ponieważ myślę, że asp4net może mieć zbudowany w drodze do tego, tylko nie mogę go znaleźć. Jeśli nie, sam będę musiał to zrobić. – Carlo

Odpowiedz

78

Rozwiązanie jest dość łatwe w twojej sytuacji; po prostu użyj tego kodu:

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

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

Pracował jak urok. Dzięki! – Carlo

+1

użyłem tego samego. ale (FileAppender) ((log4net.Repository.Hierarchy.Hierarchy) LogManager.GetRepository()). Root nie ma tablicy Appler, jak określono w powyższym rozwiązaniem. Jakieś pomysły ??? – Sandeep

+0

użytkownik762730 skonfigurowałeś rejestrowanie? Nie ma elementów dodających, jeśli nie ... – Yakeen

-1

Nie znalazłem powyższego kodu działa. ten pracował dla mnie

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 ... ten kod wygląda na naprawdę zakręcony!Natychmiast nie ufam kodowi, który wygląda tak. –

+0

gdzie ten "log" pochodzi z tej części '(log4net.Core.LoggerWrapperImpl) (log)'? –

0

Jeśli config nie posiada < korzeń > węzeł to powyższe rozwiązanie nie będzie pracować dla Ciebie. Czytaj.

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

ten pobiera plik dziennika:

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

The (miejmy nadzieję) awaryjnie dowód wersji:

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

Wreszcie, jeśli masz problem z log4net dodać to do <AppSettings> sekcja:

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

Ponieważ miałem już rejestrator zdefiniowany w klasie, właśnie go użyłem. Należy pamiętać, że może istnieć więcej niż jeden aplikant, a często pierwszą jest konsola (która nie ma pliku). Oto moje rozwiązanie dla tego, co jest warte.

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

Podoba mi się ten z pewnym dopasowaniem, aby wyszukać jakiegoś konkretnego appendera/rejestratora .. –

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

Kiedy posiadające wiele appenders plików, możesz je po imieniu. Aby uzyskać dostawcę, nawet jeśli nie jest on przywoływany przez węzeł główny, następujący kod pomaga:

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

** To wymaga więcej głosów! ** Krótkie, eleganckie i pozwalające wybrać jednego z nadawców według nazwy. Większość innych rozwiązań, które tutaj widziałem, wystarczy wybrać pierwszego dostawcę, który nie zawsze jest poprawny. Zgodnie z pytaniem użyjesz 'GetLogFileName (" MyLogger ")' – Matt

+2

Jedyną rzeczą, którą zmienię, jest użycie 'rootAppender? .File ?? string.Empty' (C# 6 ** [operator Elvisa] (https://csharp.today/c-6-features-null-conditional-and-null-coalescing-operators/)) ** zamiast tego z 'rootAppender! = null? rootAppender.File: string.Empty', który jest krótszy. – Matt