如何使用程序集名称命名log4net输出文件?

时间:2011-01-13 18:02:53

标签: .net configuration log4net

是否有可用于命名我的日志文件的变量?

<file value="${ALLUSERSPROFILE}\${AssemblyName}.log.xml" />

其中

  • ${ALLUSERSPROFILE}确实有用
  • ${AssemblyName}没有,这是我为了说明我想要的东西而编写的。

5 个答案:

答案 0 :(得分:3)

正如其他人所说的那样,程序集名称没有内置占位符,无论如何都有几种方法可以实现它。另一个是使用Log4Net框架注册您自己的处理程序/转换器。

基本上,你做的是log4net.Util.PatternString类在内部执行的操作(并且您可能会检查相关的源代码以获得比下面给出的更完整的“示例”)。

示例:

<file value="[ASSEMBLYNAME].log" type="MyExpressionHandler, MyAssembly"/>

然后是代码:

在这里输入代码

using log4net.Core;

public sealed class MyExpressionHandler : IOptionHandler
{
   private string m_str;

   public MyExpressionHandler(string str)
   {
      m_str = str;
   }

   public void ActivateOptions()
   {
   }

   public string Format()
   {
      return m_str.Replace("[ASSEMBLYNAME]", /* ... whatever ... */);
   }
}

然后提供匹配的“转换器类”。

   internal class MyExpressionHandlerConverter : IConvertTo, IConvertFrom
    {
        public bool CanConvertTo(Type targetType)
        {
            return (typeof(string).IsAssignableFrom(targetType));
        }

        public object ConvertTo(object source, Type targetType)
        {
            MyExpression patternString = source as MyExpression;
            if (patternString != null && CanConvertTo(targetType))
            {
                return patternString.Format();
            }
            throw ConversionNotSupportedException.Create(targetType, source);
        }

        public bool CanConvertFrom(System.Type sourceType)
        {
            return (sourceType == typeof(string));
        }

        public object ConvertFrom(object source)
        {
            string str = source as string;
            if (str != null)
            {
                return new MyExpression(str);
            }
            throw ConversionNotSupportedException.Create(typeof(MyExpression), source);
        }
}

最后让Log4Net框架知道您的转换器:

ConverterRegistry.AddConverter(typeof(MyExpression), typeof(MyExpressionConverter));

答案 1 :(得分:1)

默认不是。

此语法用于展开Windows Environment Variables。虽然ALLUSERSPROFILE是标准环境变量,但AssemblyName却不是。{1}}。您必须自己设置AssemblyName,这不是一件容易的动态解决方案。

答案 2 :(得分:0)

NLog中的

processname类似于log4net中的PatternLayout;它们都是日志本身的布局/渲染的一部分。

如果要在应用程序中使用环境变量,请强制创建作为安装的一部分,或者在代码中创建自己的环境变量;一个C#示例是here

如果该选项不符合您的需求,您可以动态设置路径,如here所示。

答案 3 :(得分:0)

您可以编写自己的图案布局转换器。我发布了一个示例here,我认为很容易修改它,以便它编写程序集名称......

答案 4 :(得分:0)

另一个选择是,在初始化时定义全局属性:

GlobalContext.Properties["pid"] = System.Diagnostics.Process.GetCurrentProcess().Id;
this.logger = log4net.GetLogger("LoggerSample");

在配置文件中,您可以使用“pid”属性,如下所示:

<param name="ConversionPattern" value="%d;%property{log4net:HostName};%property{pid};%t;%p;%c;%M;%L;%m%n" />

希望,我很清楚!

BR ++ mabra