在C#中获取log4net日志文件

这是我的log4net的configuration:

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

在C#中,我试图获取日志文件的名称(这是MyLog.log)。 我search了很多东西,但都没有这么做。 任何帮助?

谢谢!

在你的情况下,解决scheme非常简单, 只是使用这个代码:

 var rootAppender = ((Hierarchy)LogManager.GetRepository()) .Root.Appenders.OfType<FileAppender>() .FirstOrDefault(); string filename = rootAppender != null ? rootAppender.File : string.Empty; 

当有多个文件appender,你可能想要得到他们的名字。 另外,要确保获取appender,即使它没有被根节点引用,下面的代码也会帮助:

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

由于我已经有了一个logging器,我只是在类中使用它。 有一件事要注意的是,可能有多个appender,而且第一个是控制台(没有文件)。 这是我的解决scheme,它的价值。

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

}

如果你的configuration没有<root>节点,那么上面的解决scheme将不适合你。 阅读。

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

这将检索日志文件:

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

(希望)防撞版本:

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

最后,如果您遇到log4net,请将其添加到<appSettings>部分:

 <add key="log4net.Internal.Debug" value="true"/> 
  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 

我没有find上面的代码工作。 这对我有效

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