开源日志系统 log4cplus 安装与使用(一)

log4cplus是一个易于使用的C ++ 日志记录API,log4cplus具有灵活、强大、使用简单、多线程安全的特点。通过将信息划分优先级使其可以面向程序调试、运行、测试、和维护等全生命周期;你可以选择将信息输出到屏幕、文件、甚至是远程服务器;通过指定策略对日志进行定期备份等等。

由于程序中有些错误是逻辑错误,需要在特定情况下才会出现,此时就展现了日志记录的强大之处,我们可以根据日志文件判断程序出问题的地方。而且写程序不加日志说明程序规模还是比较小。

我对日志输出的要求比较简单:

①可以同时输出到文件与终端

②可以在多线程中使用

③日志输出格式可配置

应用平台:linux Qt

应用方式:链接动态库

一、linux下下载与安装

虽然现在最新版本是2.0.4并且支持C++17,但是我下载的是1.2.2。

下载链接:https://github.com/log4cplus/log4cplus/releases

下载完成后解压,全部使用默认参数:

cd log4cplus-x.x.xsudo ./configure sudo makesudo make install

安装成功后,默认的路径lib库路径是/usr/local/lib/,头文件的位置:/usr/local/include/log4cplus。如下图

一、log4cplus 官方资料介绍

学东西的第一手资料还是看官网

1. 官方代码示例(并不是我想要的......)

https://sourceforge.net/p/log4cplus/wiki/CodeExamples/

这里面注意下log4cplus::Initializer initializer; 这个是2.0版本之后才支持

的,我下载的版本使用这句会报错。

2. 程序示例代码路径

/log4cplus/log4cplus-x.x.x/tests

二、控制台输出日志Demo

log4cplus 中一些功能模块:

Layout:布局器,控制输出消息的格式.

Appender:挂接器,与布局器紧密配合,将特定格式的消息输出到所挂接的

设备终端(如控制台,文件)。

Logger:记录器,保存并跟踪对象日志信息变更的实体,当你需要对一个对

象进行记录时,就需要生成一个logger。

使用log4cplus基本步骤:

① log4cplus 初始化

②. 实例化一个appender对象

③. 实例化一个layout对象

④. 将layout对象绑定(attach)到appender对象

⑤. 实例化一个logger对象,调用静态函Logger::getInstance("logger_name")

⑥. 将appender对象绑定(attach)到logger对象,如省略此步骤,标准输出

(屏幕)appender对象会绑定到logger

⑦. 设置logger的优先级,如省略此步骤,各种有限级的消息都将被记录

⑧ 关闭log4cplus 系统

1. 程序Demo

① main函数

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    log4cplus::initialize ();
    helpers::LogLog::getLogLog()->setInternalDebugging(true);

    std::string pattern = "%D{%m/%d/%y %H:%M:%S,%q} [%-5t] [%-5p] - %m%n";
//Appender
    SharedObjectPtr<Appender> append_console(new ConsoleAppender(false,true));
    append_console->setName(LOG4CPLUS_TEXT("Console"));

//Layout
    append_console->setLayout(std::auto_ptr<Layout>(new PatternLayout(pattern)) );

//Logger
    Logger test = Logger::getInstance(LOG4CPLUS_TEXT("dapi"));  
    test.addAppender(append_console);

    for(int i=0; i<LOOP_COUNT; ++i)
    {
//        QThread::msleep(10);
        LOG4CPLUS_DEBUG(test, "Entering loop #" << i);
    }

    // set log level
    test.setLogLevel(DEBUG_LOG_LEVEL);

    Widget w;
    w.show();


    return a.exec();
}

注意new ConsoleAppender(false,true); 如果使用ConsoleAppender()默认参数,那么控制台消息不会实时输出,需要等到缓冲区达到一定大小才会输出。当时这个可调试了好一会。因为我当时需要的效果就是实时输出到控制台与文件。

②按钮槽函数

void Widget::on_pbn_surpise_clicked()
{
    m_clickCount++ ;
    Logger test = Logger::getInstance(LOG4CPLUS_TEXT("test.subtest"));
    LOG4CPLUS_ERROR(test, "click count ~" << m_clickCount);
}

这里展示一下在一处定义,全局使用的效果。

2. 程序运行结果

点击按钮一下,就会有一条日志输出。

下次和大家分享下通过配置输出到文件以及在线程中使用的测试效果。

原文发布于微信公众号 - Pou光明(pou0230)

原文发表时间:2019-09-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券