在C#中获取log4net日志文件

Car*_*rlo 59 .net c# log4net

这是我对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>
Run Code Online (Sandbox Code Playgroud)

在C#中,我试图获取日志文件的名称(即MyLog.log).我用Google搜索并尝试了很多东西,但未能这样做.有帮助吗?

谢谢!

Yak*_*een 96

在您的情况下解决方案非常简单; 只需使用此代码:

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

string filename = rootAppender != null ? rootAppender.File : string.Empty;
Run Code Online (Sandbox Code Playgroud)

  • 我使用了相同的.但是(FileAppender)((log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository()).Root没有上面解决方案中指定的Appender数组.有任何想法吗 ??? (2认同)
  • 使用log4net; 使用log4net.Appender; 使用log4net.Repository.Hierarchy; (2认同)

fal*_*aff 28

拥有多个文件追加程序时,您可能希望按名称获取它们.另外,为了确保获取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;
}
Run Code Online (Sandbox Code Playgroud)

  • 我会改变的唯一的事情就是使用`rootAppender?.File?string.Empty`(该C#6**[ '猫王' 操作符(https://csharp.today/c-6-features-null-conditional-and-and-null-coalescing-operators/))**代替`的rootAppender!= NULL?rootAppender.File:string.Empty`,它更短. (5认同)
  • **这需要更多的投票!**简短,优雅,并允许按名称选择其中一个appender.大多数其他的解决方案我在这里看到的只是挑一号的appender这并不总是正确的.根据问题,您将使用`GetLogFileName("MyLogger")` (4认同)

小智 9

因为我已经在类中定义了一个记录器,所以我只使用它.需要注意的一点是,可能有多个appender,通常第一个是控制台(没有文件).这是我的价值所在的解决方案.

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

}