Windows下MinGW跨平台编译和使用log4cpp
Log4cpp 是C++开源日志库,为 C++ 应用程序开发中提供了日志的追踪和调试功能,基于 LGPL 开源协议,移植自 java 的日志项目 log4j, 并在 api 上保持了一致性。
1. 环境
- windows 7 64b + Qt5.7 + MinGW530
- log4cpp: 1.1.3
2. 下载
3.特点
- 可扩展,提供了多种记录方式:文件、命令行、内存、win事件日志…
- 可以动态控制日志级别,进行动态调整
- 多语言支持,C(log4c), C++(log4cpp/log4cplus), java(log4j), python(log4p))
- 平台无关性,源码编译后可以运行在各大主流操作系统上
4. 编译
打开工程后,可以发现包含了多个工程编译项目,不过基本都是基于VS的项目,不是我想要的,需要手动转化成 Qt 项目,也就是编程 pro 形式。
拷贝源码目录下的 include 和 Src 文件夹到自己新建的工程中,主要使用这两部分,其余的先不管。
编写 pro 文件
QT = core
TEMPLATE = lib
TARGET = log4cpp
INCLUDEPATH += $$PWD/.. \
$$PWD/../../boost/ \
DEPENDPATH += $$PWD/..
DEFINES += LOG4CPP_HAVE_BOOST
SOURCES += \
Appender.cpp \
AppenderSkeleton.cpp \
AppendersFactory.cpp \
......
HEADERS += \
win32:{ LIBS += -L -lwsock32 -lws2_32 }
上述引入了 `boost 库路径,并添加了wsock32库!否则编译会出现错误。
编译成功后会生成对应的库文件(静态库只有629KB):

5. 使用
5.1 基本概念
- Catgory (种类)
- Appender (附加目的地)
- Layout (布局)
- Priority (优先级)
- DNC (嵌套的诊断上下文)
5.1.1 Category
Category 级别,优先级可以用来控制日志输出的数量,比如配置级别是 DEBUG ,则任意 log都可以被打印出来,如果配置级别是 ERROR,则只有高于这个级别的才能输出.
Category 真正完成了日志记录功能.
优先级: DEBUG < INFO < WARN < ERROR < FATAL
5.1.2 Appender
Appender(输出源) 负责将 layout 附加的消息 记录到某个输出设备上(比如:文件,socket).
多个 Appender 可以附加到一个 Category 上,这样一个消息就能同时输出到多个设备上
Appender设备:
- log4cpp::IdsaAppender // 发送到IDS或者logger, 详细见 http://jade.cs.uct.ac.za/idsa/
- log4cpp::FileAppender // 输出到文件
- log4cpp::RollingFileAppender // 输出到回卷文件,即当文件到达某个大小后回卷
- log4cpp::OstreamAppender // 输出到一个ostream类
- log4cpp::RemoteSyslogAppender // 输出到远程syslog服务器
- log4cpp::StringQueueAppender // 内存队列
- log4cpp::SyslogAppender // 本地syslog
- log4cpp::Win32DebugAppender // 发送到缺省系统调试器
- log4cpp::NTEventLogAppender // 发送到win 事件日志
5.1.3 Layout
layout 类即布局,其实就是用来控制日志消息以怎么样的格式显示(这些开源库中类名比较怪,就不能直接点么,不就是日志格式么,搞一个 layout )。主要有一下几种格式:
log4cpp::BasicLayout时间戳 + 优先级 + 类别 + NDC 标签 + 日志消息log4cpp::PatternLayout类似C语言中的 printf 格式化输出,可以指定格式输出log4cpp::SimpleLayout优先级 + 日志信息
以上日志格式不太满意,所以需要对其进行升级(自定义),没有办法,世上很难遇上自己满意的东西,遇上喜欢的还要自定义。以下格式应该算是大部分人能接收到的格式:
[2017-12-03 15:10:50:393|ERROR : [fun: int main(int, char**)] [line:32] [time: "15:10:50.389" ] Msg: error test
一般的日志消息需要包含时间戳,消息类型,以及打印该消息的具体文件中函数名称、行数,消息内容。这样的结构基本可以满足日常开发需求。
继承关系:

5.1.4 Priority
优先级在 Category中描述过.
5.1.5 DNC
暂时不了解
5.2 配置文件
使用 log4cpp 有两种方式,一种是自己手动编写配置步骤,比较繁琐,另一种是直接通过配置文件即可完成.

5.3 使用
由于 log4cpp 类名较长,操作不便,所以进行二次分装比较方便
- 读取配置文件
- 实例化 category对象
- 封装日志输出方法
5.3.1 读取配置文件
bool Log4CppUtility::loadConfigFile(QString strConfigFile, QString strParentPath)
{
try
{
QByteArray dataConfigFile = strConfigFile.toLocal8Bit ();
QByteArray dataParentPath = strParentPath.toLocal8Bit ();
log4cpp::PropertyConfigurator::configureEx ( dataConfigFile.data (),
dataParentPath.data ());
}
catch ( log4cpp::ConfigureFailure & e)
{
log4cpp::Category::getRoot ().warn (e.what ());
// qDebug()<<"configureEx problem:"<<e.what ();
return false;
}
return true;
}
5.3.2 实例化Category
bool Log4CppUtility::outputLog(xx,xxx,xxx,...)
{
log4cpp::Category & category = strCategoryName.isEmpty ()?
log4cpp::Category::getRoot ():
log4cpp::Category::getInstance ( strCategoryName.toStdString () );
//日志等级区分
switch (Level) {
case LP_EMERG:
{
category.emerg ( strMsg.toStdString () );
bOutputMsg = category.isEmergEnabled ();
}
break;
case LP_ALERT:
{
category.alert ( strMsg.toStdString () );
bOutputMsg = category.isAlertEnabled ();
}
break;
//其他类似......
}
5.3.1 日志输出方法
编写一个宏定义
#define LOGERROR(format, ...) Log4CppUtility::formateLog(__FILE__, __PRETTY_FUNCTION__, __LINE__, CATEGORYNAME, Log4CppUtility::LP_ERROR, format, ##__VA_ARGS__);
//其他类似...
调用:
#include <QDebug>
#include <QCoreApplication>
#include "loginclib.h"
#include <QThread>
class MyThread:public QThread
{
public:
MyThread()
{
m_nCount = 10000;
}
~MyThread(){}
protected:
virtual void run()
{
while (m_nCount)
{
LOGERROR("error:"+QString::number (m_nCount));
m_nCount--;
msleep (4);
}
}
private:
int m_nCount;
};
int main(int argc, char *argv[])
{
QCoreApplication app(argc ,argv);
qDebug()<<"=====start test log=====";
QString strFilePath = QCoreApplication::applicationDirPath ()+"/";
QString logConfig = "LogProperty.conf";
logConfig = strFilePath + logConfig;
if ( !Log4CppUtility::loadConfigFile ( logConfig ))
{
qDebug()<<"set path error!";
return 0;
}
MyThread thread;
thread.start ();
qDebug()<<"=====end test log=====";
int ret = app.exec ();
Log4CppUtility::shutDown ();
return ret;
}
新建一个线程不断的输出日志到文件(这里只显示5条记录).
使用是很方便的:
LOGERROR("this is error info");
实际结果:

http://kevinlq.com/2017/12/03/build_use_log4cpp/#2-下载
Windows下MinGW跨平台编译和使用log4cpp的更多相关文章
- Qt5.8 在windows下mingw静态编译
官方对编译一些条件介绍:https://doc.qt.io/qt-5/windows-requirements.html 在默认情况下,用QtCreator编译程序时,使用的是动态编译.编译好的程序在 ...
- windows 7下mingw+msys编译ffmpeg
windows 7下mingw+msys编译ffmpeg 1-->下载安装MingW,mingw-get-inst-20120426.exe http://sourceforge.ne ...
- win下 golang 跨平台编译
mac 下编译其他平台的执行文件方式请参看这篇文章,http://www.cnblogs.com/ghj1976/archive/2013/04/19/3030703.html 本篇文章是win下的 ...
- windows下用vs2010编译ffmpeg
转载自;http://q1q2q3q4q5q6ln.blog.163.com/blog/static/500794332014666536283/ (注意:请务必先阅读:七,后记补充:) ffmpeg ...
- 【转】Windows下使用VS2008编译OpenCV 2.1 添加Intel TBB和Python支持
Windows下使用VS2008编译OpenCV2.1 添加Intel TBB和Python支持 步骤: 1.仔细阅读OpenCV官网上的InstallGuide:http://opencv.will ...
- 实践详细篇-Windows下使用VS2015编译的Caffe训练mnist数据集
上一篇记录的是学习caffe前的环境准备以及如何创建好自己需要的caffe版本.这一篇记录的是如何使用编译好的caffe做训练mnist数据集,步骤编号延用上一篇 <实践详细篇-Windows下 ...
- Windows下从源代码编译Skia
在PPAPI里面画图,能够结合第三方的图形库.比方Cairo.Skia. Google Chrome.Chromium和Android都使用Skia作为画图引擎.我也来试试Skia,先过编译关. fo ...
- Windows下MinGW编译Qt4
还真不是吹,这个问题折磨我一天……前些天转载了一篇关于<Eclipse+Qt开发环境设置>和<Eclipse+MinGW+Qt开发环境设置>两片文章,里面讲述了QT的开源版本q ...
- windows 下FFMPEG的编译方法 附2012-9-19发布的FFMPEG编译好的SDK下载
经过一晚上加一上午的奋斗,终于成功编译出了最新版的FFMPEG,下面是我编译的心得,因为是最新的,应该会对大家有用,编译的FFMPEG的版本是0.11.2,2012-09-19新发布的版本 平台:WI ...
随机推荐
- 毕业两年做到测试经理的经历总结- 各个端的自动化,性能测试结合项目具体场景实战,分析客户反馈的Bug
前言 最近看到行业的前辈都分享一些过往的经历来指导我们这些测试人员,我很尊敬我们的行业前辈,没有他们在前面铺路,如今我们这帮年轻的测试人估计还在碰壁或摸着石头过河,结合前辈们的经验,作为年轻的测试人也 ...
- IR_drop
IR压降是指出现在集成电路中电源和地网络上电压下降或升高的一种现象.随着半导体工艺的演进金属互连线的宽度越来越窄,导致它的电阻值上升,所以在整个芯片范围内将存在一定的IR压降.IR压降的大小决定于从电 ...
- MySQL的安装及使用教程
MySQL的安装及使用教程 一. MySQL的下载及安装 首先登陆MySQL的官网,选择Downloads→Windows→MySQL Installer→Windows(x86,32-bit),M ...
- 将App程序发布到苹果App Store
发布iOS应用程序到App Store - 前期工作 要发布iOS应用程序到App Store首先需要一个iOS developer帐号,账号是收费的,$99美元/年.即便是免费应用也需要一个开发者账 ...
- php实现字符串替换
php实现字符串替换 一.总结 二.php实现字符串替换 代码一: //字符串替换 function str_replace($substr , $newsubstr, $str) { $m = st ...
- Longest Increasing Subsequences(最长递增子序列)的两种DP实现
一.本文内容 最长递增子序列的两种动态规划算法实现,O(n^2)及O(nlogn). 二.问题描述 最长递增子序列:给定一个序列,从该序列找出最长的 升序/递增 子序列. 特点:1.子序列不要 ...
- 解决maven项目找不到maven依赖的解决办法
不同的IDE对应的.classpath中的maven声明也不一样,这样就会导致项目找不到maven依赖. 即Java Build Path--->Libraries中找不到Maven Depen ...
- android SQLite 使用实例
Android作为眼下主流的移动操作系统,全然符合SQLite占用资源少的优势,故在Android平台上,集成了一个嵌入式关系型数据库-SQLite.假设想要开发 Android 应用程序,须要在 A ...
- 一步步学习Linux多任务编程
系统调用 01.什么是系统调用? 02.Linux系统调用之I/O操作(文件操作) 03.文件描述符的复制:dup(), dup2() 多进程实现多任务 04.进程的介绍 05.Linux可执行文件结 ...
- Linux删除非空目录
Linux下如何删除非空目录 这个问题很basic,不过还是困扰了我一段时间.(这里主要讨论的是命令行模式下)我本来觉得应该使用命令 rmdir但是发现它无法删除非空的目录.后来发现了原来应该使用 ...