Linux C++,使用log4cpp记录日志示例详解

本文主要说明 log4cpp 使用中的配置及调用方法。过程中,会调用 log4cpp开源代码生成的.so,关于如何调用.so,可参考《Linux环境下,创建.so动态链接库 代码实例》

https://aduandniuniu.blog.csdn.net/article/details/123458447?spm=1001.2014.3001.5502

Linux下,还有其他的日志记录开源工具包,比如:spdlog,使用过程都比较类似。 可根据自身情况,灵活选择即可。关于spdlog的使用方法,可参考:《Ubuntu C++, 使用spdlog记录日志示例详解》

https://aduandniuniu.blog.csdn.net/article/details/125423672

log4cpp 是比较普遍使用的开源日志记录模块。目前有各种平台下的版本,可用于JAVA、C++、C#等各种开发语言。。本文重点详细说明在Linux 下C++开发示例。

  • 1、ini配置文件格式说明
  • 2、封装log4cpp日志接口CLogRecord(.h、.cpp)
  • 3、C++调用代码

1、ini配置文件格式说明

示例中,举例了同时对两个日志对象进行了说明。注意其中的: appender1、appender2,A1、A2的定义之处。

  • fileName: 设置生成的日志文件名称及路径
  • maxFileSize:设置单个日志文件大小
  • maxBackupIndex:设置日志文件备份个数,超过个数,自动循环记录
[log4cpp]
rootCategory=DEBUG,appender1
additivity.rootCategory=falseappender.appender1=RollingFileAppender
appender.appender1.fileName=/home/log/logTrafficControlServer.log
appender.appender1.maxFileSize=10485780
appender.appender1.maxBackupIndex=10
appender.appender1.layout=PatternLayout
appender.appender1.layout.ConversionPattern=$%5p %d{%Y-%m-%d %H:%M:%S.%l}@%m%n
category.A1=DEBUG,appender1
additivity.A1=falseappender.appender2=RollingFileAppender
appender.appender2.fileName=/home/log/logTrafficControlServer_TimerDataTrans.log
appender.appender2.maxFileSize=10485780
appender.appender2.maxBackupIndex=10
appender.appender2.layout=PatternLayout
appender.appender2.layout.ConversionPattern=$%5p %d{%Y-%m-%d %H:%M:%S.%l}@%m%n
category.A2=DEBUG,appender2
additivity.A2=false

2、封装log4cpp日志接口CLogRecord

2.1 CLogRecord.h

/** CLogOper.h**  Created on: 2022-02-16*      Author:*/
#ifndef LOGMODULE_LOGRECORD_H
#define LOGMODULE_LOGRECORD_Hclass CLogRecord {public:CLogRecord();virtual ~CLogRecord();
public:void GetLogFileName(const char* pszLogFileDir, const char* pszDeviceCode,int iFileNum, char* pszLogFileName);//获得日志的文件名/*! \fn bool CLogRecord::SetConfigureFile(const char* pszConfigureFileName, const char* pszInstanceName, const char* pszLogFileName, int iMaxFileSize, int iMaxBackupIndex, const char* pszPriority)* \brief 设置日志配置文件* \param[in]     pszConfigureFileName* \param[in]    pszInstanceName* \param[in]     pszLogFileName* \param[in]      iMaxFileSize* \param[in]    iMaxBackupIndex* \param[in]     pszPriority* \return        true: 初始化成功;false:初始化失败* \author* \date       2022-02-17*/bool SetConfigureFile(const char* pszConfigureFileName,const char* pszInstanceName, const char* pszLogFileName,int iMaxFileSize = 10485760, int iMaxBackupIndex = 10,const char* pszPriority = "DEBUG");//设置日志配置文件/*! \fn bool CLogRecord::InitLogInstance(const char* pszConfigureFileName, const char* pszInstanceName)* \brief 初始化日志实例* \param[in]    pszConfigureFileName* \param[in]    pszInstanceName* \return        true: 初始化成功;false:初始化失败* \author* \date       2022-02-17*/bool InitLogInstance(const char* pszConfigureFileName,const char* pszInstanceName);//初始化日志实例//日志记录:DEBUG等级void LogDebug(const char* pszStringLog, ...);//日志记录:INFO等级void LogInfo(const char* pszStringLog, ...);//日志记录:WARN等级void LogWarn(const char* pszStringLog, ...);//日志记录:ERROR等级void LogError(const char* pszStringLog, ...);//日志记录:FATAL等级void LogFatal(const char* pszStringLog, ...);protected:void* m_hCategory; //生成实例的句柄
};#endif /* LOGMODULE_LOGRECORD_H */

