2013-04-12 41 views
0

我試圖用以下方式啓用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"; 
} 

當我到了那裏我嘗試寫「測試」的日誌行了,我得到一個崩潰,說:「調試斷言失敗!」有說法是在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。

+0

也許log4cpp需要的不僅僅是64位版本的配置更改。例如,有許多問題需要關注指針和手柄大小。 –

+0

我在想這可能是這樣的。我現在正在查看其他日誌框架,但是希望有人在64位應用程序中使用log4cpp可以看到這一點。 –

+0

對於遇到此問題的任何人,我無法使其工作。我的解決方案是轉到google-glog https://code.google.com/p/google-glog/。它沒有內置的64位配置,但很容易創建。 –

回答

1

這是舊帖子,但我想這個問題的解決方案可能對某人有用。

很可能你只是忘記了在你的代碼中創建目錄「日誌」

這是關閉的流的問題:你的日誌記錄器不會自動創建目錄,所以,沒有目錄 - >沒有文件 - >打開文件失敗 - >無效的文件句柄 - >例外。您應該手動創建目錄。宏的斷言,沒有更多的信息是悲傷的。

+0

我手動創建日誌目錄,日誌文件予以肯定,並仍然得到了崩潰。沒有問題在32位。我將盡快重新審視這個問題,儘管我發現64位二進制log4cxx我知道的工作。這意味着我不必知道我的構建有什麼問題。 –

+0

好的,我很抱歉。也許你的問題還有另一個目標,令人奇怪的是,我們有不同的causes.Sorry兩個相等的錯誤,但無論我建議用「bar.log」用於測試目的替換「日誌/ bar.log」。 – Yorie

+0

我試過了,沒有區別。另外,我的工作方式在32位版本上運行良好。 –

0

剛剛發現了這個問題,並試圖得到這個斷言。 我已經構建了log4cpp(ver 1.1)庫和user1229080的測試Win32和x64平臺在MSVC2010並沒有得到斷言。

我添加幾行把它編譯,並已刪除的文件路徑「日誌」目錄只是爲了擺脫有關缺席目錄的問題:

#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++版本,你遇到的斷言上?