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

linux 使用log4cpp记录项目日志

为什么要用log4cpp记录项目日志

在通常情况下,Linux/UNIX 每个程序在开始运行的时刻,都会打开 3 个已经打开的 stream. 分别用来输入,输出,打印错误信息。通常他们会被连接到用户终端。这 3 个句柄的类型为指向 FILE 的指针。可以被 fprintf、fread等函数使用,他们在程序开始启动后,stdin, stdout, and stderr 的文件描述符是 0, 1 和 2,其它的文件描述符则排在其后。

很多时候会用 printf 打印信息来调试程序,但是如果终端关掉了,那怎么显示 printf 的调试信息呢?log4cpp就可以解决这个问题.

1 log4cpp安装

  • wget https://nchc.dl.sourceforge.net/project/log4cpp/log4cpp-1.1.x%20%28ne
    w%29/log4cpp-1.1/log4cpp-1.1.3.tar.gz
  • tar -zxvf log4cpp-1.1.3.tar.gz
  • cd log4cpp
  • ./configure --prefix=安装路径
  • make
  • make install

2确定 log4cpp 头文件&库

找头文件./log4cpp/include/log4cpp
在这里插入图片描述找到对应的库./log4cpp/src/.libs
在这里插入图片描述

3 log4cpp日志说明

3-1 设置日志信息输出方式

#include <log4cpp/Category.hh>
#include <log4cpp/FileAppender.hh>
#include <log4cpp/PatternLayout.hh>
#include <log4cpp/OstreamAppender.hh>// 以root的身份将信息输出到 std::cout
//log4cpp::Appender *appender = new log4cpp::OstreamAppender("root",&std::cout);// 以root的身份将信息输出到 log 文件
log4cpp::Appender *appender = new log4cpp::FileAppender("root","test.log");
日志信息appender方式注释
log4cpp::FileAppender输出到文件
log4cpp::RollingFileAppender输出到回卷文件,即当文件到达某个大小后回卷
log4cpp::OstreamAppender输出到一个 ostream 类
log4cpp::RemoteSyslogAppender输出到远程 syslog 服务器
log4cpp::StringQueueAppender内存队列
log4cpp::SyslogAppender本地 syslog
log4cpp::Win32DebugAppender发送到缺省系统调试器
log4cpp::NTEventLogAppender发送到 win 事件日志

日志输出到终端或者文件中实际上是很慢的,会引起 IO 中断,可以输出到内存里 StringQueueAppender,然后从
StringQueueAppender 输出到其它地方,这样线程执行效率是比较高效的。

3-2 设置日志信息输出格式

log4cpp::PatternLayout *patternLayout = new log4cpp::PatternLayout();
patternLayout->setConversionPattern("%d [%p] - %m%n");
appender->setLayout(patternLayout);

patternLayout->setConversionPattern( )支持以下一组格式字符:

日志格式字符注释
%%百分比符号
%c日志类别
%d日期格式:日期格式字符后面可以跟一个日期格式,括在大括号之间的说明符。例如,%d{%\H:%M:%S,%l}%d{%S\d%M%Y%H:%\M:%S,%l}。如果没有给出日期格式说明符,则使用以下式:“Wed Jan 02 02:03:55 1980”。%l表示毫秒。
%m消息
%n特定于平台的行分隔符
%p优先级
%r自创建此布局以来的毫秒
%R自1970年1月1日起的秒数(时间戳)
%u进程启动后的时钟周期
%xNDC
%t线程名称

默认情况下,PatternLayout->ConversionPattern( )设置为“%m%n”。

3-3 设置 日志输出类别(category) 和 日志优先级(priority)

log4cpp::Category &root = log4cpp::Category::getRoot();		//设置在配置文件里
root.setPriority(log4cpp::Priority::NOTICE);
root.addAppender(appender);

日志的级别总共有:
NOTSET < DEBUG < INFO < NOTICE < WARN < ERROR < CRIT < ALERT <FATAL = EMERG。
日志级别的意思是低于该级别的日志不会被记录。

3-4设置 日志操作的宏

#define LOG(__level) 
log4cpp::Category::getRoot() <<log4cpp::Priority::__level << __FILE__ << " " << __LINE__ << ": "

3-5 使用 日志操作的宏 记录日志

LOG(DEBUG) << "i am happy.";
LOG(INFO)  << "oh, you happy, we happy.";
LOG(NOTICE)<< "please do not contact me. ";
LOG(WARN)  << "i am very busy now.";
LOG(ERROR) << "oh, what happed?";

