我的网络应用支持多个实例,例如实例1,2,每个实例都通过log4net将数据记录到自己的文件中。那就是我想以编程方式基于实例id将数据记录到不同的文件中。文件路径应为:
D:\ Projects \ Log \ 1 \ Reporting.log,例如1
D:\ Projects \ Log \ 2 \ Reporting.log for instance 2
我的网络应用程序支持3个实例,我是否需要在C#中拥有3个记录器,只有它的日志文件路径不同,如上所示?
下面是Log4Net.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<log4net>
<appender name="ExceptionLogFileAppender" type="log4net.Appender.RollingFileAppender">
<file value=????How to specify this????? />
<appendToFile value="true" />
<rollingStyle value="Date" />
<datePattern value="-yyyy-MM-dd.lo\g" />
<param name="StaticLogFileName" value="false" />
<layout type="log4net.Layout.PatternLayout">
<param name="Header" value="------------------------------------------ " />
<param name="Footer" value="------------------------------------------ " />
<conversionPattern value="%d|[%t]|%-5p|%c|%m%n"/>
</layout>
</appender>
<!-- Setup the root category, add the appenders and set the default level -->
<root>
<level value="ERROR" />
<appender-ref ref="ExceptionLogFileAppender" />
</root>
</log4net>
</configuration>
更新
实例ID必须为1,2等。
将来实例ID将超过100个。
任何想法都会非常感激!
答案 0 :(得分:2)
好吧,我想不出记录每个实例(1,2,3)的方法,但你可以通过它们的PID轻松记录它们。我将<file>
元素更改为:
<file type="log4net.Util.PatternString">
<conversionPattern value="log\%processid\yourFileName.%date{yyyyMMMdd}.log" />
</file>
然后删除应该给出的元素:
<appender name="ExceptionLogFileAppender" type="log4net.Appender.RollingFileAppender">
<file type="log4net.Util.PatternString">
<conversionPattern value="log\%processid\yourFileName.%date{yyyyMMMdd}.log" />
</file>
<appendToFile value="true" />
<rollingStyle value="Date" />
<param name="StaticLogFileName" value="false" />
<layout type="log4net.Layout.PatternLayout">
<param name="Header" value="------------------------------------------ " />
<param name="Footer" value="------------------------------------------ " />
<conversionPattern value="%d|[%t]|%-5p|%c|%m%n"/>
</layout>
</appender>
然后,每个实例都应该根据它的PID进行记录:
c:\log\13242\yourFileName.20111025.log
或者,您可以创建文件名的pid部分而不是其他目录,我可能建议您这样做,以免乱丢c:\ log \文件夹中的多个目录:
<file type="log4net.Util.PatternString">
<conversionPattern value="log\yourFileName.%processid.%date{yyyyMMMdd}.log" />
</file>
这将为您提供以下文件:
c:\log\yourFileName.13142.20111025.log
c:\log\yourFileName.13152.20111025.log
答案 1 :(得分:2)
见this example。基本上,如果实例的数量是可管理且有限的,则可以为每个实例创建一个日志追加器。然后,为每个过滤器添加一个过滤器,并将每个属性的StringToMatch
属性设置为实例ID。
请注意,这不是完全动态的,因为您需要提前指定每个appender。
答案 2 :(得分:1)
这应该有效,这是一项工作,它基于工具包here的答案。
在致电XmlConfigurator.Configure();
之前添加
ConverterRegistry.AddConverter(typeof(InstancePatternString), typeof(InstancePatternStringConverter));
然后将以下类添加到您的解决方案中:
public class InstancePatternString : PatternString
{
public InstancePatternString(string pattern): base(pattern)
{
}
public override void ActivateOptions()
{
AddConverter("cs", typeof(InstancePatternConverter));
base.ActivateOptions();
}
}
public class InstancePatternConverter : PatternConverter
{
override protected void Convert(TextWriter writer, object state)
{
switch(Option)
{
case "instance":
writer.Write(MyContext.Instance);
break;
}
}
}
public class InstancePatternStringConverter : IConvertTo, IConvertFrom
{
public bool CanConvertFrom(Type sourceType)
{
return sourceType == typeof(string);
}
public bool CanConvertTo(Type targetType)
{
return typeof(string).IsAssignableFrom(targetType);
}
public object ConvertFrom(object source)
{
var pattern = source as string;
if (pattern == null)
throw ConversionNotSupportedException.Create(typeof(InstancePatternString), source);
return new InstancePatternString(pattern);
}
public object ConvertTo(object source, Type targetType)
{
var pattern = source as PatternString;
if (pattern == null || !CanConvertTo(targetType))
throw ConversionNotSupportedException.Create(targetType, source);
return pattern.Format();
}
}
请务必在此处将MyContext.Instance
更改为代表您实例的静态可访问属性。
最后从:
更改您的web.config<file value=????How to specify this????? />
为:
<file type="ConsoleApp.InstancePatternString, ConsoleApp" value="%cs{instance}\Reporting.log" />
ConsoleApp是您添加这些类的程序集。这将导致在单独的实例目录中创建日志文件。即1 \ Reporting.log,2 \ Reporting.log等
这种方法的优点是添加将来的属性非常简单,只需要在switch语句中添加一个可在任何未来的日志文件名/位置中使用。
答案 3 :(得分:0)
不完全是文件系统日志解决方案,但是如何记录到数据库表并包含实例详细信息呢?这样可以轻松区分特定于实例的消息,几乎不需要维护,并且可以高度扩展。