9

アプリからいくつかのアプリ メッセージをログに記録したいと考えています。まさにこの状況で、nunit を log4net で動作させたいだけです。ここでいくつかの例を見つけましたhttp://www.ofconsulting.com/PublicPortal/ofc-tech-blog/92-configure-log4net-with-nunit.html

log4net は app.config で次のように構成されます。

<configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,Log4net"/>
  </configSections>

<log4net>
    <root>
      <level value="DEBUG" />
      <appender-ref ref="LogFileAppender" />
    </root>
    <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender" >
      <param name="File" value="log.txt" />
      <param name="AppendToFile" value="true" />
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="10" />
      <maximumFileSize value="10MB" />
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%-5p%d{yyyy-MM-dd hh:mm:ss} – %m%n" />
      </layout>
    </appender>
  </log4net>

そして、私のテストコードでは次のとおりです

[TestFixture]
class DomainTests
{
    protected static readonly ILog log = LogManager.GetLogger(typeof(DomainTests));
    public void LoggingTests()
    {            
        log4net.Config.XmlConfigurator.Configure(); 
    }

    [Test]
    public void BasicLogTest()
    {
        log.Error("write my log entry already");
    }

テストはパスしましたが、log.txt ファイル内には何も書き込まれません。私は何を間違っていますか?
アプリケーションに入る、アプリケーションを終了するなどのメッセージをできるだけ簡単に保存したいだけです。よろしく。

4

4 に答える 4

23

問題は、NUnitテストランナー(Visual Studioのresharperから実行する場合)が別のフォルダーからテストを実行する(テストアセンブリをシャドウコピーする)ため、完全な構成パスを指定しない限り、その時点でxml構成を使用できないことです。

もちろん、基本構成を使用して、次のようなコードでログ構成を指定することもできます。

log4net.Config.BasicConfigurator.Configure(
  new log4net.Appender.ConsoleAppender {
    Layout = new log4net.Layout.SimpleLayout()});

その後、テスト出力にログ出力が表示されます。

于 2012-06-14T21:25:17.380 に答える
6

nunitでlog4netを知っていて使用している限り、構成ファイルを使用したことはありません。テストクラスコンストラクターに次の行を追加するだけです

BasicConfigurator.Configure();

サンプルテストクラスを見たい場合は、ここに完全な答えがあります

于 2013-10-30T02:20:48.763 に答える
5

私の最善の推測は、あなたが次のようなことをすることです:

[TestFixture]
class DomainTests
{
    protected static readonly ILog log = LogManager.GetLogger(typeof(DomainTests));
    public void LoggingTests()
    {            
        log4net.Config.XmlConfigurator.Configure(); 
    }

    [Test]
    public void BasicLogTest()
    {
        log.Error("write my log entry already");
    }

    [SetUp]
    RunBeforeAnyTests()
    {
        BasicConfigurator.Configure();
    }

    [TearDown]
    RunAfterAnyTests()
    {
        // ...
    }

また、app.config ファイルではなく Log4Net.config ファイルを使用したいと思います。log4net.config ファイルの例を次に示します。

<log4net>
  <!-- A1 is set to be a LogFileAppender -->
  <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender, log4net" >
    <param name="File" value="C:\logging\log.txt" />
    <file value="c:\logging\Main" />
    <appendToFile value="true" />
    <datePattern value="yyyyMMdd'.log'" />
    <rollingStyle value="Composite" />
    <staticLogFileName value="false" />
    <maxSizeRollBackups value="-1" />
    <maximumFileSize value="500MB" />

    <!-- A1 uses PatternLayout -->
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
    </layout>
  </appender>
  <!-- Set root logger level to DEBUG and its only appender to LogFileAppender -->
  <root>
    <!--<level value="OFF" />-->
    <!--<level value="FATAL" />-->
    <!--<level value="ERROR" />-->
    <!--<level value="WARN" />-->
    <!--<level value="INFO" />-->
    <level value="DEBUG" />
    <!--<level value="ALL" />-->
    <appender-ref ref="LogFileAppender" />
  </root>
</log4net>
于 2012-06-14T21:24:51.477 に答える
3

単体テストを調整して、ファイル自体をチェックできます(手動検査の代わりに)。環境変数に保存されているファイルパスに注意してください。これは、TeamCityテストランナーでも機能します(パスをハードコーディングする必要はありません)。

構成:

<log4net>
  <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
    <file type="log4net.Util.PatternString" value="%env{ALLUSERSPROFILE}\test.log" />
    <appendToFile value="true" />
    <maxSizeRollBackups value="10" />
    <maximumFileSize value="10MB" />
    <rollingStyle value="Size" />
    <staticLogFileName value="true" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
    </layout>
  </appender>
  <root>
    <level value="INFO" />
    <appender-ref ref="RollingLogFileAppender" />
  </root>
</log4net>

コード:

private string _expectedFile;

[SetUp]
public void SetUp()
{
    _expectedFile = Path.Combine(
        Environment.GetEnvironmentVariable("ALLUSERSPROFILE"),
        "test.log");

    if (File.Exists(_expectedFile))
        File.Delete(_expectedFile);

    XmlConfigurator.Configure();
}

[Test] public void GivenLog4NetFileAppender_WhenLogInfoStringWithLog4Net_ThenWritesToDisk()
{
    ILog log = LogManager.GetLogger(typeof (LoggingIntegrationTests));
    log.Info("Message from test");

    LogManager.Shutdown();

    Assert.That(File.ReadAllText(_expectedFile),
                Is.StringContaining("Message from test"));
}
于 2012-06-14T21:26:46.527 に答える