Log4Net Layout.XmlLayout 不在 .NET Core 平台中创建日志
Log4Net Layout.XmlLayout does not create logs in .NET Core platform
我已经为我的应用程序实现了记录器,我想在 .NET Core 控制台应用程序上以 XML 格式 (XmlLayout) 记录 activity。
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.*) 都按预期工作。
我是否必须对配置文件进行任何更改?
谢谢
手动加载配置:
var logRepository = LogManager.GetRepository(Assembly.GetEntryAssembly());
XmlConfigurator.Configure(logRepository, new FileInfo("log4net.config"));
我在 ASP.Net Core 2.0 网络应用程序中遇到了同样的问题。
我启用了内部调试并看到了以下内容:
log4net:错误 [RollingFileAppender] 错误代码:GenericFailure。 DoAppend 失败
System.ArgumentException: 'log4j:event' 中的名称字符无效。 ':' 字符,十六进制值 0x3A,不能包含在名称中。
在 System.Xml.XmlWellFormedWriter.CheckNCName(字符串 ncname)
在 System.Xml.XmlWellFormedWriter.WriteStartElement(字符串前缀、字符串本地名称、字符串 ns)
在 log4net.Layout.XmlLayoutSchemaLog4j.FormatXml(XmlWriter 编写器,LoggingEvent loggingEvent)
在 log4net.Layout.XmlLayoutBase.Format(TextWriter 编写器,LoggingEvent loggingEvent)
在 log4net.Appender.FileAppender.Append(LoggingEvent loggingEvent)
在 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>
问题出在 log4net.Layout.XmlLayoutSchemaLog4j
它使用方法 writer.WriteStartElement("log4j:event");
导致验证错误。
您可以创建自己的布局(从此处获取代码 here)
然后改变
writer.WriteStartElement("log4j:event")
进入
writer.WriteStartElement("log4j", "event", "log4j");
此方法采用前缀、元素名称和名称空间。
我已经在 YALV 中打开输出 XML 文件,一切正常。
不要忘记更正所有 WriteStartElement
方法。
我写了这个解决方案here。
我已经为我的应用程序实现了记录器,我想在 .NET Core 控制台应用程序上以 XML 格式 (XmlLayout) 记录 activity。 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.*) 都按预期工作。
我是否必须对配置文件进行任何更改? 谢谢
手动加载配置:
var logRepository = LogManager.GetRepository(Assembly.GetEntryAssembly());
XmlConfigurator.Configure(logRepository, new FileInfo("log4net.config"));
我在 ASP.Net Core 2.0 网络应用程序中遇到了同样的问题。
我启用了内部调试并看到了以下内容:
log4net:错误 [RollingFileAppender] 错误代码:GenericFailure。 DoAppend 失败 System.ArgumentException: 'log4j:event' 中的名称字符无效。 ':' 字符,十六进制值 0x3A,不能包含在名称中。 在 System.Xml.XmlWellFormedWriter.CheckNCName(字符串 ncname) 在 System.Xml.XmlWellFormedWriter.WriteStartElement(字符串前缀、字符串本地名称、字符串 ns) 在 log4net.Layout.XmlLayoutSchemaLog4j.FormatXml(XmlWriter 编写器,LoggingEvent loggingEvent) 在 log4net.Layout.XmlLayoutBase.Format(TextWriter 编写器,LoggingEvent loggingEvent) 在 log4net.Appender.FileAppender.Append(LoggingEvent loggingEvent) 在 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>
问题出在 log4net.Layout.XmlLayoutSchemaLog4j
它使用方法 writer.WriteStartElement("log4j:event");
导致验证错误。
您可以创建自己的布局(从此处获取代码 here)
然后改变
writer.WriteStartElement("log4j:event")
进入
writer.WriteStartElement("log4j", "event", "log4j");
此方法采用前缀、元素名称和名称空间。
我已经在 YALV 中打开输出 XML 文件,一切正常。
不要忘记更正所有 WriteStartElement
方法。
我写了这个解决方案here。