log4cplus的相关说明使用以及示例

log4cplus相关链接

GitHub:https://github.com/log4cplus/log4cplus

api文档:https://log4cplus.sourceforge.io/docs/html/index.html

CodeExamples:https://sourceforge.net/p/log4cplus/wiki/CodeExamples/

相关说明

log4cplus是log4j的C++实现,提供的接口和使用逻辑与log4j基本保持一致,在了解log4cplus之前,先了解以下log4j的设计方法:一个著名的日志系统是怎么设计出来的?

基本的类

可以参见 api文档

功能
Loggerlog4cplus的核心包
Appender用于指定内容输出位置(如:控制台,文件、远程服务器等)。一个Logger可添加多个Appender,从而向多个位置输出日志。扩展此类可以实现自己的日志语句打印策略
Layout用于指定日志输出的格式。每个Appender需要设置一个Layout。

Appendder

Log4cplus::Appendder的继承图:

在这里插入图片描述

Log4cplus::Layout的继承图:

在这里插入图片描述

Log4cplus基本使用步骤

  1. 用Initializer类进行初始化
    log4cplus::Initializer initializer;

  2. 创建Appender对象。

    appender(new log4cplus::ConsoleAppender()) 创建 console 的appender对象

  3. 设置Appender的名称和输出格式(Layout)

    setName函数设置appender名称;setLayout函数设置layout对象,可以直接new一个新的

  4. 获得一个Logger实例,并设置其日志输出等级阈值

    getInstance函数获取实例; setLogLevel函数设置日志输出等级阈值

  5. 给Logger实例添加Appender

    logger.addAppender(appender);

  6. 使用宏输出日志(宏的等级有6个,分别为:FATAL, ERROR, WARN, INFO, DEBUG, TRACE。FATAL宏的名为LOG4CPLUS_FATAL( ),ERROR的宏的名为LOG4CPLUS_ERROR( ),以此类推。具体使用方法见示例。)

注: 一个Logger实例被配置后,将一直存在于程序中,在程序的任何地方都可通过实例名称获取到这个Logger。

使用与示例

例1:将日志输出到控制台

代码: OutputLogToConsole GitHub

#include <iostream>
#include <log4cplus/log4cplus.h>
#include <log4cplus/initializer.h>
int main() {
    //第1步:用Initializer类进行初始化
    log4cplus::Initializer initializer;

    //第2步:创建ConsoleAppender;
    //SharedAppenderPtr 指向一个Appender的指针,这里new 了一个 ConsoleAppender
    log4cplus::SharedAppenderPtr appender(new log4cplus::ConsoleAppender());

    //第3步:设置Appender的名称和输出格式(SimpleLayout)
    // unique_ptr 智能指针
    appender->setName(LOG4CPLUS_TEXT("console"));
    appender->setLayout(std::unique_ptr<log4cplus::Layout>(new log4cplus::SimpleLayout));

    //第4步:获得一个Logger实例,并设置其日志输出等级阈值
    log4cplus::Logger logger = log4cplus::Logger::getInstance(LOG4CPLUS_TEXT ("test"));
    logger.setLogLevel(log4cplus::INFO_LOG_LEVEL);

    //第5步:为Logger实例添加ConsoleAppender
    logger.addAppender(appender);

    //第6步:使用宏将日志输出
    LOG4CPLUS_INFO(logger, LOG4CPLUS_TEXT("Hello world"));

    return 0;
}

输出:

INFO - Hello world

例2:将日志输出到控制台并写入文件

ConsoleAppender 和 FileAppender

代码:OutputLogToFileAndConsle GitHub

#include <iostream>
#include <log4cplus/log4cplus.h>
#include <log4cplus/initializer.h>

