是否有可用于命名我的日志文件的变量?
<file value="${ALLUSERSPROFILE}\${AssemblyName}.log.xml" />
其中
${ALLUSERSPROFILE}
确实有用${AssemblyName}
没有,这是我为了说明我想要的东西而编写的。答案 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)
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