2016-07-16 11 views
0

ハードウェアデバイスのベンダーRest APIに接続するRESTエンドポイントの統合テストを進めています。私のソフトウェアは、物理的なデバイスで定期的にテストする必要があります。テストプロジェクト(VSTest VS 2015)を作成し、テストハーネスにログを追加したい。 log4netには膨大な量の文書があることに気づいていますが、それでも動作させることはできません。私の目標は、コンソールとファイルにもログを記録することです。ベンダーは、テストが完了したことをログファイルで検証する必要があります。統合テスト用にVS2015でlog4netを設定するにはどうすればよいですか?

まず、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> 

は、私がテストExplorerがAssembly.Infoファイルを読み込むとは思わないが、私は念の参照が含まれています。

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

私は考えることができるすべてを試しました。私はアイデアがありません。どんな助けもありがとう。

+4

あなたが実際に間違っているものを言っていないので、私はあなたが期待する場所に作成されていないファイルを推測しています。しかし、いくつかの注意点:1)スタンドアロンのlog4net設定ファイルは ''セクションにラップする必要はありません。 2) "log4net.properties"ファイルから設定をロードしていますが、それはあなたが期待する場所に存在していますか? 3)log4netの内部デバッグを有効にし、その出力をチェックします。 – stuartd

+0

代わりにNLogを使用すると考えましたか?私は、設定へのアプローチのほうがはるかに簡単だと感じました。そして、私が知る限りでは、すべての同じ機能を提供しています。 –

+0

ありがとうございます。私はこの問題に遅れてごめんなさい。 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は私を非常識に運転してしまったからです。

これは、NLogのテストプロジェクトのApp.configにあります。

<?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を使用して、ログに記録するすべてのクラスのロガー(ソース)を作成する必要があります。しかし、私はちょうど静的クラスで単一のロガーをラップし、いくつかのパススルーメソッドを作成しました。ロガーが自動的に収集できる詳細(ロギングコールの正確なサイトなど)は失われますが、通常はログに書き込むメッセージに十分な詳細があります。 〜 NlogはGithubにありますhttps://github.com/NLog/NLogです。 Log4Netはまだsvnです。それは私に何かを教えてくれる。

また、NuGetで利用できるNlogのWindowsフォームターゲットがあります。

+0

'' LoggingMangerを使用して、ログに記録するすべてのクラスのロガー(ソース)を作成する必要があります。これは[this.Log()](https://github.com/ferventcoder/) this.Log)for – hometoast

関連する問題