以前在做java开发时一直都在用log4j,它配置灵活,功能强大。如果C++中也存在类似配置的日志库,则可以省去不少学习的时间。在C++中的确有这样的一些库,本文就拿其中用的最多的log4cplus来讲讲如何使用它。

项目主页:
https://sourceforge.net/p/log4cplus/wiki/Home/
https://github.com/wilx/log4cplus

可以从以上两个地址中下载最新的文件,本文使用的最新版本是log4cplus-2.0.2。下载完成并解压后,可以在log4cplus-2.0.2目录下找到msvc14目录,进入后找到log4cplus.sln文件。先确认已安装Visual Studio 2015以上版本,然后双击打开此文件,就会看到如下内容:

其中,log4cplus可以生成动态库,log4cplusS可以生成静态库。本文要在64位系统中生成测试用的静态库,所以配置成Debug x64,字符集设置成Unicode。然后编译log4cplusS,会在msvc14\x64\bin.Debug下生成log4cplusSD.lib文件。

下面是测试代码:

#include <vector>
#include <thread>
#include <chrono>
#include <string>
#include <memory>
#include <ctime>
#include <iomanip>#include <log4cplus/logger.h>
#include <log4cplus/loggingmacros.h>
#include <log4cplus/configurator.h>
#include <log4cplus/initializer.h>
#include <log4cplus/loglevel.h>
#include <log4cplus/ndc.h>using namespace std;
using std::chrono::system_clock;using namespace log4cplus;
using namespace log4cplus::helpers;string getTime() {system_clock::time_point tp = system_clock::now();time_t raw_time = system_clock::to_time_t(tp);struct tm  *timeinfo = std::localtime(&raw_time);std::stringstream ss;ss << std::put_time(timeinfo, "%Y-%m-%d %H:%M:%S");return ss.str();
}void doTestRun(int i) {static log4cplus::Logger logger = log4cplus::Logger::getInstance(LOG4CPLUS_TEXT("main"));string threadName = "doRun-" + to_string(i);// 使用NDC给线程设置名称log4cplus::NDCContextCreator _ndc(LOG4CPLUS_STRING_TO_TSTRING(threadName));while (true) {this_thread::sleep_for(3s);// 如果不加u8,日志文件会是GB2312格式string info = u8"你好:" + getTime();LOG4CPLUS_WARN(logger, LOG4CPLUS_STRING_TO_TSTRING(info));}
}int main() {log4cplus::Initializer initializer;PropertyConfigurator pc(LOG4CPLUS_TEXT("log4cplus.properties"));pc.configure();vector<std::thread> threadVector;for (int i = 0; i < 5; i++) {threadVector.emplace_back(doTestRun, i);}for (vector<std::thread>::iterator itr = threadVector.begin(); itr != threadVector.end(); itr++) {itr->join();}return 0;
}

配置文件log4cplus.properties中的内容:

log4cplus.rootLogger=DEBUG, STDOUT

log4cplus.appender.STDOUT=log4cplus::ConsoleAppender
log4cplus.appender.STDOUT.layout=log4cplus::TTCCLayout

