0

次の方法でlog4cppでログを有効にしようとしています。

class Foo
{
    private: 
        log4cpp::Appender* _logAppender;
        log4cpp::Layout* _logAppenderLayout;
}

Foo::Foo()
{
    _logAppender = new log4cpp::FileAppender("foo", "logs/bar.log"));
    _logAppenderLayout = new log4cpp::BasicLayout();
    _logAppender.setLayout(_logAppenderLayout);
    log4cpp::Category::getRoot().setPriority(log4cpp::Priority::DEBUG);
    log4cpp::Category::getRoot().addAppender(_logAppender);

    // Crash on line below.
    log4cpp::Category::getRoot().debugStream() << "test";
}

ログに「test」を書き込もうとしている行に到達すると、「Debug Assertion Failed!」というクラッシュが発生します。アサーションは f:\dd\vctools\crt_bld_self_64_amd64\crt\src\write.c 行 67 にあります。失敗するアサートは次のとおりです。

fh >= 0 && (unsigned)fh < (unsigned)_nhandle

存在することを確認するために、ログ ディレクトリと bar.log ファイルを作成しました。また、アプリケーションとライブラリの両方が 64 ビット マルチスレッド デバッグ DLL としてビルドされていることも確認しました。log4cpp ソースには 64 ビット ビルドがなかったので、32 ビット ビルド構成に基づいて作成しました。log4cpp の最新バージョンを使用しています。

4

2 に答える 2

1

古い投稿ですが、この問題の解決策は誰かに役立つと思います。

ほとんどの場合、コード内にディレクトリ "logs" を作成するのを忘れただけです。

これはクローズド ストリームの問題です。ロガーはログ用のディレクトリを自動作成しないため、ディレクトリがありません -> ファイルがありません -> ファイルを開くことができませんでした -> 無効なファイル ハンドラ -> 例外です。ディレクトリは手動で作成する必要があります。マクロのアサーションとこれ以上の情報がないのは悲しいことです。

于 2013-08-06T09:09:09.067 に答える
0

この質問を発見し、このアサーションを取得しようとしました。MSVC2010 で log4cpp (ver 1.1) ライブラリとuser1229080の Win32 および x64 プラットフォーム用のテストをビルドしましたが、アサーションはありません。

いくつかの行を追加してコンパイルし、存在しないディレクトリに関連する問題を取り除くために、ファイル パスから "logs" ディレクトリを削除しました。

#include "stdafx.h"

#include <log4cpp/Category.hh>
#include <log4cpp/FileAppender.hh>
#include <log4cpp/OstreamAppender.hh>
#include <log4cpp/BasicLayout.hh>

class Foo
{
    private:
        log4cpp::Appender* _logAppender, *_conAppender;
        log4cpp::Layout* _logAppenderLayout;
    public:
        Foo();
};

Foo::Foo()
{
    _conAppender = new log4cpp::OstreamAppender("con", &std::cout);
    _logAppender = new log4cpp::FileAppender("foo", "bar.log");
    _logAppenderLayout = new log4cpp::BasicLayout();
    _logAppender->setLayout(_logAppenderLayout);

    log4cpp::Category::getRoot().setPriority(log4cpp::Priority::DEBUG);
    log4cpp::Category::getRoot().addAppender(_logAppender);
    log4cpp::Category::getRoot().addAppender(_conAppender);


    // Crash on line below. (but not in msvc2010)
    log4cpp::Category::getRoot().debugStream() << "test" << log4cpp::eol;
}

int main(int argc, char* argv[]) {
    Foo f;

    return 0;
}

アサーションが発生したビジュアル C++ のバージョンはどれですか?

于 2013-10-17T15:13:00.867 に答える