Easyloggingpp(easylogging++)&CMakelist问题记录

本文介绍easylogging++日志库在CMake工程中的集成方法,包括直接引入源码、避免重复初始化及取消输出到文件等实用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

easylogging++ 是C++代码的一个高效、轻量化的日志插件,支持直接使用.h形式引入,本文简单记录一些遇到的问题及其解决方案。

github源码:GitHub - amrayn/easyloggingpp: Single header C++ logging library. It is extremely powerful, extendable, light-weight, fast performing, thread and type safe and consists of many built-in features. It provides ability to write logs in your own customized format. It also provide support for logging your classes, third-party libraries, STL and third-party containers etc.

一、在CMake工程中集成

一种较为简单的方式是直接将源码作为子目录或以源码形式作为工程的一部分,以下是作为源码的几种方案: 

# method1
file(GLOB_RECURSE YOUR_SOURCE
    easyloggingpp/src/*.cpp
)

# method2
aux_source_directory(easyloggingpp/src/easylogging++.cpp YOUR_SOURCE)

# method3
set(YOUR_SOURCE
    easyloggingpp/src/easylogging++.cc
)

二、避免重复初始化(INITIALIZE_EASYLOGGINGPP)

有时候我们并不想只在main函数中启动我们的程序,例如使用gtest或多接口调用时。次数我们仅需构建自己工程的Logger类,例如:

your_Logger.h
your_logger.cpp

// your_logger.h
#include "easylogging++.h"
// .. 一些配置代码

// --------------------------

// your_logger.cpp
#include "your_logger.h"
INITIALIZE_EASYLOGGINGPP

三、取消输出到文件(只打印到控制台)

在CMakelists.txt中添加:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DELPP_NO_DEFAULT_LOG_FILE")

未完待续,其他问题可详见github页面

<think>嗯,用户问的是Easylogging++的info函数输出内容为空的问题。我得先回想一下常见的可能原因。首先,可能是日志级别设置的问题。如果日志级别高于INFO,比如设置为WARNING或ERROR,那info日志就不会输出。这时候需要检查默认日志级别或者对应Logger的配置。 然后,初始化的问题。用户可能没有正确初始化Easylogging++,比如忘记调用加载配置或启用日志库。记得要使用宏如START_EASYLOGGINGPP或者初始化代码。 接下来,配置文件的路径是否正确。如果用户用了外部配置文件,但路径不对,可能导致配置没加载,进而影响输出。需要确认配置文件是否存在,并且是否正确指定了路径。 还有输出目标的问题。默认情况下,日志可能输出到文件,而用户可能期望在控制台看到。这时候需要检查配置里的输出目标是否包含stdout。 另外,格式器的问题。如果格式器被误配置,比如没有包含实际的消息标签(如%msg),即使日志被记录,也可能看起来是空的。需要检查日志格式的设置。 还有可能性是宏定义冲突或者编译器设置问题。比如,用户可能定义了某些宏导致Easylogging++的宏被禁用,或者编译时优化选项去除了日志代码。需要检查编译选项和相关的宏定义。 最后,建议用户提供代码片段或配置示例,这样可以更具体地分析问题。同时,提醒他们检查基本配置步骤,比如初始化、配置加载和日志级别设置,这些都是常见的问题点。</think>关于Easylogging++的`INFO`日志输出为空的问题,通常由以下几个原因导致。以下是逐步排查指南: --- ### 1. **日志级别未正确设置** - **现象**:所有低于当前阈值的日志级别都会被过滤 - **检查项**: ```cpp // 确全局日志级别包含INFO el::Loggers::setLogLevel(el::Level::Info); // 或通过配置文件设置 el::Configurations conf; conf.setGlobally(el::ConfigurationType::Enabled, "true"); conf.setGlobally(el::ConfigurationType::Level, "INFO"); el::Loggers::reconfigureLogger("default", conf); ``` --- ### 2. **未正确初始化库** - **关键步骤**: - 在main函数开头执行初始化 ```cpp #include "easylogging++.h" INITIALIZE_EASYLOGGINGPP // 必须的宏初始化 int main() { // 加载配置文件(如果有) el::Configurations conf("my_log.conf"); el::Loggers::reconfigureAllLoggers(conf); LOG(INFO) << "测试日志"; // 应输出 return 0; } ``` --- ### 3. **输出目标未配置** - **典型配置示例**(`my_log.conf`): ```ini * GLOBAL: FORMAT = "%datetime [%level] %msg" ENABLED = true TO_FILE = false TO_STANDARD_OUTPUT = true # 必须启用控制台输出 * INFO: FORMAT = "%msg" # 确包含消息内容 ``` --- ### 4. **日志格式缺少消息占位符** - **误示例**:`FORMAT = "[%level] %datetime"`(缺少`%msg`) - **修正方案**:确格式字符串包含`%msg` --- ### 5. **编译器优化导致代码被移除** - **场景**:在Release模式下编译器可能优化掉日志代码 - **解决方案**: ```cmake # 在CMake中强制留日志 target_compile_definitions(your_target PRIVATE ELPP_NO_DEFAULT_LOG_FILE) ``` --- ### 6. **多线程环境未同步** - **现象**:异步日志未及时刷新 - **调试方法**: ```cpp LOG(INFO) << "测试" << std::flush; // 强制刷新缓冲区 ``` --- ### 快速验证代码 ```cpp #include "easylogging++.h" INITIALIZE_EASYLOGGINGPP int main() { el::Configurations conf; conf.setToDefault(); conf.setGlobally(el::ConfigurationType::Format, "%datetime [%level] %msg"); conf.setGlobally(el::ConfigurationType::ToStandardOutput, "true"); el::Loggers::reconfigureLogger("default", conf); LOG(INFO) << "Hello Easylogging++"; // 应输出 return 0; } ``` 如果上述代码仍无输出,请检查: 1. 头文件路径是否正确 2. 是否链接了必要的库文件 3. 编译器是否支持C++11及以上标准
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值