Easylogging++日志库介绍和崩溃解决方案

简介

        Easylogging++ 是一个轻量级、高性能且易于使用的 C++ 日志库。它被设计用于在 C++ 项目中提供可靠、灵活和可定制的日志记录功能。

以下是 Easylogging++ 的一些主要特点:

  • 跨平台支持:

    • Easylogging++ 可以在 Windows、Linux 和 macOS 等主流操作系统上工作。它具有良好的跨平台兼容性。
  • 易于集成和使用:

    • Easylogging++ 只需要包含单个头文件就可以在项目中使用。它没有任何外部依赖,易于集成。它提供了直观的 API,使用起来非常简单,开发者可以快速上手。
  • 高度可配置:

    • Easylogging++ 提供了大量的配置选项,可以满足各种日志记录需求。开发者可以自定义日志输出格式、日志级别、日志文件管理等。
    • 配置可以通过代码或配置文件的方式进行设置。
  • 性能优秀:

    • Easylogging++ 采用了高度优化的实现,具有出色的性能。它最小化了日志记录的开销,对应用程序的性能影响很小。
  • 丰富的功能:

    • 支持多线程安全
    • 支持崩溃日志记录
    • 支持性能跟踪
    • 支持日志文件滚动和管理
    • 支持自定义日志输出格式
    • 支持日志级别控制
    • 支持命令行参数配置
    • 等等
  • 活跃的社区:

    • Easylogging++ 拥有一个活跃的开源社区,有众多开发者参与项目的维护和贡献。
    • 可以在 GitHub 上找到项目源码、文档以及各种示例代码。

总的来说, Easylogging++ 是一个功能强大、易于使用且高度可配置的 C++ 日志库。它广泛应用于各种 C++ 项目中,是一个非常优秀的日志解决方案。通过 Easylogging++,开发者可以轻松地为应用程序添加可靠的日志记录功能。

基本使用

把头文件和源文件加入到项目编译即可,举个cmake例子。

#添加日志库
set(EASYLOGGINGPP_DIRS ${CMAKE_SOURCE_DIR}/third_party/log/)
# 创建服务器可执行文件
add_executable(server 
${SERVER_SOURCES} ${SERVER_HEADERS} 
${EASYLOGGINGPP_DIRS}/easylogging++.h
${EASYLOGGINGPP_DIRS}/easylogging++.cc
)

配置文件

网上大部分是在程序中嵌入比如:

#include "homewindow.h"
#include <QApplication>
#include "easylogging++.h"

INITIALIZE_EASYLOGGINGPP    // 初始化宏,有且只能使用一次

#undef main
int main(int argc, char *argv[])
{

//    el::Loggers::reconfigureAllLoggers(el::ConfigurationType::Format, "%datetime %level %func(L%line) %msg");
    // 设置全局日志级别为 FATAL
    el::Loggers::setLoggingLevel(el::Level::Info);
    el::Configurations conf;
    conf.setToDefault();
    //设置日志输出格式,包括日期时间、日志级别、函数名称、行号和日志信息。
    conf.setGlobally(el::ConfigurationType::Format, "[%datetime | %level] %func(L%line) %msg");
    conf.setGlobally(el::ConfigurationType::Filename, "log_%datetime{%Y%M%d}.log");// 设置日志文件名,以当前日期命名。
    conf.setGlobally(el::ConfigurationType::Enabled, "true");//启用日志输出。
    conf.setGlobally(el::ConfigurationType::ToFile, "true");//输出日志到文件。
    el::Loggers::reconfigureAllLoggers(conf);//将配置应用到所有日志记录器。
    el::Loggers::reconfigureAllLoggers(el::ConfigurationType::ToStandardOutput, "true"); // 也输出一份到终端

/*    LOG(VERBOSE) << "logger test"; //该级别只能用宏VLOG而不能用宏 LOG(VERBOSE)
    LOG(TRACE) << " logger";
    LOG(DEBUG) << "logger test";
    LOG(INFO) << "logger test";
    LOG(WARNING) << "logger test";
    LOG(ERROR) << "logger test";
*/
    

    return a.exec();
}

可以通过配置文件方法,好处是动态加载,不需要每次重新编译。创建ellog_config.ini 写入下列配置。 比如不想输出更改启用日志=false

* GLOBAL:
   ## 是否启用日志功能
   ENABLED                 =   false
   ## 是否输出到文件
   TO_FILE                 =   true
   ## 是否输出到控制台
   TO_STANDARD_OUTPUT      =   true
   ## 日志格式
   FORMAT                  =   "[%datetime | %level | %thread] %func(L%line) %msg"
   ## 日志文件命名格式
   FILENAME                =   "ellog_%datetime{%Y%M%d}.log"
   ## 时间戳的毫秒显示位数
   MILLISECONDS_WIDTH      =   3
   ## 是否启用性能追踪
   PERFORMANCE_TRACKING    =   true
   ## 单个日志文件最大大小(字节)
   MAX_LOG_FILE_SIZE      =   2097152  ## 2MB
   ## 日志缓冲区刷新阈值(条数)
   LOG_FLUSH_THRESHOLD    =   100

* DEBUG:
   ##单独打开可以跳过全局配置 false
   ##ENABLED                 =   true  
   FORMAT                  =   "[%datetime | %level | %thread] %func(L%line) %msg"

* INFO:
   ##ENABLED                 =   true
   FORMAT                  =   "[%datetime | %level | %thread] %func(L%line) %msg"

* WARNING:
   ##ENABLED                 =   true
   FORMAT                  =   "[%datetime | %level | %thread] %func(L%line) %msg"

* ERROR:
   ##ENABLED                 =   true
   FORMAT                  =   "[%datetime | %level | %thread] %func(L%line) %msg"

* FATAL:
   ##ENABLED                 =   true
   FORMAT                  =   "[%datetime | %level | %thread] %func(L%line) %msg"

后续使用

#include"easylogging++.h"
INITIALIZE_EASYLOGGINGPP    // 初始化宏,有且只能使用一次

void init_log(){
    // 设置默认配置
    el::Configurations defaultConf;
    defaultConf.setToDefault();
    
    // 加载自定义配置
    el::Configurations conf("ellog_config.ini");
    el::Loggers::reconfigureAllLoggers(conf);
    
}


/*  
VLOG(VERBOSE) << "logger test"; //该级别只能用宏VLOG而不能用宏 LOG(VERBOSE)
    LOG(TRACE) << " logger";
    LOG(DEBUG) << "logger test";
    LOG(INFO) << "logger test";
    LOG(WARNING) << "logger test";
    LOG(ERROR) << "logger test";
*/

多线程bug运行时崩溃

主要问题:多线程环境调用LOG(XXX),导致输出语句崩溃。

首先在网上查阅了相关资料,大部分是加上线程安全宏定义 ,但并没解决问题。

#define ELPP_THREAD_SAFE

即使加了线程安全宏定义也无用,通过ai不断调试询问,最终得知需要手动加上编译选项。

# 添加日志库的编译选项
add_definitions(
    -DELPP_THREAD_SAFE            //线程安全
    -DELPP_FEATURE_CRASH_LOG      //崩溃处理
    -DELPP_STL_LOGGING            //兼容stl容器
)

在qt项目中.pro增加

#EasyLogging++兼容性,安全性。
DEFINES += ELPP_THREAD_SAFE \
           ELPP_FEATURE_CRASH_LOG \
           ELPP_STL_LOGGING

学习资料分享

0voice · GitHub

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值