# 对ALL_MSGS使用异步Appender
log4cplus.appender.ALL_MSGS=log4cplus::AsyncAppender
# 异步Appender的队列大小
log4cplus.appender.ALL_MSGS.QueueLimit=10000
# 异步Appender中具体使用RollingFileAppender作为写文件的FileAppender
log4cplus.appender.ALL_MSGS.Appender=log4cplus::DailyRollingFileAppender
# 应用重新启动后是要清空日志文件再写入,还是要接在日志文件后面接着写入
log4cplus.appender.ALL_MSGS.Appender.Append=false
# 设置FileAppender的缓存大小
log4cplus.appender.ALL_MSGS.Appender.BufferSize=10000
# 达到缓存上限后是否立即写入
log4cplus.appender.ALL_MSGS.Appender.ImmediateFlush=true
# 写的文件路径和文件名
log4cplus.appender.ALL_MSGS.Appender.File=d:/Temp/test.log
# 设置每个日志文件的最大容量
log4cplus.appender.ALL_MSGS.Appender.MaxFileSize=250KB
# 日志文件达到最大容量后,重命名文件以备份,设置最大备份日志文件数
log4cplus.appender.ALL_MSGS.Appender.MaxBackupIndex=10
# 指定日志文件回滚周期
log4cplus.appender.ALL_MSGS.Appender.Schedule=MINUTELY
# 当日志文件达到回滚周期时,则重新生成新的日志文件,旧的日志文件会加上.%Y%m%d_%H%M后缀
log4cplus.appender.ALL_MSGS.Appender.DatePattern=%Y%m%d_%H%M
# 设置输出使用的locale
# log4cplus.appender.ALL_MSGS.Appender.Locale=en_US.UTF-8
# 自定义FileAppender的输出格式
log4cplus.appender.ALL_MSGS.Appender.layout=log4cplus::PatternLayout
# 自定义FileAppender的输出格式的样式
log4cplus.appender.ALL_MSGS.Appender.layout.ConversionPattern=%D{%Y-%m-%d %H:%M:%S.%q}%5p[%5t|%x][%l][%c]- %m%n

# category为main的日志
log4cplus.logger.main=DEBUG, ALL_MSGS
log4cplus.additivity.main=false

代码运行结果保存为UTF-8格式:

2018-10-18 18:41:00.898 WARN[29816|doRun-3][d:\vc_projects\log4cplus.cpp:45][main]- 你好:2018-10-18 18:41:00
2018-10-18 18:41:00.902 WARN[18180|doRun-4][d:\vc_projects\log4cplus.cpp:45][main]- 你好:2018-10-18 18:41:00
2018-10-18 18:41:00.902 WARN[17704|doRun-0][d:\vc_projects\log4cplus.cpp:45][main]- 你好:2018-10-18 18:41:00
2018-10-18 18:41:00.904 WARN[28388|doRun-2][d:\vc_projects\log4cplus.cpp:45][main]- 你好:2018-10-18 18:41:00
2018-10-18 18:41:00.905 WARN[  5164|doRun-1][d:\vc_projects\log4cplus.cpp:45][main]- 你好:2018-10-18 18:41:00

在代码中通过NDC给每个新创建的线程设置了线程名,这样通过%x和%t可以在日志中同时打印出线程名和线程编号。

PatterLayout的完整说明可在如下地址找到:
https://log4cplus.sourceforge.io/docs/html/classlog4cplus_1_1PatternLayout.html

log4cplus是通过如下的宏生成日志的:

LOG4CPLUS_TRACE (logger, "printMessages()");
    LOG4CPLUS_DEBUG (logger, "This is a DEBUG message");
    LOG4CPLUS_INFO (logger, "This is a INFO message");
    LOG4CPLUS_WARN (logger, "This is a WARN message");
    LOG4CPLUS_ERROR (logger, "This is a ERROR message");
    LOG4CPLUS_FATAL (logger, "This is a FATAL message");

另外,需要注意以下几点:
1.打印字符串常量要使用LOG4CPLUS_TEXT,打印string要使用LOG4CPLUS_STRING_TO_TSTRING。
2.编译代码时要使用Unicode字符集。
3.使用thread创建的线程只有线程编号,没有线程名,可以使用NDC给线程设置一个名字,这样查看日志时方便。

参考文档

CodeExamples
Log4cplus选型和使用指南
log4cplus 使用方法 配置
PatternLayout

