【问题标题】:Can I parameterize the type name of a log4net Appender in the app.config?我可以在 app.config 中参数化 log4net Appender 的类型名称吗?
【发布时间】:2011-12-15 15:17:27
【问题描述】:

我在控制台应用程序中使用 log4net。我的配置文件允许我从输入中获取文件名:

配置文件:

<appender name="CustomRollingFileAppender" type="MyApp.UTIL.CustomRollingFileAppender">
      <threshold value="ALL"/>
      <param name="file" value=""/>
      <param name="appendToFile" value="false"/>
      <param name="maximumFileSize" value="20000KB"/>
      <param name="maxSizeRollBackups" value="200"/>
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%-5.5level] %logger - %message%newline"/>
      </layout>
</appender>

覆盖文件参数:

namespace ConsoleApplicationTemplate.UTIL
{
    public class CustomRollingFileAppender : log4net.Appender.RollingFileAppender
    {
        public override string File
        {
            get { return base.File; }
            set
            {
                //Filename string taken as Input
                base.File = Program.options.LogFile; 
            }
        }
    }    
}

这就像一个魅力,但我需要更改标签 appender 内的参数 type。我四处搜索,发现我可以在配置文件中使用属性。所以我修改了我的配置文件如下:

<appender name="CustomRollingFileAppender" type="%property{ApplicationName}.UTIL.CustomRollingFileAppender">
      <threshold value="ALL"/>
      <param name="file" value=""/>
      <param name="appendToFile" value="false"/>
      <param name="maximumFileSize" value="20000KB"/>
      <param name="maxSizeRollBackups" value="200"/>
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%-5.5level] %logger - %message%newline"/>
      </layout>
</appender>

我还需要更改属性值如下:

log4net.GlobalContext.Properties["ApplicationName"] = Assembly.GetExecutingAssembly().GetName().Name;
private static log4net.ILog _logger = LogManager.GetLogger(typeof(Program));
log4net.Config.XmlConfigurator.Configure();

当 log4net 读取配置文件时,我收到以下错误(不会引发异常):

log4net:ERROR Could not create Appender [CustomRollingFileAppender] of type [%property{ApplicationName}.UTIL.CustomRollingFileAppender]. Reported error follows.
System.TypeLoadException: Could not load type [%property{ApplicationName}.UTIL.CustomRollingFileAppender]. Tried assembly [log4net, Version=1.2.11.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a] and all loaded assemblies 
    at log4net.Util.SystemInfo.GetTypeFromString(Assembly relativeAssembly, String typeName, Boolean throwOnError, Boolean ignoreCase)
    at log4net.Util.SystemInfo.GetTypeFromString(String typeName, Boolean throwOnError, Boolean ignoreCase) 
    at log4net.Repository.Hierarchy.XmlHierarchyConfigurator.ParseAppender(XmlEle
    ment appenderElement)

【问题讨论】:

  • 我不认为 type 属性允许参数。但我想不出你为什么要参数化它的原因。你能澄清一下你想要达到的目标吗?
  • 我想对其进行参数化,因为我想制作一个嵌入 log4net 的控制台应用程序模板。
  • 作为 log4net 参数化的替代方案,您可以使用 Visual Studio 模板系统将相关名称放入配置文件中吗?
  • 这也是一种方法。我必须深入研究 VS2010 模板,因为目前我对模板变量没有经验。
  • @Clafou,看来你的两个 cmets 是一个答案。您应该发布此建议。我同意这是不可能的。

标签: c# .net visual-studio logging log4net


【解决方案1】:

恐怕答案是否定的:与其他一些 log4net 配置元素不同,appender 元素的 type 属性不支持参数。

正如您问题的 cmets 中所讨论的那样,由于您要实现的是制作一个提供其自己的 log4net appender 类型的 Visual Studio 项目模板,因此解决方案是利用 Visual Studio 模板系统编写.config 文件中的相关属性值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    • 2011-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-02
    • 1970-01-01
    相关资源
    最近更新 更多