是否有任何变量可以用来命名我的日志文件?
<file value="${ALLUSERSPROFILE}\${AssemblyName}.log.xml" />
在哪
${ALLUSERSPROFILE}
${AssemblyName}
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));
omhiaaxx2#
不是默认的。此语法用于扩展Windows Environment Variables。虽然ALLUSERSPROFILE是一个标准的环境变量,但AssemblyName不是。您必须自己设置AssemblyName,作为一个动态解决方案,这并不容易。
ALLUSERSPROFILE
AssemblyName
m0rkklqb3#
NLog中的processname类似于log 4 net中的PatternLayout;它们都是日志本身的布局/呈现的一部分。如果你想在你的应用程序中使用一个环境变量,可以在安装过程中强制创建,也可以在你的代码中创建你自己的环境变量;C#的例子是here。如果该选项不适合您的需要,那么您可以动态设置路径,如here所示。
ioekq8ef4#
您可以编写自己的图案布局转换器。我在这里发布了一个示例,我认为很容易修改它,以便它写入程序集名称。..
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
5条答案
按热度按时间dgenwo3n1#
正如其他人所说的,assemblyname没有内置的占位符,有几种方法可以实现它。另一种方法是在Log 4 Net框架中注册自己的处理程序/转换器。
基本上,您在内部执行的操作与log4net.Util.PatternString类相同(您可以查看相关的源代码,以获得比下面给出的片段更完整的“示例”)。
示例:
然后代码:
然后提供匹配的“转换器类”。
最后,让Log 4 Net框架知道你的转换器:
omhiaaxx2#
不是默认的。
此语法用于扩展Windows Environment Variables。虽然
ALLUSERSPROFILE
是一个标准的环境变量,但AssemblyName
不是。您必须自己设置AssemblyName
,作为一个动态解决方案,这并不容易。m0rkklqb3#
NLog中的processname类似于log 4 net中的PatternLayout;它们都是日志本身的布局/呈现的一部分。
如果你想在你的应用程序中使用一个环境变量,可以在安装过程中强制创建,也可以在你的代码中创建你自己的环境变量;C#的例子是here。
如果该选项不适合您的需要,那么您可以动态设置路径,如here所示。
ioekq8ef4#
您可以编写自己的图案布局转换器。我在这里发布了一个示例,我认为很容易修改它,以便它写入程序集名称。..
qnzebej05#
另一个选项是在初始化时定义一个全局属性:
在你的配置文件中,你可以像这样使用“pid”属性:
霍普我说得很清楚
br++mabra