如何以编程方式获取log4net日志文件的名称模式?

时间:2012-09-08 22:10:38

标签: c# log4net

我正在尝试编写一个C#代码,它通过log4net API在运行时检索 log4net 日志文件的名称模式。

也就是说,如果在 log4net.config 中定义了以下appender:

<appender name="MyAppender" type="log4net.Appender.RollingFileAppender">
  <file type="log4net.Util.PatternString" value="%date{yyyy}\%date{MM}\%date{dd}\%property{Id}.log" />
  <appendToFile value="true" />
  <rollingStyle value="Size" />
  <maxSizeRollBackups value="16" />
  <maximumFileSize value="1MB" />
  <staticLogFileName value="true" />
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%message%newline" />
  </layout>
</appender>

我想在代码中的字符串变量中获取%date {yyyy} \%date {MM} \%date {dd} \%property {Id} .log (不解析< em> log4net.config 作为纯XML)。

有没有人有想法来解决这个问题?

提前谢谢。

4 个答案:

答案 0 :(得分:2)

此模式的值将位于File实例的FileAppender属性中,该实例是日志存储库的一部分。

进入追随者可以通过几种不同的方式完成。

  1. 如果您已有ILogger个实例(例如,您从LogManager.GetLogger()获得的内容),那么就会有一个Appenders属性。这将为您提供与日志记录层次结构相关联的任何追加器。
  2. 您还可以调用LogManager.GetRepository()来获取包含整个记录器和appender层次结构的Heirarchy对象。该方法需要一个程序集,因此传递GetCallingAssembly()以获取默认值。该类有一个GetAppenders()方法,它返回所有已配置的appender,但它不会告诉你哪些与哪些记录器相关联。
  3. 从那里,只需查看正确类型的追加者(例如FileAppenderRollingFileAppender),然后阅读它的File属性。

答案 1 :(得分:0)

我认为您想要子类化RollingFileAppender,并在配置文件中使用您的子类,而不是基类。确保在classname前面加上完整的命名空间,以便log4net可以找到它。

我的代码中只有一个UDPAppender子类。我添加了这样的覆盖:

    public override void ActivateOptions()
    {
        base.ActivateOptions();
    }

当我在基类调用之前打破时,我在本地窗口中检查了'this'并看到了UDPAppender'成员'的值。

答案 2 :(得分:0)

Michael Edenfield的解释很好。在这里实现。

private static readonly ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

string fileName = ((RollingFileAppender)log.Logger.Repository.GetCurrentLoggers()
    .Where(e => e.Name == "Your namespace.class").ToList()[0]
    .Repository.GetAppenders()
    .Where(e => e.Name == "MyAppender").ToList()[0]).File.ToString();

答案 3 :(得分:0)

我可以使用以下代码获取<file value>的值:

((log4net.Appender.FileAppender) ((log4net.Appender.IAppender[])
            ( (log4net.Repository.Hierarchy.Logger)
                log.Logger).Appenders.SyncRoot)[0]).File