log4net пишет '?' когда я использую `% type,% method и% line` шаблоны - PullRequest
1 голос
/ 17 апреля 2019

Я пытаюсь использовать log4net в моем приложении c # ASP.net Core 2.2, но когда я использую любой из этих шаблонов, они выдают мне вывод с вопросительными знаками.

Мой log4net.config:

<?xml version="1.0" encoding="utf-8" ?>
<log4net>
  <appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
    <file value="C:\Temp\app.log" />
    <layout type="log4net.Layout.PatternLayout">
     <conversionPattern value="%date | %level | [%thread] | %type %method %line - %message%n" />
    </layout>
  </appender>
  <root>
    <level value="ALL" />
    <appender-ref ref="RollingFile" />
  </root>
</log4net>

файл выглядит так после записи журнала:

2019-04-17 11:48:44,230 | INFO | [1] | ? ? ? - abc

есть идеи, почему это происходит и как это исправить?Я видел некоторые учебные пособия, в которых используются эти шаблоны, и пытался скопировать их, но результаты были такими же ... может быть, что-то в моей конфигурации неправильно?

из здесь Я понимаю, что могупросто добавьте имя файла и строку к моему сообщению, но я хотел сначала попробовать исправить в файле конфигурации.

спасибо.

1 Ответ

3 голосов
/ 17 апреля 2019

Я копирую и вставляю вашу конфигурацию в мой проект, и она работает как положено.Вы запускали свой проект в Release или Debug?Вы читали об ограничениях в этих шаблонах?

Примечание об информации о местоположении вызывающего абонента.Следующие шаблоны %type %file %line %method %location %class %C %F %L %l %M все генерируют информацию о местоположении вызывающего абонента.Информация о местоположении использует класс System.Diagnostics.StackTrace для генерации стека вызовов.Затем информация о вызывающем абоненте извлекается из этого стека.

Класс System.Diagnostics.StackTrace не поддерживается в .NET Compact Framework 1.0 , поэтому информация о местоположении вызывающего абонента недоступна в этой платформе.

Класс System.Diagnostics.StackTrace может сказать о сборках Release:

Информация StackTrace будет наиболее информативной с конфигурациями сборки Debug.По умолчанию сборки отладки включают символы отладки, а сборки выпуска - нет.Символы отладки содержат большую часть файла, имени метода, номера строки и информации о столбцах, используемых при создании объектов StackFrame и StackTrace.StackTrace может не сообщать о таком количестве вызовов методов, как ожидалось, из-за преобразований кода, которые происходят во время оптимизации.

Это означает, что в сборке Release информация о вызывающем абоненте может быть неполной или можетвообще не существует! Следовательно, информация о местоположении вызывающего абонента не может быть использована в сборке выпуска.

Редактировать

In .net core / .netСтандартный StackTrace поддерживается не полностью:

https://github.com/apache/logging-log4net/blob/master/src/Core/LocationInfo.cs#L86

Поэтому className, fileName, lineNumber, methodName, fullInfo недоступны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...