2016-07-16 6 views
0

Я работаю над тестом интеграции для конечной точки REST, которая соединяется с поставщиками Rest Api на аппаратном устройстве. Мое программное обеспечение необходимо периодически проверять на физическом устройстве. Я создал тестовый проект (VSTest VS 2015), и я хочу добавить журнал в свой тестовый жгут. Я понимаю, что в log4net имеется огромное количество документации, но я все еще не могу заставить ее работать. Моя цель - войти в консоль, а также в файл. Поставщик хочет, чтобы файл журнала подтвердил, что мои тесты завершены.Как настроить log4net с VS 2015 для теста интеграции?

Во-первых, я инициализирую log4net для чтения автономного файла.

using log4net.Config; 
using log4net; 
using Microsoft.VisualStudio.TestTools.UnitTesting; 
using System.Diagnostics; 

namespace MyProgram 
{ 
    [TestClass] 
    public class AssemblyInitializer 
    { 
     private static ILog log = null; 

     [AssemblyInitialize] 
     public static void Configure(TestContext Context) 
     { 
      Debug.WriteLine("Starting log4net setup and configuration"); 

      XmlConfigurator.Configure(new FileInfo("log4net.properties")); 
      log = LogManager.GetLogger(typeof(AssemblyInitializer)); 
      log.Debug("log4net initialized for Integration Test"); 

      Debug.WriteLine("Completed log4net setup and configuration"); 

     } 
    } 
} 

Мои log4net.properties Файл:

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
<log4net> 
    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionpattern value="%date [%thread] %-5level %logger{1} - %message%newline"/> 
     </layout> 
    </appender> 
    <appender name="FileAppender" type="log4net.Appender.FileAppender"> 
     <file value="IntegrationTests.log" /> 
     <appendToFile value="true" /> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> 
     </layout> 
    </appender> 
    <root> 
     <level value="DEBUG"> 
      <appender-ref ref="ConsoleAppender"/> 
      <appender-ref ref="FileAppender"/> 
     </level> 
    </root> 
</log4net> 
</configuration> 

Я не думаю, что исследователь Test считывает файл Assembly.Info, но я включил ссылку на всякий случай.

[assembly: log4net.Config.XmlConfigurator(Watch = false)] 

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

+4

Вы на самом деле не сказали, что случилось, поэтому я предполагаю, что файл не создается в том месте, которое вы ожидаете. Но несколько примечаний: 1) автономный конфигурационный файл log4net не нужно обертывать в разделе ''. 2) вы загружаете конфигурацию из файла «log4net.properties», но существует ли это в том месте, которое вы ожидаете? 3) включить внутреннюю отладку log4net и проверить результат. – stuartd

+0

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

+0

Благодарим вас за комментарии. Я просто возвращаюсь к этой проблеме, так что извините за задержку. Я удалил теги , которые я использовал, чтобы избавиться от зеленых squigglies в VS. Я проверил, что файл log4nt.properties читается. Я пошел вперед и написал новую функцию, которая работает - я опубликую ниже. – Shawn

ответ

0

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

using log4net; 
using log4net.Config; 
using log4net.Repository.Hierarchy; 
using log4net.Core; 
using log4net.Appender; 
using log4net.Layout; 
using Microsoft.VisualStudio.TestTools.UnitTesting; 

namespace MyProgram 
{ 
    [TestClass] 
    public class AssemblyInitializer 
    { 

     private static ILog log = null; 

     [AssemblyInitialize] 
     public static void Configure(TestContext Context) 
     { 
      Debug.WriteLine("Starting log4net setup and configuration"); 

      Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository(); 
      hierarchy.Root.RemoveAllAppenders(); 

      PatternLayout patternLayout = new PatternLayout(); 
      patternLayout.ConversionPattern = "%date [%thread] %-5level %logger - %message%newline"; 
      patternLayout.ActivateOptions(); 

      FileAppender fileAppender = new FileAppender(); 
      fileAppender.Name = "Integration Test FileAppender"; 
      fileAppender.File = @"Logs\IntegrationTest.log"; 
      fileAppender.AppendToFile = false; 
      fileAppender.Layout = patternLayout; 
      fileAppender.ActivateOptions(); 
      hierarchy.Root.AddAppender(fileAppender); 

      ConsoleAppender consoleAppender = new ConsoleAppender(); 
      consoleAppender.Name = "Integration Test ConsoleAppender"; 
      consoleAppender.Target = Console.Out.ToString(); 
      consoleAppender.ActivateOptions(); 
      consoleAppender.Layout = patternLayout; 
      hierarchy.Root.AddAppender(consoleAppender); 

      hierarchy.Root.Level = Level.Debug; 
      hierarchy.Configured = true; 

      log = LogManager.GetLogger(typeof(AssemblyInitializer)); 
      log.Debug("log4net initialized for Integration Test"); 

      Debug.WriteLine("Completed log4net setup and configuration"); 

     } 
    } 
} 
-1

Я собираюсь расширить свой комментарий. Потому что Log4Net тоже сбил меня с ума.

Это все, что находится в моем приложении App.config в моем тестовом проекте для NLog.

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
<configSections> 
    <section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog"/> 
    </configSections> 
    <appSettings> 
    </appSettings> 
    <nlog autoReload="true" 
     throwExceptions="true" 
     internalLogLevel="Debug" internalLogFile="c:\temp\nlog-test.log" > 
    <targets> 
     <target type="Console" name="console" error="true"/> 
    </targets> 
    <rules> 
     <logger name="*" writeTo="console" /> 
    </rules> 
    </nlog> 
</configuration> 

Вы определяете цель, которая является местом для регистрации, а затем указать, какие регистратор написать к этой цели.

Они хотят, чтобы вы использовали LoggingManger для создания регистратора (источника) для каждого класса, с которого вы хотите зарегистрироваться. Но я только что завернул один регистратор в статическом классе и создал некоторые методы pass-thru. Вы теряете некоторые данные, которые регистратор мог бы автоматически захватить для вас (например, точный сайт вызова для ведения журнала), но у меня обычно есть подробные сведения в сообщении, которое я пишу для регистрации. ~ Nlog находится на Github https://github.com/NLog/NLog. Log4Net по-прежнему svn. Это мне что-то говорит.

В NuGet также есть несколько хороших целей для форм Windows для Nlog.

+0

'' Они хотят, чтобы вы использовали LoggingManger для создания регистратора (источника) для каждого класса, с которого вы хотите регистрироваться. «Это то, что я использую [this.Log()] (https://github.com/ferventcoder/ this.Log) для – hometoast

 Смежные вопросы

  • Нет связанных вопросов^_^