当前位置: 首页 > news >正文

c++日志库log4cplus使用

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

下面介绍一下在linux中安装log4cplus库过程

下载地址:https://github.com/log4cplus/log4cplus/releases
我选择的是比较新的版本(V2.1.0)

编译&&安装

下载完成在ubuntn中解压&&编译
(使用默认参数和路径)
1、sudo ./configure
2、sudo make
3、sudo make install
(安装完成后头文件路径默认在/usr/loca/include,库文件路径在/usr/local/lib)
4、把库文件路径加入到/etc//etc/ld.so.conf文件中然后执行sudo ldconfig

编写demo

测试需要四个文件,是 MyLogger.h , main.cpp , logconfig.property , CMakeLists.txt (用cmake编译时可用) ,文件内容如下,放入同一个文件夹进行编译

MyLogger.h

#include <log4cplus/logger.h>
#include <log4cplus/configurator.h> 
#include <log4cplus/layout.h> 
#include <log4cplus/loggingmacros.h> 
#include <log4cplus/helpers/stringhelper.h> #define MY_LOG_FILE_PATH "logconfig.property"class MyLogger
{
private:MyLogger(){log4cplus::initialize();log4cplus::PropertyConfigurator::doConfigure(LOG4CPLUS_TEXT(MY_LOG_FILE_PATH));m_rootLog = log4cplus::Logger::getRoot();m_loggerYW = log4cplus::Logger::getInstance("loggerYW");m_loggerWJ = log4cplus::Logger::getInstance("loggerWJ");m_loggerUI = log4cplus::Logger::getInstance("loggerUI");     }~MyLogger(){if (m_logger){delete m_logger;}}static MyLogger* m_logger;public:static MyLogger * getInstance(){if (m_logger == NULL){m_logger = new MyLogger();}return m_logger;}log4cplus::Logger m_rootLog;log4cplus::Logger m_loggerYW;log4cplus::Logger m_loggerWJ;log4cplus::Logger m_loggerUI;};MyLogger* MyLogger::m_logger = NULL;

main.cpp

#include "MyLogger.h"int main(int argc, char *argv[])
{MyLogger * myLoger = NULL;myLoger = MyLogger::getInstance();LOG4CPLUS_FATAL(myLoger->m_loggerYW, "DeleteService failed,errCode=[" << 2 << "]");LOG4CPLUS_DEBUG(myLoger->m_loggerWJ, " Service is removed");LOG4CPLUS_DEBUG(myLoger->m_loggerUI, " Service ");return 0;
}

logconfig.property

log4cplus.rootLogger=DEBUG,rootLogger
log4cplus.appender.rootLogger=log4cplus::RollingFileAppender  
#log4cplus.appender.rootLogger=log4cplus::ConsoleAppender
log4cplus.appender.rootLogger.MaxFileSize=100MB
log4cplus.appender.rootLogger.MaxBackupIndex=2
log4cplus.appender.rootLogger.File=rootLogger.log
log4cplus.appender.rootLogger.layout=log4cplus::PatternLayout
log4cplus.appender.rootLogger.layout.ConversionPattern=%D:%d{%Q}|%p|%t|%l|%m|%n
log4cplus.appender.rootLogger.filters.1=log4cplus::spi::LogLevelRangeFilter
log4cplus.appender.rootLogger.filters.1.LogLevelMin=TRACE
log4cplus.appender.rootLogger.filters.1.LogLevelMax=FATAL
log4cplus.appender.rootLogger.filters.1.AcceptOnMatch=true
log4cplus.appender.rootLogger.filters.2=log4cplus::spi::DenyAllFilterlog4cplus.logger.loggerYW=DEBUG,loggerYW
log4cplus.appender.loggerYW=log4cplus::RollingFileAppender
log4cplus.appender.loggerYW.File=loggerYW.log
log4cplus.appender.loggerYW.layout=log4cplus::PatternLayout
log4cplus.appender.loggerYW.layout.ConversionPattern=%D:%d{%Q}|%p|%t|%l|%m|%n
log4cplus.appender.loggerYW.filters.1=log4cplus::spi::LogLevelRangeFilter
log4cplus.appender.loggerYW.filters.1.LogLevelMin=TRACE
log4cplus.appender.loggerYW.filters.1.LogLevelMax=FATAL
log4cplus.appender.loggerYW.filters.1.AcceptOnMatch=true
log4cplus.appender.loggerYW.filters.2=log4cplus::spi::DenyAllFilter
log4cplus.appender.loggerYW.MaxFileSize=100MB
log4cplus.appender.loggerYW.MaxBackupIndex=2
log4cplus.additivity.loggerYW=falselog4cplus.logger.loggerWJ=DEBUG,loggerWJ
log4cplus.appender.loggerWJ=log4cplus::RollingFileAppender
log4cplus.appender.loggerWJ.File=loggerWJ.log
log4cplus.appender.loggerWJ.layout=log4cplus::PatternLayout
log4cplus.appender.loggerWJ.layout.ConversionPattern=%D:%d{%Q}|%p|%t|%l|%m|%n
log4cplus.appender.loggerWJ.filters.1=log4cplus::spi::LogLevelRangeFilter
log4cplus.appender.loggerWJ.filters.1.LogLevelMin=TRACE
log4cplus.appender.loggerWJ.filters.1.LogLevelMax=FATAL
log4cplus.appender.loggerWJ.filters.1.AcceptOnMatch=true
log4cplus.appender.loggerWJ.filters.2=log4cplus::spi::DenyAllFilter
log4cplus.appender.loggerWJ.MaxFileSize=100MB
log4cplus.appender.loggerWJ.MaxBackupIndex=2
log4cplus.additivity.loggerWJ=falselog4cplus.logger.loggerUI=DEBUG,loggerUI
log4cplus.appender.loggerUI=log4cplus::RollingFileAppender
log4cplus.appender.loggerUI.File=loggerUI.log
log4cplus.appender.loggerUI.layout=log4cplus::PatternLayout
log4cplus.appender.loggerUI.layout.ConversionPattern=%D:%d{%Q}|%p|%t|%l|%m|%n
log4cplus.appender.loggerUI.filters.1=log4cplus::spi::LogLevelRangeFilter
log4cplus.appender.loggerUI.filters.1.LogLevelMin=TRACE
log4cplus.appender.loggerUI.filters.1.LogLevelMax=FATAL
log4cplus.appender.loggerUI.filters.1.AcceptOnMatch=true
log4cplus.appender.loggerUI.filters.2=log4cplus::spi::DenyAllFilter
log4cplus.appender.loggerUI.MaxFileSize=100MB
log4cplus.appender.loggerUI.MaxBackupIndex=2
log4cplus.additivity.loggerUI=false

