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