Я пытаюсь включить ведение журнала с 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.
Это старый пост, но я думаю, что решение этой проблемы может быть полезным для кого-то.
Скорее всего, вы просто забыл создать каталог «логи» это в вашем коде.
Это проблема закрытого потока: регистратор не создает автоматически каталоги для ваших журналов, поэтому нет каталога -> нет файла -> ошибка открытия файла -> недопустимый обработчик файла -> исключение. Вы должны создать каталоги вручную. Утверждения макросов и отсутствие дополнительной информации печально.
Просто обнаружил этот вопрос и попытался получить это утверждение.
Я построил библиотеку 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 ++ вы столкнулись с утверждением?