C++:日志库log4cplus 2.0的使用说明相关推荐

  1. C++日志库log4cplus:SocketAppender记录日志到log Server

    转载请注明出处:http://blog.csdn.net/jmppok/article/details/17375057 1.问题 C++程序在后台运行时,可通过log4cplus记录日志.当C++程 ...

  2. 开源日志库log4cplus+VS2008使用整理

    一.简介  log4cplus是C++编写的开源的日志系统,功能非常全面.本文介绍如何在Windows+VS2008中使用该日志库.   二.下载   可从网站[url]http://log4cplu ...

  3. c++日志库log4cplus使用

    项目中需要打印log,方便程序调试和问题定位分析.C++实现的log4cplus日志库是一种易于使用的C ++日志记录API,可提供线程安全,灵活且任意粒度的日志管理和配置控制. 下面介绍一下在lin ...

  4. C/C++日志库-log4cplus(log4j的C++版本)

      Log4j以其简单的使用方式(引入一个jar包,一行代码即可调用),灵活(可通过配置文件随意配置),功能强大(多个级别,可配置多个输出目的地,Console,File,系统日志,远端的LogSer ...

  5. 2017年4月25日(日志库glog)

    原博客:http://www.cnblogs.com/kuliuheng/p/5046101.html 使用文档说明:http://www.yeolar.com/note/2014/12/20/glo ...

  6. 日志库EasyLogging++学习系列(1)—— 简要介绍

    对于有开发经验的程序员来说,记录程序执行日志是一件必不可少的事情.通过查看和分析日志信息,不仅可以有效地帮助我们调试程序,而且当程序正式发布运行之后,更是可以帮助我们快速.准确地定位问题.在现在这个开 ...

  7. Log4cplus 1.0.3 Android版本编译

    在Android上使用so库时需要记录日志,当然可以直接通过C/C++文件操作进行,也可以使用成熟的日志库来完成. Log4cplus是C/C++跨平台库,性能.代码可读性尚可,决定采用. 选用版本1 ...

  8. 自制简易C++日志库——优雅地调试VINS-mono

    天下之患,莫大于不知其然而然.--(宋)苏轼<策略> 最近一直在研究VINS-mono,由于它是基于ROS(Robot Operating System)开发的,运行的时候需要启动rviz ...

  9. go zap日志库的使用,以及封装。

    go zap日志库使用说明 及 封装 1 zap日志的基本使用 1.0 zap简介 1.1 日志介绍 1.2 为什么选择zap日志 1.3 zap的安装 1.4 创建实例-两种类型 1.4.1 Log ...

最新文章

  1. PHP开启session的函数,ThinkPHP中session函数详解
  2. 【鸿蒙 HarmonyOS】UI 组件 ( Text 组件 )
  3. SpringBoot中对thymeleaf的时间进行格式化显示
  4. Java_cpu飙升排查
  5. PyTorch常用代码段整理合集
  6. OAuth2 实现单点登录 SSO
  7. linux spring mvc tomcat配置,Spring MVC配置详解
  8. 马上工作了,想问下要注意哪些问题?
  9. 怎么保存php格式,把php代码保存到php文件实现方法
  10. mysql创建视图语句_MySQL创建视图的语法格式
  11. vue项目IE浏览器中打不开,为空白页
  12. 从零开始搭建聊天机器人网页—Vue
  13. windows10开机时出现你的设备遇到问题,需要重启
  14. 让一台电脑死机至少需要几行代码
  15. 【渝粤题库】国家开放大学2021春2721乡镇行政管理题目
  16. 【日记】20220219启动项目蓝屏
  17. Quectel EC600N-CN 中尺寸物联网首选LTE Cat 1模块[移远通信]
  18. nagios 服务端与客户端监控安装与详细配置,各配置文件详解
  19. 面试复习题--锁的细枝末节
  20. 创业公司最应该注重的是什么?

热门文章

  1. windows,打印机无打印任务,仍不断打印
  2. 菜鸟教程之html5学习,Canvas画布、渐变,数学公式、符号的书写
  3. 转载 | 年度盘点!Flink 社区全年的精华内容都在这里啦
  4. 处理7z格式的001 002 文件
  5. python抓取视频真实地址_快手批量获取真实地址python
  6. 开发中的各种时间格式转换(二)
  7. 为知笔记(PC端) 康奈尔模板各栏间距调整
  8. 汽车高级驾驶辅助系统ADAS功能盘点
  9. 有限体积法(2)——二维、三维扩散方程的离散推导
  10. Linux:使用upower命令查看电池信息