2016-09-13 8 views
2

Я использую NLog для своего регистратора. Все работает нормально при регистрации при запуске .exe или даже отладки через Visual Studio, NLog все равно будет записывать в файл.NLog and Unit Testing

Но если я запустил объект, который вызывает регистратор с помощью теста Unit, файл создается, но он пуст. Есть ли дополнительная настройка/правило, которые мне нужно добавить в конфигурацию, чтобы NLog записывал файлы в модульные тесты?

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

public static void Info(string app, string m) => EngineLogger.Logger.Info($"{app} : {m}"); 



<targets> 
    <target name="infoFile" 
      xsi:type="File" 
      layout="${date:format=yyyy-MM-dd HH\:mm\:ss} ${pad:padding=5:inner=${level:uppercase=true}} ${logger} ${message}" 
      fileName="leftoutForQuestion" 
      keepFileOpen="false" 
      encoding="iso-8859-2" /> 
    <target name="errorFile" 
      xsi:type="File" 
      layout="${date:format=yyyy-MM-dd HH\:mm\:ss} ${pad:padding=5:inner=${level:uppercase=true}} ${logger} ${message}" 
      fileName="leftOutForQuestion" 
      keepFileOpen="false" 
      encoding="iso-8859-2" /> 
    </targets> 
    <rules> 
    <logger name="*" minlevel="Debug" maxlevel="Info" writeTo="infoFile" /> 
    <logger name="*" minlevel="Warn" maxlevel="Fatal" writeTo="errorFile" /> 
    </rules> 

Здесь ошибка из внутреннего журнала:

Error Error has been raised. Exception: System.Runtime.InteropServices.COMException (0x800700A1): The specified path is invalid. (Exception from HRESULT: 0x800700A1) 
    at System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode, IntPtr errorInfo) 
    at NLog.Internal.FileAppenders.BaseFileAppender.WindowsCreateFile(String fileName, Boolean allowFileSharedWriting) 
    at NLog.Internal.FileAppenders.BaseFileAppender.TryCreateFileStream(Boolean allowFileSharedWriting) 
    at NLog.Internal.FileAppenders.BaseFileAppender.CreateFileStream(Boolean allowFileSharedWriting) 
    at NLog.Internal.FileAppenders.RetryingMultiProcessFileAppender.Write(Byte[] bytes) 
    at NLog.Targets.FileTarget.WriteToFile(String fileName, LogEventInfo logEvent, Byte[] bytes, Boolean justData) 
    at NLog.Targets.FileTarget.ProcessLogEvent(LogEventInfo logEvent, String fileName, Byte[] bytesToWrite) 
    at NLog.Targets.FileTarget.Write(LogEventInfo logEvent) 
    at NLog.Targets.Target.Write(AsyncLogEventInfo logEvent) 
+0

Вы проверили внутренний файл журнала nlog на наличие ошибок? также нашел эту ссылку, которая может быть той же проблемой: http://stackoverflow.com/questions/1672998/nlog-with-vs-2008-unit-test – rlee

+0

Я тоже это пробовал, но эта же проблема все еще происходит. Файл создается с правильным именем файла, но файл пуст. D = – TheNoob

+0

Зачем вы входите в файл filetarget, а не в memorytarget? – Julian

ответ

1

Не уверен, если это проблема, но уверен, что это:

Чтение NLog.config из тестовой среды блока может быть трудным, поэтому более надежным является чтение конфигурации из строки в модульных тестах. Мы используем хелпер:

protected XmlLoggingConfiguration CreateConfigurationFromString(string configXml) 
    { 
     XmlDocument doc = new XmlDocument(); 
     doc.LoadXml(configXml); 

     return new XmlLoggingConfiguration(doc.DocumentElement, Environment.CurrentDirectory); 
    } 

, а затем:

LogManager.Configuration = CreateConfigurationFromString(@" 
      <nlog throwExceptions='true'> 
       <targets><target name='debug' type='debug' layout='${message}' /></targets> 
       <rules> 
        <logger name='*' minlevel='info' appendto='debug'> 
         <filters> 
          <whencontains layout='${message}' substring='msg' action='ignore' /> 
         </filters> 
        </logger> 
       </rules> 
      </nlog>"); 

не забудьте сбросить LogManager.Configuration до или после каждого испытания.

Обновление: включено throwExceptions в config.

Также об ошибке. Вероятно, вам нужен абсолютный путь в модульном тесте.

+0

О, спасибо за ваш ответ! Я дам вам попытку и дам вам знать. =) Еще раз спасибо – TheNoob

+0

Я пробовал это решение, но та же проблема все еще случается. спасибо за ваш вклад, хотя =) высоко оценили – TheNoob

+0

Вы пробовали отключить отладку в nlog и посмотреть, не зарегистрировано ли что-либо во внутреннем nlog-файле? – Webezine

3

Я обнаружил, что вся конфигурация находится в файле app.config для проекта тестирования модуля, а не файла NLog.Config. Обязательно объявите раздел конфигурации, а затем конфигурацию NLog. Ниже приведен пример моего приложения app.config

<configuration> 
     <configSections> 

     <section name="nlog" 
        type="NLog.Config.ConfigSectionHandler, NLog"/> 
    </configSections> 
    <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

    <targets> 


     <target name="file" xsi:type="File" 
      layout="${longdate} ${logger} ${message}" 
      fileName="${basedir}/logs/${shortdate}.log" /> 

    </targets> 
    <rules> 
     <logger name="*" minlevel="Trace" writeTo="file"/> 

    </rules> 

    </nlog> 
</configuration>