【问题标题】:How to name log4net output files with the assembly name?如何用程序集名称命名 log4net 输出文件?
【发布时间】:2011-01-13 18:02:53
【问题描述】:

是否有任何变量可以用来命名我的日志文件?

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

在哪里

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

【问题讨论】:

  • NLog 有一个类似于我想要的变量:${processname}

标签: .net configuration log4net


【解决方案1】:

正如其他人所说,程序集名称没有内置占位符,无论如何都有几种方法可以实现它。另一种是使用 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));

【讨论】:

    【解决方案2】:

    默认情况下不是。

    此语法用于扩展Windows Environment VariablesALLUSERSPROFILE 是标准环境变量,AssemblyName 不是。您必须自己设置AssemblyName,这并不容易\可能作为动态解决方案。

    【讨论】:

      【解决方案3】:

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

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

      如果该选项不适合您的需要,那么您可以动态设置路径,如 here 所示。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

          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++马布拉

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-08-08
            相关资源
            最近更新 更多