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

wqnecbli  于 2023-05-02  发布在  .NET
关注(0)|答案(5)|浏览(112)

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

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

在哪

  • ${ALLUSERSPROFILE}真的有用吗
  • ${AssemblyName}没有,这是我为了说明我想要的东西而编造的。
dgenwo3n

dgenwo3n1#

正如其他人所说的,assemblyname没有内置的占位符,有几种方法可以实现它。另一种方法是在Log 4 Net框架中注册自己的处理程序/转换器。
基本上,您在内部执行的操作与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);
        }
}

最后,让Log 4 Net框架知道你的转换器:

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

omhiaaxx2#

不是默认的。
此语法用于扩展Windows Environment Variables。虽然ALLUSERSPROFILE是一个标准的环境变量,但AssemblyName不是。您必须自己设置AssemblyName,作为一个动态解决方案,这并不容易。

m0rkklqb

m0rkklqb3#

NLog中的processname类似于log 4 net中的PatternLayout;它们都是日志本身的布局/呈现的一部分。
如果你想在你的应用程序中使用一个环境变量,可以在安装过程中强制创建,也可以在你的代码中创建你自己的环境变量;C#的例子是here
如果该选项不适合您的需要,那么您可以动态设置路径,如here所示。

ioekq8ef

ioekq8ef4#

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

qnzebej0

qnzebej05#

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

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

相关问题