CMakeLists.txt

# CMake 最低版本号要求
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)# 项目名
PROJECT(LOG)# 添加第三方的库
SET(INC_DIR "/usr/local/include/")
SET(LINK_DIR "/usr/local/lib")INCLUDE_DIRECTORIES(${INC_DIR})    # 设置头文件搜索路径
LINK_DIRECTORIES(${LINK_DIR})    #指定要链接的库文件的路径,一般不需要
# 将第三方的库链接到可执行文件,静态链接
LINK_LIBRARIES(log4cplus)# 指定源文件
SET(SRC_LIST "main.cpp")
MESSAGE(STATUS "SRC_LIST :" ${SRC_LIST})# 指定生成目标
ADD_EXECUTABLE(${PROJECT_NAME} ${SRC_LIST})# 将第三方的库链接到可执行文件,动态链接
#TARGET_LINK_LIBRARIES(${PROJECT_NAME} log4cplus)# 安装目标文件
SET(PROJECT_INSTALL_PREFIX "/mnt/hgfs/VM_Shared/Teselog4cplus/build/dd")
INSTALL(TARGETS ${PROJECT_NAME}DESTINATION ${PROJECT_INSTALL_PREFIX}PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)# 安装配置文件
SET(CONFIG_INSTALL_PREFIX "/mnt/hgfs/VM_Shared/Teselog4cplus/build")        
INSTALL(FILES logconfig.propertyDESTINATION ${CONFIG_INSTALL_PREFIX})

用cmake进行编译
mkdir workspace //创建工作目录
cd workspace && 创建4个新文件
mkdir build/install -p
cd build
cmake …/
make
make install

http://www.lryc.cn/news/24396.html

相关文章:

  • 什么是接口测试,我们如何实现接口测试?
  • 随机森林在sklearn中的实现
  • [论文总结] 深度学习在农业领域应用论文笔记11
  • Android 9.0 SystemUI 状态栏屏蔽弹出的悬浮式通知
  • 商简智能计划与排程SPS在纺织行业中的应用
  • 549、RocketMQ详细入门教程系列 -【消息队列之 RocketMQ(三)】 2023.02.28
  • 如何使用SpringBoot ⽇志?
  • 山东大学数字图像处理实验:MATLAB的图像显示方法
  • Java缓存面试题——Redis解决方案
  • Flink:The generic type parameters of ‘Collector‘ are missing 类型擦除
  • MySQL查询操作
  • Redis-day01-note
  • 嵌入式C基础知识(19)
  • java 2(程序流程控制)【含例题详解】
  • 基于Conda完成创建多版本python环境
  • 35岁的测试被裁,公司地位还不如00后...
  • vue H5跳转小程序报错:config:fail,Error: 系统错误,错误码:63002,invalid signature
  • 来面试阿里测开工程师,HR问我未来3-5年规划,我给HR画个大饼。
  • 【2373. 矩阵中的局部最大值】
  • Read book Netty in action(Chapter VII)--ChannelHandler和ChannelPipeline
  • react的严格模式 和 解决react useEffect执行两次
  • C++中的STL
  • 【沐风老师】3dmax一键窗户生成器插件使用方法详解
  • 【图像处理】数字图像处理基础(分辨率,像素,显示...)
  • UE实现相机飞行效果CesiumForUnreal之DynamicPawn飞行原理浅析
  • AIGC被ChatGPT带火!底层基础算力有望爆发式增长
  • 【链表OJ题(一)】移除链表元素
  • 【解锁技能】学会Python条件语句的终极指南!
  • 如何通过rem实现移动端的适配?
  • 【论文阅读】-姿态识别