问题描述:
使用单元测试测试log4cpp相关代码,退出是log4gcpp析构报错。 下面是个简单的log4cpp使用,标准输出和文件输出,运行功能都是可以的,但是析构时报错#1 0x00007ffff7b9ab9c in log4cpp::LayoutAppender::~LayoutAppender() () from …/output/lib/liblog4cpp.so.5
#2 0x00007ffff7b9d8b8 in log4cpp::OstreamAppender::~OstreamAppender() () from …/output/lib/liblog4cpp.so.5
#include <iostream>
#include <log4cpp/Category.hh>
#include <log4cpp/OstreamAppender.hh>
#include <log4cpp/Priority.hh>
#include <log4cpp/PatternLayout.hh>
#include <log4cpp/RollingFileAppender.hh>
using namespace std;
int main(int argc, char const *argv[])
{
log4cpp::OstreamAppender app("osAppender", &cout);
log4cpp::PatternLayout *layout = new log4cpp::PatternLayout();
layout->setConversionPattern("%d: %p %c : %m%n");
app.setLayout(layout);
log4cpp::RollingFileAppender* rollfileAppender = new log4cpp::RollingFileAppender("roAppender", "test.log", 1024, 4);
rollfileAppender->setLayout(layout);
log4cpp::Category &root = log4cpp::Category::getRoot();
log4cpp::Category &infoCategory = root.getInstance(string(argv[0]));
infoCategory.addAppender(app);
infoCategory.addAppender(rollfileAppender);
infoCategory.setPriority(log4cpp::Priority::INFO);
infoCategory.info("system is running...");
infoCategory.warn("system has got a warn...");
infoCategory.error("system has got an error...");
infoCategory.fatal("system has crashed....");
log4cpp::Category::shutdown();
return 0;
}
原因分析:
根据分析释放LayoutAppender时出错,根据应用,两个Appender使用了同一个LayoutAppender,修改每个appender使用独立的LayoutAppender,测试通过。总结下来还是自己使用的问题,踩了一个坑记录一下。解决方案:
#include <iostream>
#include <log4cpp/Category.hh>
#include <log4cpp/OstreamAppender.hh>
#include <log4cpp/Priority.hh>
#include <log4cpp/PatternLayout.hh>
#include <log4cpp/RollingFileAppender.hh>
using namespace std;
int main(int argc, char const *argv[])
{
log4cpp::OstreamAppender app("osAppender", &cout);
log4cpp::PatternLayout *layout = new log4cpp::PatternLayout();
layout->setConversionPattern("%d: %p %c : %m%n");
app.setLayout(layout);
log4cpp::PatternLayout *layout2 = new log4cpp::PatternLayout(); //使用独立的layout供新的appender使用
layout2->setConversionPattern("%d: %p %c : %m%n");
log4cpp::RollingFileAppender* rollfileAppender = new log4cpp::RollingFileAppender("roAppender", "test.log", 1024, 4);
rollfileAppender->setLayout(layout2);
log4cpp::Category &root = log4cpp::Category::getRoot();
log4cpp::Category &infoCategory = root.getInstance(string(argv[0]));
infoCategory.addAppender(app);
infoCategory.addAppender(rollfileAppender);
infoCategory.setPriority(log4cpp::Priority::INFO);
infoCategory.info("system is running...");
infoCategory.warn("system has got a warn...");
infoCategory.error("system has got an error...");
infoCategory.fatal("system has crashed....");
log4cpp::Category::shutdown();
return 0;
}