log4cplus

最近在使用log4cplus,gitHub上已经更新到2.0以后,但是网上基本上都是以前版本的教程。
所以遇到了一些问题,这里记录下来。

比如,以前的标准使用流程如下:

#include <log4cplus/configurator.h>
#include <log4cplus/fileappender.h>
#include <log4cplus/initializer.h>
#include <log4cplus/layout.h>
#include <log4cplus/logger.h>
#include <log4cplus/loggingmacros.h>

int main(int argc, char* argv[]) {
    /* step 1: Instantiate an appender object */
    SharedAppenderPtr _append(new FileAppender("Test.log"));
    _append->setName("filelogtest");

    /* step 2:  Instantiate a layout object */
    std::string  pattern = "%d{%m/%d/%y  %H:%M:%S}  - %m [%l]%n";
    std::auto_ptr<Layout>  _layout(new  PatternLayout(pattern));

    /* step 3: Attach  the layout object to the appender */
    _append->setLayout(_layout);

    /* step 4:  Instantiate a logger object */
    Logger _logger =  Logger::getInstance("test_logger.subtest");

    /* step 5: Attach the appender object to the  logger  */
    _logger.addAppender(_append);

    /* log activity */
    LOG4CPLUS_DEBUG(_logger, "This is the  FIRST log message...");
    LOG4CPLUS_WARN(_logger, "This is the  SECOND log message...");

    return 0;
}

ERROR1:auto_ptr is deprecated

①错误提示:
auto_ptr<Layout> is deprecated,use unique_ptr instead
②原因:

意思是auto_ptr已经被弃用,现在使用unique_ptr

③解决方法:

于是将auto_ptr改为unique_ptr:

-- std::auto_ptr<Layout>  _layout(new  PatternLayout(pattern));
++ std::unique_ptr<Layout>  _layout(new  PatternLayout(pattern));

ERROR2:unique_ptr(const unique_ptr) is deleted

①错误提示:

这个时候会报第二个错误:

error: use of deleted function ‘std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) \
[with _Tp = log4cplus::Layout; _Dp = std::default_delete<log4cplus::Layout>]’

②原因:

unique_ptr拥有它所指向的对象,在某一时刻,只能有一个unique_ptr指向特定的对象。当unique_ptr被销毁时,它所指向的对象也会被销毁。因此不允许多个unique_ptr指向同一个对象,所以不允许拷贝与赋值。

③解决方法:

只能移动unique_ptr。这意味着,内存资源所有权将转移到另一 unique_ptr,并且原始 unique_ptr 不再拥有此资源。

--  _append->setLayout(_layout);
++  _append->setLayout(std::move(_layout));
log4cplus 2.0 : unique_ptr(const unique_ptr) is deleted
Tagged on:     

发表评论

邮箱地址不会被公开。 必填项已用*标注