Сбой отладочного утверждения при попытке записи в поток Log4cpp

Я пытаюсь включить ведение журнала с 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!" Утверждение находится в строке 67: f: \ dd \ vctools \ crt_bld_self_64_amd64 \ crt \ src \ write.c.

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

Я создал каталог журналов и файл bar.log, чтобы убедиться, что он существует. Я также подтвердил, что и мое приложение, и библиотека были созданы как 64-битные многопоточные библиотеки отладки. В источнике log4cpp не было 64-битной сборки, поэтому я создал ее на основе 32-битной конфигурации сборки. Я использую последнюю версию log4cpp.

2 ответа

Это старый пост, но я думаю, что решение этой проблемы может быть полезным для кого-то.

Скорее всего, вы просто забыли создать директорию "logs", которая есть в вашем коде.

Это проблема закрытого потока: регистратор не создает автоматически каталоги для ваших журналов, поэтому нет каталога -> нет файла -> ошибка открытия файла -> неверный обработчик файла -> исключение. Вы должны создать каталоги вручную. Утверждения макросов и отсутствие дополнительной информации печально.

Просто обнаружил этот вопрос и попытался получить это утверждение. Я собрал библиотеку log4cpp (версия 1.1) и тест user1229080 для платформ Win32 и x64 в MSVC2010 и не получил никакого подтверждения.

Я добавил несколько строк для его компиляции и удалил dir "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;
}

На какой версии Visual C++ вы столкнулись с утверждением?

Другие вопросы по тегам