Я использую Log4net (v2.0.50727) в веб-сервисе C#, который я написал. Он настроен на создание 2 приложений. Первый - это общий файл отладки, который я отслеживаю, чтобы убедиться, что служба работает правильно, вторая - отчет, который я отправляю на клиента с различными интервалами (вручную, но может быть автоматизирован).Log4net xml appender не создает корневой элемент
<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 для его обработки? Спасибо.
Вы можете добавить элементы верхнего и нижнего колонтитула в макет (обратите внимание, что ваш шаблон преобразования игнорируется, поскольку [XmlLayoutSchemaLog4j не имеет такого свойства] (http://logging.apache.org/log4net/log4net-1.2.12/release/ sdk/log4net.Layout.XmlLayoutSchemaLog4jMembers.html)) - или у вас есть различные опции, чтобы получить больший контроль над процессом, например пользовательский appender или настраиваемый макет, – stuartd
Log4net не может справиться с этим сам по себе, потому что у RollingFileAppender нет определенного конца. Он не может знать, когда закрыть корневой тег xml. Вы можете справиться с этим из Excel с помощью VBA, если это приемлемо для ваших пользователей (вы получаете эти предупреждения от вирусов), или вам придется вмешаться с каким-то специальным кодом. –