4 使用封装log4cpp(单例)并使用Cmake编译项目

4-0 log4cpp_demo.conf

#定义 rootCategory 的属性
log4cpp.rootCategory=DEBUG, RootLog#定义 RootLog 属性
log4cpp.appender.RootLog                 = RollingFileAppender
log4cpp.appender.RootLog.layout          = PatternLayout
log4cpp.appender.RootLog.layout.ConversionPattern=%d{%m - %d %H:%M:%S %l} [%t][%p]%m%n
log4cpp.appender.RootLog.fileName        =./log4cpp_Loger.log
log4cpp.appender.RootLog.maxFileSize     =268435456 #256MB
log4cpp.appender.RootLog.fileNamePattern =log4cpp_Loger%i.log
log4cpp.appender.RootLog.maxBackupIndex  =256

4-1 Loger.h

#ifndef DISTRIBUTED_LOGGER_H_
#define DISTRIBUTED_LOGGER_H_#include <string>
#include <log4cpp/Category.hh>#define LOG_INFO   Logger::instance()->GetHandle()->info
#define LOG_DEBUG  Logger::instance()->GetHandle()->debug
#define LOG_ERROR  Logger::instance()->GetHandle()->error
#define LOG_WARN   Logger::instance()->GetHandle()->warnclass Logger
{
public:Logger();~Logger();//初始化bool init(const std::string &log_conf_file);//获取单例static Logger* instance() { return &instance_; }//获取使用日志接口log4cpp::Category* GetHandle() { return category_; };protected://对象实例static Logger  instance_;log4cpp::Category* category_;};#endif

4-2 Loger.cpp

#include "Loger.h"
#include <iostream>
#include <log4cpp/Category.hh>
#include <log4cpp/FileAppender.hh>
#include <log4cpp/PatternLayout.hh>
#include <log4cpp/OstreamAppender.hh>
#include <log4cpp/RemoteSyslogAppender.hh>
#include <log4cpp/PropertyConfigurator.hh>Logger  Logger::instance_;
Logger::Logger()
{}Logger::~Logger()
{}bool Logger::init(const std::string& log_conf_file)
{try{//日志输出log4cpp::PropertyConfigurator::configure(log_conf_file);}catch (log4cpp::ConfigureFailure &f){std::cerr << "load log config file" << log_conf_file.c_str() << "failed with result:" << f.what() << std::endl;return false;}category_ = &log4cpp::Category::getRoot();return true;
}

4-3 main.cpp

#include "Loger.h"
#include <iostream>
#include <unistd.h>using namespace std;
int main(int argc, char **argv) {if (argc != 2)//传入参数不合法{printf("Please input format< your process > < .conf file config >!\n");return -1;}Logger* config= Logger::instance();//配置文件加载信息if (!config->init(std::string(argv[1]))) //配置文件加载失败{printf("load %s failed.\n", argv[1]);return -2;}LOG_DEBUG("load %s finsh.",argv[1]);return 0;
}

4-4 CMakeLists.txt

CMAKE_MINIMUM_REQUIRED(VERSION  3.5)
#工程名
PROJECT(log4cpp_demo)
#将指定的目录头文件添加到编译器的头文件搜索路径之下
INCLUDE_DIRECTORIES(./third/include)#将指定的目录库文件添加需要链接的库文件目录之下
LINK_DIRECTORIES(./third/lib/log4cpp)#内置变量:CMAKE_SOURCE_DIR 定义了顶级CMakeLists.txt 所在文件夹
#PROJECT_SOURCE_DIR定义了包含project()命令的CmakeLists.txt所在的文件夹
#搜集所有在指定路径下的源文件名,将输出结果储存在指定的变量中
aux_source_directory(${PROJECT_SOURCE_DIR} SOURCE_FILES)#使用给定的源文件,为工程引入一个可执行文件
ADD_EXECUTABLE(log4cpp_demo ${SOURCE_FILES})#用来显示的定义变量(注意:加上-pthread)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}-pthread  -rdynamic -Wall -g3 -m64 -pipe -std=c++0x -lrt -Wno-reorder -Wdeprecated-declarations -fpermissive ")#该指令的作用为目标文件与库文件进行链接
#TARGET_LINK_LIBRARIES(log4cpp_demo log4cpp)
target_link_libraries(log4cpp_demo pthread)
target_link_libraries(${PROJECT_NAME} liblog4cpp.a)
#设置默认安装目录
SET(CMAKE_INSTALL_PREFIX ${CMAKE_BINARY_DIR})#安装
INSTALL(TARGETS log4cpp_demo DESTINATION bin)

4-5 编译项目

  • cmake .
  • make

在这里插入图片描述

4-6 执行程序

在这里插入图片描述

相关文章:

linux 使用log4cpp记录项目日志

为什么要用log4cpp记录项目日志 在通常情况下&#xff0c;Linux/UNIX 每个程序在开始运行的时刻&#xff0c;都会打开 3 个已经打开的 stream. 分别用来输入&#xff0c;输出&#xff0c;打印错误信息。通常他们会被连接到用户终端。这 3 个句柄的类型为指向 FILE 的指针。可以…...

Kafka集群部署

文章目录 一、实例配置二 、zookeeper集群安装三、kafka集群安装四、验证 没有提示&#xff0c;所有机器都执行 在kafka集群中引入zookeeper&#xff0c;主要是为了管理kafka集群的broker。负责管理集群的元数据信息&#xff0c;确保 Kafka 集群的高可用性、高性能和高可靠性。…...

软件测试|深入理解SQL CROSS JOIN:交叉连接

简介 在SQL查询中&#xff0c;CROSS JOIN是一种用于从两个或多个表中获取所有可能组合的连接方式。它不依赖于任何关联条件&#xff0c;而是返回两个表中的每一行与另一个表中的每一行的所有组合。CROSS JOIN可以用于生成笛卡尔积&#xff0c;它在某些情况下非常有用&#xff…...

数据权限-模型简要分析

权限管控可以通俗的理解为权力限制&#xff0c;即不同的人由于拥有不同权力&#xff0c;他所看到的、能使用的可能不一样。对应到一个应用系统&#xff0c;其实就是一个用户可能拥有不同的数据权限&#xff08;看到的&#xff09;和操作权限&#xff08;使用的&#xff09;。 …...

echarts柱状图加单位,底部文本溢出展示

刚开始设置了半天都不展示单位&#xff0c;后来发现是被挡住了&#xff0c;需要调高top值 // 基于准备好的dom&#xff0c;初始化echarts实例var myChart echarts.init(document.getElementById("echartD"));rankOption {// backgroundColor: #00265f,tooltip: {…...

x-cmd pkg | gh - GitHub 官方 CLI

目录 简介首次用户功能特点与 x-cmd gh 模块的关系相关作品进一步探索 简介 gh&#xff0c;是由 GitHub 官方使用 Go 语言开发和维护的命令行工具&#xff0c;旨在脚本或是命令行中便捷管理和操作 GitHub 的工作流程。 注意: 由于 x-cmd 提供了同名模块&#xff0c;因此使用官…...

Python解析XML,简化复杂数据操作的最佳工具!

更多Python学习内容&#xff1a;ipengtao.com XML&#xff08;可扩展标记语言&#xff09;是一种常见的文本文件格式&#xff0c;用于存储和交换数据。Python提供了多种库和模块&#xff0c;用于解析和操作XML文件。本文将深入探讨如何使用Python操作XML文件&#xff0c;包括XM…...

rpm数据库被破坏,无法使用yum

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 问题描述&#xff1a; 云服务器在安装了开源的HIDS插件后&#xff0c;发现安装了插件的服务器全部突然无法正常使用yum安装软件…...

国标GB28181视频监控EasyCVR平台:视频集中录制存储/云端录像功能及操作介绍

安防视频监控系统EasyCVR视频综合管理平台&#xff0c;采用了开放式的网络结构&#xff0c;可以提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、云存储等丰富的视频能力&#xff0c;同时还具备权限管理、设…...

Wargames与bash知识11

Wargames与bash知识11 bandit19 关卡提示&#xff1a; 要获得对下一级别的访问权限&#xff0c;您应该使用家目录中的setuid二进制文件。在不带参数的情况下执行它&#xff0c;以了解如何使用。在使用setuid二进制文件后&#xff0c;可以在通常的位置&#xff08;/etc/bandit…...

Python 基础(一):基本语句

目录 1 条件语句2 循环语句2.1 for 循环2.2 while 循环2.3 break2.4 continue 3 pass 语句 1 条件语句 在进行逻辑判断时&#xff0c;我们需要用到条件语句&#xff0c;Python 提供了 if、elif、else 来进行逻辑判断。格式如下所示&#xff1a; if 判断条件1:执行语句1... el…...

Hibernate实战之操作MySQL数据库(2024-1-8)

Hibernate实战之操作MySQL数据库 2024.1.8 前提环境&#xff08;JavaMySQLNavicatVS Code&#xff09;1、Hibernate简介1.1 了解HQL 2、MySQL数据库建表2.1 编写SQL脚本2.2 MySQL执行脚本 3、Java操作MySQL实例&#xff08;Hibernate&#xff09;3.1 准备依赖的第三方jar包3.2 …...

【Spring Boot 3】【数据源】自定义JDBC多数据源

【Spring Boot 3】【数据源】自定义JDBC多数据源 背景介绍开发环境开发步骤及源码工程目录结构总结背景 软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习新技术…...

番茄工作法

番茄工作法是一种时间管理方法&#xff0c;主要适用于专注工作。它的基本步骤包括&#xff1a; 设定一个25分钟的闹钟。默念三二一&#xff08;321法则&#xff09;&#xff0c;开始全身心投入工作。用专注的状态高效工作25分钟&#xff0c;不允许走神。如果做到了步骤3&#…...

【uniapp】调用阿里云OCR图片识别文字:

文章目录 一、效果&#xff1a;二、实现&#xff1a; 一、效果&#xff1a; 二、实现&#xff1a; 【阿里官方】高精版OCR文字识别【最新版】-云市场-阿里云 <template><view class"container"><!-- 选择图片 --><button click"imageO…...

软考高级选择考哪个好?

&#x1f4d2;软考高级总共5个科目&#xff0c;同样是高级证书&#xff0c;认可度也有区别! 大家一般在「信息系统项目管理师」✔️和「系统架构设计师」✔️二选一 1️⃣信息系统项目管理师 ❤️信息系统项目管理师也叫「高项」&#xff0c;考试内容主要是「项目管理」相关&am…...

在云服务器ECS上用Python写一个搜索引擎

在云服务器ECS上用Python写一个搜索引擎 一、场景介绍二、搜索引擎的组成2.1 网页的爬取及排序2.2 用户使用搜索引擎进行搜索 三、操作步骤3.1 环境准备3.2 安装Anaconda3.3 安装Streamlit3.4 下载搜索引擎代码3.5 运行搜索引擎 四、常见问题4.1 运行setup.py时可能的问题4.2 如…...

Python在智能手机芯片研发

Python在智能手机芯片研发中扮演着重要的角色。以下是几个方面的重要性&#xff1a; 快速原型设计&#xff1a;Python具有简洁易读的语法和丰富的第三方库&#xff0c;使工程师能够快速构建原型和进行快速迭代。这对于芯片研发来说&#xff0c;可以加快开发速度&#xff0c;减少…...

K8S学习指南(70)-K8S中的informa机制

引言 在 Kubernetes 集群中&#xff0c;Informer 是一种重要的机制&#xff0c;用于监控和处理集群中资源对象的变化。它是基于观察者模式设计的&#xff0c;允许开发者注册对某类资源对象的关注&#xff0c;并在对象发生变化时得到通知。本文将深入介绍 Kubernetes 中的 Info…...

「MCU」SD NAND芯片之国产新选择优秀

文章目录 前言 传统SD卡和可贴片SD卡 传统SD卡 可贴片SD卡 实际使用 总结 前言 随着目前时代的快速发展&#xff0c;即使是使用MCU的项目上也经常有大数据存储的需求。可以看到经常有小伙伴这样提问&#xff1a; 大家好&#xff0c;请问有没有SD卡芯片&#xff0c;可以…...

【QML COOK】- 002-添加一个图片

1. 编辑main.qml import QtQuickWindow {width: 800height: 800visible: truetitle: qsTr("Hello World")Image {anchors.fill: parentsource: "qrc:/Resources/Images/arrow.png"} }将Window的width和height都改成800&#xff0c;因为我们要添加的图片大…...

Java10:内部类

7 内部类&#xff08;了解&#xff09;7.1 成员内部类7.2 静态内部类7.3 局部内部类7.4 匿名内部类 2.3. 静态内部类2.4. Lambda表达式&#xff0c; 7 内部类&#xff08;了解&#xff09; 内部类&#xff1a;就是在一个类的内部再定义一个类。 分类&#xff1a; 成员内部类 静…...

PostgreSQL 支持的字段类型

PostgreSQL 支持多种字段类型&#xff0c;以下是 PostgreSQL 13 版本中支持的所有字段类型&#xff1a; 数值类型&#xff1a; smallint&#xff1a;小整数类型。integer&#xff1a;整数类型。bigint&#xff1a;大整数类型。decimal&#xff1a;精确小数类型。numeric&#x…...

npm报错error:03000086:digital envelope routines::initialization error

可能是因为node版本过高&#xff0c;与现在的项目不符合 这是降低node版本的命令&#xff0c;然后重新运行 npm install npm8.1.2 -g...

el-table 展开行表格,展开的内容高度可以变化时,导致的固定列错位的问题

问题描述 一个可展开的表格&#xff08;列设置了type“expand”&#xff09;&#xff0c;并且展开后的内容高度可以变化&#xff0c;会导致后面所有行的固定列错位&#xff0c;图如下&#xff0c;展示行中是一个树形表格&#xff0c;默认不展示子级&#xff0c;点击树形表格的…...

python插入排序

插入排序&#xff08;Insertion Sort&#xff09;是一种简单直观的排序算法。它的工作原理是通过构建有序序列&#xff0c;对于未排序数据&#xff0c;在已排序序列中从后向前扫描&#xff0c;找到相应位置并插入。插入排序在实现上&#xff0c;通常使用in-place排序&#xff0…...

怎么将营业执照图片转为excel表格?(批量合并识别技巧)

一、为何要将营业执照转为excel表格&#xff1f; 1、方便管理&#xff1a;将营业执照转为excel格式&#xff0c;可以方便地进行管理和整理&#xff0c;快速查找需要的信息。 2、数据处理&#xff1a;Excel可以提供丰富的计算和数据分析功能&#xff0c;转化为excel后方便数据…...

关于java数组Arrays类

关于java数组Arrays类 前面的文章中&#xff0c;我们了解了数组创建方法等&#xff0c;我们本篇文章来了解一下数组的方法类Arrays&#xff0c;有了这个类&#xff0c;我们在日常写代码的时候就不不用自己去手动创建方法了&#x1f600;。 Arrays类 数组的工具类java.util.A…...

LeetCode-58/709

1.最后一个单词的长度&#xff08;58&#xff09; 题目描述&#xff1a; 给你一个字符串 s&#xff0c;由若干单词组成&#xff0c;单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 思路&…...

linux 流量监控

linux 流量监控 Linux 网络流量监控利器 iftop命令详解及实战 https://blog.csdn.net/qq_50247813/article/details/134164093 iftop命令详解 https://www.cnblogs.com/gaoyuechen/p/17300017.html 1 ubuntu如何查看流量监控 Ubuntu是一种非常流行的Linux发行版&#xff0c…...

中文网站建设教程/站长网站大全

前面两篇文章&#xff0c;我们讲了自定义viewpagerphotoView实现本地图片的加载和收缩缩放。实现本地相册功能。 如果没有看的话可以先阅读以下&#xff0c;因为今天网络加载图片的功能&#xff0c;实在这个基础上做的修改&#xff0c;会基于之前的基础上讲解。 1. http://bl…...

java ssm企业网站建设/湖南seo网站多少钱

文件系统基础 文件是以计算机硬盘为载体的存储在计算机上的信息集合。在系统运行时&#xff0c;计算机以进程为基本单位进行资源的调度和分配&#xff1b;而在用户进行的输入、输出中&#xff0c;则以文件为基本单位。 文件的基本操作&#xff1a; 创建文件。创建文件有两个必要…...

wordpress用户推广插件/百度浏览器下载安装2023版本

随着平台的容器支持、开发人员工具、培训资源和开发人员社区体验等方面的改善&#xff0c;推动组织采用 Java™ Platform, Enterprise Edition 5&#xff08;Java EE 5&#xff09;的动力正在稳定增长。本文从较高层面介绍 Java EE 5 中新的生产率特性和 API 改进&#xff0c;并…...

徐州网站平台/原创文章代写

转自&#xff1a;http://www.pinlue.com/article/2019/09/1413/469615040316.html...

wordpress阿里/平台优化

今天遇到一个问题&#xff0c;想把pb转成map&#xff0c;如下所示&#xff1a;func 所以很无奈&#xff0c;就不得不选择了稍微繁琐一点的方式&#xff08;使用go的反射获得pb结构体的field&#xff0c;使用for循环将field转成map&#xff09;&#xff0c;如下代码所示&#xf…...

武汉高端网站制作公司/百度数据研究中心

对于4合一的版本来说只要找到安装包里的 STANDARD、PERSONAL、ENTERPRISE、DEVELOPER文件夹下的 X86\SETUP\SETUPSQL.EXE 任何一个运行即可&#xff0c;&#xff08;理论上是这样&#xff0c;但经过测试实际WIN7 64位操作系统只能安装DEVELOPER开发版&#xff09; 一路安装下去…...