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 进程启动后的时钟周期
%x NDC
%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()->warn

class 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 执行程序

在这里插入图片描述

相关推荐

  1. Nestjs使用log4j打印

    2024-01-06 01:28:01       39 阅读
  2. rust - 使用log4rs打印

    2024-01-06 01:28:01       24 阅读
  3. log4j2配置

    2024-01-06 01:28:01       11 阅读
  4. linux 定时清空log

    2024-01-06 01:28:01       37 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-06 01:28:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-06 01:28:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-06 01:28:01       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-06 01:28:01       20 阅读

热门阅读

  1. 如何在竞争激烈的市场中获得更多的客户?

    2024-01-06 01:28:01       34 阅读
  2. Day14- 二叉树part03

    2024-01-06 01:28:01       39 阅读
  3. 【Linux】linux配置静态IP、动态IP方法汇总

    2024-01-06 01:28:01       46 阅读
  4. Kotlin : Coroutines 协程—简单应用

    2024-01-06 01:28:01       33 阅读
  5. 华纳云:如何自己搭建vps上外网?步骤及流程

    2024-01-06 01:28:01       41 阅读
  6. 一切皆文件有必要单独提出来说

    2024-01-06 01:28:01       37 阅读