Get log4net log file in C #

This is my configuration for 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> 

In C #, I'm trying to get the log file name (this is MyLog.log). I googled and tried many things but did not. Any help?

Thank!

+56
c # log4net
Aug 27 '09 at 21:08
source share
7 answers

The solution is pretty easy in your situation; just use this code:

 var rootAppender = ((Hierarchy)LogManager.GetRepository()) .Root.Appenders.OfType<FileAppender>() .FirstOrDefault(); string filename = rootAppender != null ? rootAppender.File : string.Empty; 
+91
Aug 27 '09 at 21:45
source share

If you have multiple file applications, you can get them by name. In addition, to get the application, even if the root of the node does not refer to it, the following code helps:

 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; } 
+24
May 25 '15 at 11:39
source share

Since I already had a magazine defined in the class, I just used it. One thing to be aware of is that there can be more than one application, and often the first one is the console (which does not have a file). Here is my decision for what it is worth.

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

}

+7
Aug 6 '14 at 19:06
source share

If your config does not have a <root> node, the above solution will not work for you. Read more.

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

This returns the log file:

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

(Hopefully) crash-proof version:

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

Finally, if you are stuck in log4net, add this to the <appSettings> section:

 <add key="log4net.Internal.Debug" value="true"/> 
0
Feb 26 '14 at 2:56
source share
  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 
0
Feb 05 '15 at 9:08
source share
 ((log4net.Appender.FileAppender)(_log.Logger.Repository.GetAppenders())[0]).File 
0
Jun 26 '18 at 22:15
source share

I did not find the code above works. It worked for me

 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 
-one
Jan 14 '14 at 17:24
source share



All Articles