8

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

也就是说,如果在log4net.config中定义了以下附加程序:

<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 (不将log4net.config解析为纯 XML)。

有没有人有想法来拉这个把戏?

先感谢您。

4

4 回答 4

2

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

可以通过几种不同的方式访问 appender。

  1. 如果您已经有一个ILogger实例(例如,您从中获得了什么LogManager.GetLogger()),那么它上面就有一个Appenders属性。这将为您提供与该特定级别的日志记录层次结构关联的任何附加程序。
  2. 您还可以调用LogManager.GetRepository()以获取Heirarchy包含整个 logger 和 appender 层次结构的对象。该方法需要一个程序集,因此通过GetCallingAssembly()获取默认程序集。这个类有一个GetAppenders()方法可以返回所有配置的 appender,尽管它不会告诉你哪些与哪些 loggers 相关联。

从那里,只需查找正确类型的附加程序(例如FileAppenderor RollingFileAppender),然后读取它的File属性。

于 2012-09-08T22:40:31.000 回答
1

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();
于 2015-01-19T16:17:08.847 回答
0

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

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

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

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

于 2012-09-10T18:53:54.167 回答
0

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

((log4net.Appender.FileAppender) ((log4net.Appender.IAppender[])
            ( (log4net.Repository.Hierarchy.Logger)
                log.Logger).Appenders.SyncRoot)[0]).File
于 2017-12-06T09:00:34.620 回答