Log4Net Layout.XmlLayout不会在.NET Core平台中创建日志

时间:2017-06-20 10:22:26

标签: c# .net-core log4net

我已经为我的应用程序实现了logger,我想在.NET Core Console Application上以XML格式(XmlLayout)记录活动。 Log4Net配置包括FileAppender和XmlFileAppender,如下所示。

<log4net>
  <appender name="FileAppender" type="log4net.Appender.FileAppender">
  <file value="C:\Log4NetLogs\UaGatewayText.log.txt"/>
  <layout type="log4net.Layout.PatternLayout">
  <conversionPattern value="[%date{dd.MM.yyyy}] [%date{ABSOLUTE}] [%thread] 
     %level %property{TEST - Ua.Gateway} %message%newline" />

     </layout>
        </appender>
           <appender name="ConsolAppender" 
                            type="log4net.Appender.ConsoleAppender">
        <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="[%dae{DATE}] [%date{ABSOLUTE}] [%thread] 
                  [%level] %message%newline" />
      </layout>
   </appender>


    <appender name="XmlFileAppender" 
               type="log4net.Appender.RollingFileAppender">
           <file type="log4net.Util.PatternString" 
                value="C:\Log4NetLogs\UaGatewayXml.log.xml" />
        <appendToFile value= "true" />
        <rollingStyle value="size"/>
        <maximumFileSize value ="50MB"/>
        <maxSizeRollBackups value ="10"/>
       <layout type="log4net.Layout.XmlLayout" />
    </appender>


   <root>
     <level value="ALL" />
    <appender-ref ref="FileAppender" />
    <appender-ref ref="XmlFileAppender" />

   </root>

 </log4net>

在.NET Core Console App中,XmlAppender在目录中创建UaGatewayXml.log.xml文件,不写任何日志。但是,它适用于FileAppender。

对于XmlFileAppender和FileAppender,上述配置对.NET Framework(4.5。*)的预期工作方式。

我是否必须在Config文件中进行任何更改? 感谢

3 个答案:

答案 0 :(得分:3)

问题在于log4net.Layout.XmlLayoutSchemaLog4j它使用方法writer.WriteStartElement("log4j:event");导致验证错误。

您可以创建自己的布局(从此处获取代码here

只需更改

writer.WriteStartElement("log4j:event")

writer.WriteStartElement("log4j", "event", "log4j");

此方法采用前缀,元素名称和命名空间。 我在 YALV 中打开了输出 XML 文件,一切正常。 不要忘记更正所有WriteStartElement方法。

我已经写了这个解决方案here

答案 1 :(得分:0)

手动加载配置:

var logRepository = LogManager.GetRepository(Assembly.GetEntryAssembly());
XmlConfigurator.Configure(logRepository, new FileInfo("log4net.config"));

答案 2 :(得分:0)

我在ASP.Net Core 2.0 Web应用程序中遇到了同样的问题。

我启用了内部调试并看到了以下内容:

log4net:ERROR [RollingFileAppender] ErrorCode:GenericFailure。 DoAppend失败 System.ArgumentException:'log4j:event'中的名称字符无效。 ':'字符,十六进制值0x3A,不能包含在名称中。    在System.Xml.XmlWellFormedWriter.CheckNCName(String ncname)    at System.Xml.XmlWellFormedWriter.WriteStartElement(String prefix,String localName,String ns)    at log4net.Layout.XmlLayoutSchemaLog4j.FormatXml(XmlWriter writer,LoggingEvent loggingEvent)    at log4net.Layout.XmlLayoutBase.Format(TextWriter writer,LoggingEvent loggingEvent)    在log4net.Appender.FileAppender.Append(LoggingEvent loggingEvent)    at log4net.Appender.AppenderSkeleton.DoAppend(LoggingEvent loggingEvent)

我替换了

<layout type="log4net.Layout.XmlLayoutSchemaLog4j">

<layout type="log4net.Layout.PatternLayout"> 
  <conversionPattern value="%date{yyyyMMddHHmmss.fff} [%thread] %-5level %logger %appdomain - %class - %exception - %method - %property{GlobalLog4NetProperty} - %property{ThreadProperty} - %property{log4net:HostName} - %message%newline"/>
</layout>