在GetLogger <t>()上调用特定记录器的自定义PatternLayout;

时间:2019-01-10 22:36:13

标签: c# web-config log4net

我正在尝试为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上错过的任何事情?

1 个答案:

答案 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>();