В моем файле nlog.config отсутствует параметр, настроенный для веб-сервиса для запуска метода в контроллере?

Я хочу отправить информацию из Nlog в файл и в веб-сервис одновременно. Файл работает нормально. Веб-служба не столкнется с точкой останова на контроллере.

Я попробовал шаги, рекомендованные здесь https://github.com/NLog/NLog/wiki/WebService-target, здесь https://github.com/NLog/NLog/issues/1996 и понял, что это должно быть выполнимо, поскольку https://github.com/NLog/NLog/pull/1912 и использовал следующий код для обнаружения регистратора:

Тест работает нормально:

    DebugTarget target = new DebugTarget();
    target.Layout = "${message}";
    NLog.Config.SimpleConfigurator.ConfigureForTargetLogging(target, LogLevel.Debug);
    Logger logger = LogManager.GetLogger("ws");
    logger.Debug("log message"); <--- here I expected to hit the breakpoint after this step
    logger.Debug("another log message");

Мой Nlog.config

 <targets>      
   <target xsi:type='WebService'
      name= 'ws'
      protocol= 'HttpPost'
      url= 'http://localhost:8082/API/Nlog'
      encoding= 'UTF-8'
      preAuthenticate= 'true'
      proxyType="NoProxy">       
    <parameter name="sourceSite"        type='System.String' layout="${aspnet-request:serverVariable=Url:format=ToString}" />
    <parameter name="sourceApplication" type='System.String' layout="${iis-site-name:format=ToString}" />
    <parameter name="message"           type='System.String' layout="${message:format=ToString}" />
    <parameter name="innerException"    type='System.String' layout="${exception:format=string,message,method:maxInnerExceptionLevel=5:innerFormat=shortType,message,method}}" />
    <parameter name="level"             type='System.String' layout="${level:uppercase=true}" />
    <parameter name="stackTrace"        type='System.String' layout="${exception:format=ToString,StackTrace}${newline}" />
    <parameter name='windowsUserName'   type='System.String' layout='${windows-identity:userName=true:domain=true:format=ToString}' />        
    <header name='WindowsUserName' layout='${windows-identity:userName=true:domain=true}' />
    <header name='xapikey' layout='keyValue' />
  </target>
  <target name="file" xsi:type="File" fileName="${basedir}/log.txt"  archiveAboveSize="52428800" layout="${longdate}|${level:uppercase=true}|${logger}|${message}|${exception:format=ToString,StackTrace}${newline}"/>
</targets>
<rules>
    <logger name="*" minlevel="Off" writeTo="file"/>
    <logger name="ws" minlevel="Trace" writeTo="ws"/>
</rules>

Controller to call but Breakpoint won't be hit:

public class NlogController : BaseController (which has BaseController : ApiController)
{        
    protected new static readonly Logger Logger = LogManager.GetCurrentClassLogger();

    /// <summary>
    /// 
    /// </summary>
    /// <param name="data"></param>
    public void Post([FromBody] NlogData data)
    { //Breakpoint placed here
        Manager.StoreLoggingInformation(data);
    }
}

Определение NLogData

public class NlogData
{
    public string SourceSite { get; set; }
    public string SourceApplication { get; set; }
    public string Message { get; set; }
    public string InnerException { get; set; }
    public string Level { get; set; }
    public string StackTrace { get; set; }
    public string WindowsUserName { get; set; }
}

Я ожидал попасть в точку останова в своем NlogController и посмотреть, что находится внутри «данных».


person Lukas    schedule 05.09.2019    source источник
comment
Проверяли ли вы наличие ошибок в NLog InternalLogger — github.com/NLog/NLog/wiki/Internal -Ведение журнала ? Вы пытались использовать такой инструмент, как Fiddler, для проверки фактического http-запроса?   -  person Rolf Kristensen    schedule 06.09.2019
comment
Спасибо, я использовал оба. Fiddler не находит ни одного запроса, который меня удивляет. Внутренний регистратор выдает цели отладки, не настроенные для регистратора. Также все цели пусты...   -  person Lukas    schedule 06.09.2019
comment
но ему удается найти как цели ws, так и файлы. Трассировка закрытия цели веб-службы [ws] Отладка закрытия цели «Цель веб-службы [ws]». Отладка Закрытая цель «Цель веб-службы [ws]». Трассировка Закрытие Целевого файла[файл] Отладка Закрытие Целевого файла 'Цель файла[файл]'. Закрытая цель «Цель файла [файл]». Нет ошибок   -  person Lukas    schedule 06.09.2019


Ответы (1)


Я нашел ошибки после того, как нашел кого-то с такой же ошибкой.

Первая ошибка была такая:

protected new static readonly Logger Logger = LogManager.GetCurrentClassLogger();

при использовании

    <logger name="ws" minlevel="Trace" writeTo="ws"/>

name="*" является правильной настройкой, потому что GetCurrenClassLogger получает пространство имен + имя класса в качестве имени. Вот почему регистратор никогда не попадал. ЕСЛИ у вас есть именованный регистратор, который вам нужно использовать

Logger logger = LogManager.GetLogger("ws");

После этого была вторая ошибка.

url= 'http://localhost:8082/API/Nlog'
url= 'http://localhost:Port/{Path}/Controller**/Action**' is the correct syntax. 

После этих двух изменений я смог достичь своей точки останова, и все заработало, как и ожидалось! Спасибо за помощь.

Я надеюсь, что команда Nlog изменит это на https://github.com/NLog/NLog/wiki/WebService-target

Пример конфига:

<nlog>
<targets>
    <target type='WebService'
            name='ws'
            url='http://localhost:1234/logme' <-- change to 'http://localhost:1234/logme/Post'
            protocol='HttpPost'
            encoding='UTF-8'   >
        <parameter name='param1' type='System.String' layout='${message}'/> 
        <parameter name='param2' type='System.String' layout='${level}'/>
    </target>
</targets>
<rules>
  <logger name='*' writeTo='ws'></logger>
</rules>
</nlog>

Сэкономил бы 2 дня работы.

person Lukas    schedule 06.09.2019
comment
Вы можете либо изменить этот asp net mvc с помощью С#, используя имя метода и добавить его в URL-адрес, например мыло, либо изменить пример с подсказкой о том, что действие необходимо в URL-адресе. - person Lukas; 06.09.2019
comment
Я надеюсь, что команда Nlog изменит это на github.com/NLog/NLog/wiki/WebService- цель. Вики доступна для редактирования ;) - person Julian; 06.09.2019
comment
Спасибо, но поскольку я не знаю, какое исправление они рекомендуют и планируется ли вообще использовать опцию methodName, я предоставил им это. - person Lukas; 10.09.2019
comment
@Lukas Обновлен пример Wiki для вас: github.com/NLog/NLog/wiki/WebService- цель - person Rolf Kristensen; 25.09.2019