我正在尝试为W3C格式的日志创建新的附加器。
我的追加程序布局需要自定义标题。所以,我像这样继承了PatternLayout类:
-b
和我的web.config文件:
using System;
using System.Diagnostics;
using System.Text;
using log4net.Layout;
namespace MyApp.Framework.Logging
{
public class W3CLayout : PatternLayout
{
public override string Header
{
get { return buildW3CLogHeader(); }
set { }
}
private string buildW3CLogHeader()
{
var header = new StringBuilder();
header.AppendLine("#Software: " + ConfigurationSettings.ProductName + " " + ConfigurationSettings.Product + " " + ConfigurationSettings.Version);
header.AppendLine("#Version: 1.0 // Reference: http://www.w3.org/TR/WD-logfile");
header.AppendLine("#Date: " + DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss"));
header.AppendLine("#Fields: date time cs-host cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs(User-Agent) cs(Referer) sc-status time-taken");
return header.ToString();
}
}
}
我遇到的问题是,程序在程序中像下面这样调用... the rest of the web.config ...
<log4net>
<appender name="ServicesLogAppender" type="MyApp.Framework.Logging.ConsumerLoggingAppender, MyApp.Framework">
<param name="File" value="web-services.log" />
<param name="MaximumFileSize" value="20MB" />
<param name="MaxSizeRollBackups" value="3" />
<param name="StaticLogFileName" value="false" />
<param name="Threshold" value="ALL" />
<param name="RollingStyle" value="Size" />
<param name="appendToFile" value="true" />
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread,%a] %-5level %logger - %message%newline" />
</layout>
</appender>
<appender name="OutgoingServicesLogAppender" type="MyApp.Framework.Logging.ConsumerLoggingAppender, MyApp.Framework">
<param name="File" value="outgoing-web-services.log" />
<param name="MaximumFileSize" value="21MB" />
<param name="MaxSizeRollBackups" value="3" />
<param name="StaticLogFileName" value="false" />
<param name="Threshold" value="ALL" />
<param name="RollingStyle" value="Size" />
<param name="appendToFile" value="true" />
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<layout type="MyApp.Framework.Logging.W3CLayout, MyApp.Framework">
<conversionPattern value="%message%newline" />
</layout>
</appender>
<root>
<level value="WARN" />
<appender-ref ref="ServicesLogAppender" />
</root>
<logger name="ServicesLogger">
<level value="INFO" />
</logger>
<logger name="MyCompany">
<level value="INFO" />
</logger>
<logger name="MyApp">
<level value="INFO" />
</logger>
<logger name="OutgoingServices" additivity="false">
<level value="INFO" />
<appender-ref ref="OutgoingServicesLogAppender" />
</logger>
</log4net>
... the rest of the web.config ...
GetLogger<T>()
它不仅初始化
namespace MyApp.WebUI
{
public class Global : System.Web.HttpApplication
{
private static readonly ILog _log = LogManager.GetLogger<Global>();
private void Application_Start(object sender, EventArgs e)
{
// This will write a log to web-services.log
_log.Info("Starting Application_Start");
}
}
}
附加程序,而且还初始化ServicesLogAppender
标题属性。这引起了一个问题,因为当我要使用MyApp.Framework.Logging.W3CLayout
附加程序时,它将两次写入日志。
见下文:
OutgoingServices
为web-services.log生成的日志文件:
namespace MyApp.Domain.WorkOrder
{
public abstract class AbstractStatusChangeNotifier
{
private static readonly ILog Logger = LogManager.GetLogger("OutgoingServices");
public void DoWork(){
Logger.Info("This log will show up twice");
}
}
}
为outing-web-services.log生成的日志文件:
2019-01-10 17:00:51,674 [81,/LM/W3SVC/1/ROOT/MyApp-5-131916312513450449] INFO Myapp.WebUI.Global - Starting Application_Start
该应用似乎具有重复的记录器(因为
#Software: MyApp 257.14.0.0
#Version: 1.0 // Reference: http://www.w3.org/TR/WD-logfile
#Date: 2019-01-10 21:46:48
#Fields: date time cs-host cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs(User-Agent) cs(Referer) sc-status time-taken
This log will show up twice
#Software: MyApp 257.14.0.0
#Version: 1.0 // Reference: http://www.w3.org/TR/WD-logfile
#Date: 2019-01-10 21:58:54
#Fields: date time cs-host cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs(User-Agent) cs(Referer) sc-status time-taken
This log will show up twice
被调用了两次),并且两次写入同一文件。如何防止GetLogger()启动W3CLayout
PatternLayout?还是我在W3CLayout
上错过的任何事情?
答案 0 :(得分:0)
namespace MyApp.Framework.Logging
{
public class W3CLayout : PatternLayout
{
public override string Header
{
get { return buildW3CLogHeader(); }
set { }
}
private string buildW3CLogHeader()
{
var header = new StringBuilder();
header.AppendLine("#Software: " + ConfigurationSettings.ProductName + " " + ConfigurationSettings.Product + " " + ConfigurationSettings.Version);
header.AppendLine("#Version: 1.0 // Reference: http://www.w3.org/TR/WD-logfile");
header.AppendLine("#Date: " + DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss"));
header.AppendLine("#Fields: date time cs-host cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs(User-Agent) cs(Referer) sc-status time-taken");
return header.ToString();
}
}
}
在上面的类中,我调用了ConfigurationSettings.ProductName
,它初始化了log4net
的另一个实例。使用继承的类时,我必须注意不要在任何地方调用任何private static ILog _log = LogManager.GetLogger<ClassName>();
。