CLogRecord.cpp

/** CLogOper.cpp**  Created on: 2022-02-16*      Author:
*/#include "log4cpp/Category.hh"
#include "log4cpp/PropertyConfigurator.hh"
#include "log4cpp/PatternLayout.hh"
#include "log4cpp/RollingFileAppender.hh"
#include "log4cpp/Priority.hh"#include "CLogRecord.h"#define LOG_OPER_MAX_SIZE 204800CLogRecord::CLogRecord() {// TODO Auto-generated constructor stubm_hCategory = NULL;}CLogRecord::~CLogRecord() {// TODO Auto-generated destructor stub
}//获得日志的文件名
void CLogRecord::GetLogFileName(const char* pszLogFileDir,const char* pszDeviceCode, int iFileNum, char* pszLogFileName) {// TODO Auto-generated destructor stub
}/*! \fn bool CLogRecord::SetConfigureFile(const char* pszConfigureFileName, const char* pszInstanceName, const char* pszLogFileName, int iMaxFileSize, int iMaxBackupIndex, const char* pszPriority)* \brief 设置日志配置文件* \param[in]      pszConfigureFileName* \param[in]    pszInstanceName* \param[in]     pszLogFileName* \param[in]      iMaxFileSize* \param[in]    iMaxBackupIndex* \param[in]     pszPriority* \return        true: 初始化成功;false:初始化失败* \author* \date       2022-02-17*/
bool CLogRecord::SetConfigureFile(const char* pszConfigureFileName, const char* pszInstanceName,const char* pszLogFileName, int iMaxFileSize, int iMaxBackupIndex, const char* pszPriority)
{if(m_hCategory){delete (log4cpp::Category*)m_hCategory;m_hCategory = NULL;}bool bCfgExists = true;// 1 读取解析配置文件// 读取出错, 完全可以忽略,可以定义一个缺省策略或者使用系统缺省策略// BasicLayout输出所有优先级日志到ConsoleAppendertry {log4cpp::PropertyConfigurator::configure(pszConfigureFileName);} catch (log4cpp::ConfigureFailure& f) {std::cout << "Configure Problem " << f.what() << std::endl;bCfgExists = false;}bool bCreateNewCategory = false;if (bCfgExists) {m_hCategory = log4cpp::Category::exists(std::string(pszInstanceName));if (m_hCategory == NULL) {bCreateNewCategory = true;}} else {bCreateNewCategory = true;}if (bCreateNewCategory) {log4cpp::PatternLayout* pLayout1 = new log4cpp::PatternLayout();pLayout1->setConversionPattern("$%5p %d{%Y-%m-%d %H:%M:%S.%l}@%m%n");log4cpp::RollingFileAppender* rollfileAppender =new log4cpp::RollingFileAppender("RollingFileAppender",pszLogFileName, iMaxFileSize, iMaxBackupIndex);rollfileAppender->setLayout(pLayout1);m_hCategory = &(log4cpp::Category::getInstance(std::string(pszInstanceName)));((log4cpp::Category*) m_hCategory)->addAppender(rollfileAppender);((log4cpp::Category*) m_hCategory)->setAdditivity(false);try {log4cpp::Priority::Value valPriority = log4cpp::Priority::getPriorityValue(pszPriority);((log4cpp::Category*) m_hCategory)->setPriority(valPriority);} catch (...) {std::cout << "Unknown Priority \" " << pszPriority << "\""<< std::endl;}}//m_hCategory = log4cpp::Category::exists(std::string(pszInstanceName));if (m_hCategory == NULL)return false;return true;
}/*! \fn bool CLogRecord::InitLogInstance(const char* pszConfigureFileName, const char* pszInstanceName)* \brief 初始化日志实例* \param[in]    pszConfigureFileName* \param[in]    pszInstanceName* \return        true: 初始化成功;false:初始化失败* \author* \date       2022-02-17*/
bool CLogRecord::InitLogInstance(const char* pszConfigureFileName, const char* pszInstanceName)
{if (m_hCategory == NULL){// 1 读取解析配置文件// 读取出错, 完全可以忽略,可以定义一个缺省策略或者使用系统缺省策略// BasicLayout输出所有优先级日志到ConsoleAppendertry {log4cpp::PropertyConfigurator::configure(pszConfigureFileName);} catch (log4cpp::ConfigureFailure& f) {//std::cout << "Configure Problem " << f.what() << std::endl;return false;}m_hCategory = log4cpp::Category::exists(std::string(pszInstanceName));if (m_hCategory == NULL)return false;}return true;
}void CLogRecord::LogDebug(const char* pszStringLog, ...) {if (m_hCategory) {char szTmpBuf[LOG_OPER_MAX_SIZE] = { 0 };int offset = 0;va_list va;va_start(va,pszStringLog);vsprintf(szTmpBuf + offset, pszStringLog, va);va_end(va);((log4cpp::Category*) m_hCategory)->debug(szTmpBuf);}
}void CLogRecord::LogInfo(const char* pszStringLog, ...) {if (m_hCategory) {char szTmpBuf[LOG_OPER_MAX_SIZE] = { 0 };int offset = 0;va_list va;va_start(va,pszStringLog);vsprintf(szTmpBuf + offset, pszStringLog, va);va_end(va);((log4cpp::Category*) m_hCategory)->info(szTmpBuf);}
}void CLogRecord::LogWarn(const char* pszStringLog, ...) {if (m_hCategory) {char szTmpBuf[LOG_OPER_MAX_SIZE] = { 0 };int offset = 0;va_list va;va_start(va,pszStringLog);vsprintf(szTmpBuf + offset, pszStringLog, va);va_end(va);((log4cpp::Category*) m_hCategory)->warn(szTmpBuf);}
}void CLogRecord::LogError(const char* pszStringLog, ...) {if (m_hCategory) {char szTmpBuf[LOG_OPER_MAX_SIZE] = { 0 };int offset = 0;va_list va;va_start(va,pszStringLog);vsprintf(szTmpBuf + offset, pszStringLog, va);va_end(va);((log4cpp::Category*) m_hCategory)->error(szTmpBuf);}
}void CLogRecord::LogFatal(const char* pszStringLog, ...) {if (m_hCategory) {char szTmpBuf[LOG_OPER_MAX_SIZE] = { 0 };int offset = 0;va_list va;va_start(va,pszStringLog);vsprintf(szTmpBuf + offset, pszStringLog, va);va_end(va);((log4cpp::Category*) m_hCategory)->fatal(szTmpBuf);}
}

3、C++调用代码

CLogRecord log_record;
CLogRecord log_record_timer_datatrans;bool InitLog()
{std::string log_config_file_name = "/home/testuser/log/LogSetting.ini"; //can ignorestd::string log_file_name = "/home/testuser/log/logServer.log";std::string log_instance_name = "A1";if(!log_record.InitLogInstance(log_config_file_name.c_str(), log_instance_name.c_str())){printf("[%s][%s][%d]Log Init Failed", __FILE__, __FUNCTION__ ,__LINE__);log_record.SetConfigureFile(log_config_file_name.c_str(), log_instance_name.c_str(), log_file_name.c_str(),10485780,5,"DEBUG");}log_record.LogDebug("[%s][%s][%d]This is the Log module use example1.", __CLASS__, __FUNCTION__ ,__LINE__);log_config_file_name = "/home/testuser/log/LogSetting.ini"; //can ignorelog_file_name = "/usr/local/Projects/HDMap/HDMAP_database/log/logTimerDataTrans.log";log_instance_name = "A2";if(!log_record_timer_datatrans.InitLogInstance(log_config_file_name.c_str(), log_instance_name.c_str())){printf("[%s][%s][%d]Log Init Failed", __FILE__, __FUNCTION__ ,__LINE__);log_record_timer_datatrans.SetConfigureFile(log_config_file_name.c_str(), log_instance_name.c_str(), log_file_name.c_str(),10485780,5,"DEBUG");}log_record_timer_datatrans.LogDebug("[%s][%s][%d]This is the Log module use example1.", __CLASS__, __FUNCTION__ ,__LINE__);return true;
}

Linux C++,使用log4cpp记录日志示例详解相关推荐

  1. linux datetime,Python datetime模块示例详解

    一.datetime模块介绍 (一).datetime模块中包含如下类: 类名功能说明 date 日期对象,常用的属性有year, month, day time 时间对象 datetime 日期时间 ...

  2. linux添加开机自启动脚本示例详解

    linux下(以RedHat为范本)添加开机自启动脚本有两种方法,先来简单的; 一.在/etc/rc.local中添加 如果不想将脚本粘来粘去,或创建链接什么的, 则: step1. 先修改好脚本,使 ...

  3. rcs开机启动mysql_linux添加开机自启动脚本示例详解-阿里云开发者社区

    linux添加开机自启动脚本示例详解 double2li 2017-04-14 1652浏览量 简介: linux下(以RedHat为范本)添加开机自启动脚本有两种方法,先来简单的;一.在/etc/r ...

  4. Linux中/proc目录下文件详解

    Linux中/proc目录下文件详解(一) 声明:可以自由转载本文,但请务必保留本文的完整性. 作者:张子坚 email:zhangzijian@163.com 说明:本文所涉及示例均在fedora ...

  5. php reactphp wss_workerman的基本用法(示例详解)

    workerman是什么? Workerman是一个异步事件驱动的PHP框架,具有高性能,可轻松构建快速,可扩展的网络应用程序.支持HTTP,Websocket,SSL和其他自定义协议.支持libev ...

  6. Linux下Nginx编译安装过程详解

    Linux下Nginx编译安装过程详解 一.Nginx介绍 二.Nginx源码下载 1.打开Nginx官网 2.下载官网的源码包 三.Nginx源码安装 1.解压源码包 2.安装开发包组及环境 3.编 ...

  7. Linux中/proc目录下文件详解(二)

    Linux中/proc目录下文件详解(二) /proc/mdstat文件 这个文件包含了由md设备驱动程序控制的RAID设备信息. 示例: [root@localhost ~]# cat /proc/ ...

  8. linux 进程间通信 dbus-glib【实例】详解四(上) C库 dbus-glib 使用(附代码)(编写接口描述文件.xml,dbus-binding-tool工具生成绑定文件)(列集散集函数)

    linux 进程间通信 dbus-glib[实例]详解一(附代码)(d-feet工具使用) linux 进程间通信 dbus-glib[实例]详解二(上) 消息和消息总线(附代码) linux 进程间 ...

  9. linux中group命令详解,linux groupmod命令参数及用法详解

    需要更改群组的识别码或名称时,可用groupmod指令来完成这项工作.接下来是小编为大家收集的linux groupmod命令参数及用法详解,希望能帮到大家. linux groupmod命令参数及用 ...

  10. linux命令ps -aux|grep xxx详解

    linux命令ps -aux|grep xxx详解 要对进程进行监测和控制,首先必须要了解当前进程的情况,也就是需要查看当前进程, 而ps命令(Process Status)就是最基本同时也是非常强大 ...

最新文章

  1. 为什么eolinker发送老是等待_如何妙用 eoLinker 进行接口测试
  2. c mysql web开发实例教程_java web 开发入门实例
  3. java多线程爬虫框架crawler4j的使用
  4. Teradata天睿公司任命Steve McMillan为总裁兼首席执行官
  5. java如何禁用usb_IT技巧分享59: 如何禁用USB端口以及光驱来保证数据不被泄露
  6. Python中修饰器的定义与使用
  7. layer —— 一个简单的jQuery弹出层插件
  8. 数据分析sql面试必会6题经典_经典SQL面试题及答案分析
  9. 昂达 v891 v1 终于 删除 windows 分区 并且恢复了容量。
  10. nowcoder20072 [HNOI2009]图的同构
  11. 【思维导图】本博客技术思维导图
  12. 配置node服务器并且链接微信公众号接口配置(超详细)
  13. 10种食物 让你快乐每一天
  14. AdGuard推荐设置
  15. pandas的DataFrame数据画图matplotlab曲线如何改变时间刻度【间隔时间】并格式化日期显示总结
  16. 嵌入式系统开发笔记78:电话、电报发明给予我们的启示
  17. hnust 懒人多动脑
  18. 3.东软跨境电商数仓项目架构设计
  19. 虚拟服务器中毒,虚拟机中毒会影响主机吗
  20. 守破离——编程的三种境界

热门文章

  1. 【华为 OJ】 字符串分割
  2. c#操作txt文本之查询
  3. php圆角的度数计算公式,弧度和角度的换算器(度数换算计算器)
  4. 快速计算代码行小工具
  5. J1939协议简介【小白入门】
  6. Java学习手册:数据结构与算法汇总
  7. DPS软件做MK(Mann-Kendall)突变监测分析方法(附DPS 7.05软件下载地址)
  8. 怎么查看自己电脑是否被安装远程监控
  9. 计算机入门认识图标,初学UI设计如何了解ICON图标的用处
  10. 2010 模板下载 罗斯文_选择并使用 Access 模板