int main() {
    //第1步:用Initializer类进行初始化
    log4cplus::Initializer initializer;
    //第2步:创建ConsoleAppender;
    //SharedAppenderPtr 指向一个Appender的指针,这里new 了一个 ConsoleAppender
    log4cplus::SharedAppenderPtr consoleAppender(new log4cplus::ConsoleAppender());
    // std::ios_base::app 每次进行写入操作的时候都会重新定位到文件的末尾.
    log4cplus::SharedAppenderPtr fileAppender(new log4cplus::FileAppender(LOG4CPLUS_TEXT("./logs/log.txt"),std::ios_base::app,true,true));

    //第3步:设置consoleAppender的名称和输出格式(SimpleLayout) fileAppender的名称和pattern格式(PatternLayout)
    // unique_ptr 智能指针
    consoleAppender->setName(LOG4CPLUS_TEXT("console"));
    consoleAppender->setLayout(std::unique_ptr<log4cplus::Layout>(new log4cplus::SimpleLayout));
    fileAppender->setName(LOG4CPLUS_TEXT("file"));
    // 参见 https://log4cplus.sourceforge.io/docs/html/classlog4cplus_1_1PatternLayout.html
    //2020/10/16 16:13:03,481.502 [140068134246208] INFO  test - Hello world [/home/leacock/CLionProjects/Log4CplusDemo/OutputLogToFileAndConsle/main.cpp:33]
    // %D{%Y/%m/%d %H:%M:%S,%Q} 2020/10/16 16:13:03,481.502 时间 %D 表本地时间, 年/月/日/ 时:分:秒:毫秒
    //[%t]  [140068134246208] 输出生成日志事件的线程的线程id
    //%-5p  INFO  输出日志事件的日志级别  %-5 如果名称小于5个字符长,则右侧加空格。
    //%c  test 用于输出记录日志的是哪个logger,这里 在getInstance(LOG4CPLUS_TEXT ("test"))设置了名称
    //%m  Hello world  输出与logger关联的应用程序提供消息。
    //%l 等同于 "%F:%L"   F:用于输出日志请求发出时的文件名 L:用于输出从何处发出日志请求的行号。
    //%n 输出换行
    log4cplus::tstring pattern = LOG4CPLUS_TEXT("%D{%Y/%m/%d %H:%M:%S,%Q} [%t] %-5p %c - %m [%l]%n");
    fileAppender->setLayout(std::unique_ptr<log4cplus::Layout>(new log4cplus::PatternLayout(pattern)));

    //第4步:获得一个Logger实例,并设置其日志输出等级阈值
    log4cplus::Logger logger = log4cplus::Logger::getInstance(LOG4CPLUS_TEXT ("test"));
    logger.setLogLevel(log4cplus::INFO_LOG_LEVEL);

    //第5步:为Logger实例添加ConsoleAppender 与 FileAppender
    logger.addAppender(consoleAppender);
    logger.addAppender(fileAppender);

    //第6步:使用宏将日志输出
    LOG4CPLUS_INFO(logger, LOG4CPLUS_TEXT("Hello world"));
}

输出:

在这里插入图片描述

例3:使用配置文件将日志输出到控制台并写入文件

ConsoleAppender 和 rollFileAppender

代码:OutputLogToRollFileAndConsle GitHub

#include <iostream>
#include <log4cplus/log4cplus.h>
#include <log4cplus/initializer.h>

int main() {

    log4cplus::Initializer initializer;
    log4cplus::PropertyConfigurator::doConfigure(LOG4CPLUS_TEXT("./config/log.properties"));

}

log.properties 如下

# log4cplus.rootLogger = TINFO, consoleAppender, rollFileAppender
log4cplus.rootLogger = TRACE, consoleAppender, rollFileAppender
# 日志级别  appendes

log4cplus.appender.consoleAppender = log4cplus::ConsoleAppender
log4cplus.appender.consoleAppender.layout = log4cplus::PatternLayout
log4cplus.appender.consoleAppender.layout.ConversionPattern = %D{%Y/%m/%d %H:%M:%S,%Q} %-5p %c [%l] - %m %n

log4cplus.appender.rollFileAppender = log4cplus::RollingFileAppender
# roll文件名  带路径
log4cplus.appender.rollFileAppender.File = ./logs/RollFileLogs/roll_file.log
log4cplus.appender.rollFileAppender.MaxFileSize = 1MB
log4cplus.appender.rollFileAppender.MaxBackupIndex = 100
# 如果文件夹不存在 true 可创建
log4cplus.appender.rollFileAppender.CreateDirs = true
log4cplus.appender.rollFileAppender.ImmediateFlush = true
log4cplus.appender.rollFileAppender.layout = log4cplus::PatternLayout
log4cplus.appender.rollFileAppender.layout.ConversionPattern = %D{%Y/%m/%d %H:%M:%S,%Q} %-5p %c [%l] - %m %n

CMakeLists.txt文件

cmake_minimum_required(VERSION 3.15)
project(OutputLogToRollFileAndConsle)

set(CMAKE_CXX_STANDARD 11)

set(libraries log4cplus)

# 将代码中config文件夹中数据拷贝到 执行目录
file(GLOB configFiles config/*)
file (COPY ${configFiles} DESTINATION ${CMAKE_BINARY_DIR}/config)


add_executable(${PROJECT_NAME} main.cpp)

target_link_libraries(${PROJECT_NAME} ${libraries})

输出:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

墨1024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值