Log4net xml追加器不创建根元素
我正在编写的C Web服务中使用Log4net v2.0.50727。其配置为创建2个附加器。第一个是我监视的常规调试文件,以确保服务正确运行,第二个是我现在手动在不同时间间隔向客户转发的报告,但可能会自动转发Log4net xml追加器不创建根元素,xml,log4net,element,root,appender,Xml,Log4net,Element,Root,Appender,我正在编写的C Web服务中使用Log4net v2.0.50727。其配置为创建2个附加器。第一个是我监视的常规调试文件,以确保服务正确运行,第二个是我现在手动在不同时间间隔向客户转发的报告,但可能会自动转发 <log4net> <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender"> <file value="..\logs\Service.lo
<log4net>
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="..\logs\Service.log.xml"/>
<appendToFile value="true"/>
<rollingStyle value="Size"/>
<maxSizeRollBackups value="20"/>
<maximumFileSize value="10000KB"/>
<staticLogFileName value="true"/>
<preserveLogFileNameExtension value="true" />
<layout type="log4net.Layout.XmlLayoutSchemaLog4j">
<conversionPattern value="%utcdate [%thread] %-5level %logger [%property{NDC}] - %message%newline"/>
</layout>
</appender>
<appender name="CustomerReportAppender" type="log4net.Appender.RollingFileAppender">
<file value="..\logs\Customer.Report.xml"/>
<appendToFile value="true"/>
<rollingStyle value="Size"/>
<maxSizeRollBackups value="20"/>
<maximumFileSize value="10000KB"/>
<staticLogFileName value="true"/>
<preserveLogFileNameExtension value="true" />
<layout type="log4net.Layout.XmlLayoutSchemaLog4j">
<conversionPattern value="%utcdate [%thread] %-5level %logger [%property{NDC}] - %message%newline"/>
</layout>
</appender>
<root>
<level value="DEBUG"/>
<appender-ref ref="RollingFileAppender"/>
</root>
<logger name="CustomerReport">
<level value="ALL" />
<appender-ref ref="CustomerReportAppender" />
</logger>
</log4net>
两个文件的日志记录工作正常。问题是,如果我将Customer.Report.xml文件发送给我的客户,它将无法在Excel中打开,因为它是无效的xml。该文件由多行事件元素组成-
<event logger="CustomerReport" timestamp="1453717399436" level="INFO" thread="8">
<message>Customer Info</message>
<properties>
<data name="UserName" value="IIS APPPOOL\Customer Service" />
<data name="log4jmachinename" value="MyServer" />
<data name="log4japp" value="/LM/W3SVC/3/ROOT-2-130981905203581113" />
<data name="HostName" value="MyServer" />
</properties>
</event>
我认为Excel正在抱怨,因为它没有1个根元素。如果我把整个文件包起来-
<Report>
....
</Report>
然后Excel加载它。可以让Log4net为我生成这个吗?或者可以用Excel来处理它?谢谢。PowerShell是快速解决此类问题的绝佳工具 不确定这是否是您正在寻找的答案类型,但它会以一种中间的方式解决您的问题。您已经提到,您现在正在手动执行此操作,但将来可能会自动执行此操作—PowerShell也是一种很好的方法 因此,下面的脚本将要求您选择文件,然后自动将其XML内容放在您指定的根元素中:
[CmdletBinding()]
Param(
[Parameter(ValueFromPipeline=$true)]
[ValidateScript({Test-Path $_ -PathType Container})]
[string]
$InitialDirectory,
[ValidateNotNullOrEmpty()]
[string]
$RootElementName = 'Report'
)
[System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") | Out-Null
$OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog
$OpenFileDialog.InitialDirectory = $InitialDirectory
$OpenFileDialog.Filter = "XML (*.xml)| *.xml"
$OpenFileDialog.ShowDialog() | Out-Null
$FileName = $OpenFileDialog.FileName
$FileContent = Get-Content $FileName
$FileContentXml = [Xml]$FileContent
[XML.XMLDocument]$XMLDocument = New-Object System.XML.XMLDocument
[XML.XMLElement]$XMLRoot = $XMLDocument.CreateElement($RootElementName)
$XMLRoot.InnerXml = $FileContentXml.OuterXml
$XMLDocument.AppendChild($XMLRoot)
$XMLDocument.Save($FileName)
您可以通过将此脚本保存在一个新文件中来使用它,例如D:\Add-RootXmlElement.ps1,然后可以从cmd提示符运行它,如下所示:
@powershell D:\Add-RootXmlElement.ps1-初始目录D:\Logs-RootElementName报告
根据需要调整Param块中的默认值,以便将来保存一些键入
这能解决你的问题吗
编辑:
当然,如果要自动执行此操作,并且在调用脚本时知道文件名,只需省略整个$InitialDirectory和$OpenFileDialog部分,只需将$FileName目录设置为要向其中添加根元素的日志文件的路径。您可以将页眉和页脚元素添加到布局中。请注意,您的转换模式会被忽略,因为-或者您可以使用各种选项来控制该过程,例如自定义追加器或自定义布局,Log4net无法自行处理此问题,因为RollingFileAppender没有确定的端点。它不可能知道何时关闭根xml标记。如果用户可以接受,您可以使用VBA从Excel处理此问题。您确实收到了这些病毒警告,或者您必须使用一些自定义代码进行干预。