c++编译使用log4cplus

2023-10-24 15:52
文章标签 c++ 编译 使用 log4cplus

本文主要是介绍c++编译使用log4cplus,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、log4cplus是什么?
  • 二、使用步骤
    • 1.下载源代码
    • 2.开始配置
      • 1.配置介绍
      • 2.开始编译
    • 3.cmake引用
    • 4.示例
  • 总结


前言

C++很强大,但是仍然有很多不尽如人意的地方,比如打印日志方面就没有java的log4j那种信手拈来,自然而然地东西。目前官方没有推出这个东西,只能借助第三方开源项目实现,或者干脆自己实现。但是,今天我们说一说一个很强大地日志库log4cplus在c++项目中地使用。


一、log4cplus是什么?

看名字就明白了,为c++开发地日志库。接下来引用开发者的话:

log4cplus is a simple to use C++ logging API providing thread–safe, flexible, and arbitrarily granular control over log management and configuration. It is modeled after the Java log4j API.

二、使用步骤

1.下载源代码

这个地方需要注意地是现在master是3.x版本了,这个版本基于C++ 20以后,使用C++ 11会直接编译报错。如果你是C++ 11的话请在分支里找到2.x的版本(包括2.0.x和2.1.x)。

由于这两个版本编译上没有显著区别,今天就以2.0.x版本为基础讲一下log4cplus的编译使用。

log4cplus下载地址

git clone https://gitee.com/anold/log4cplus.git -b 2.0.x

这里克隆完了还不能拿来直接用,还需要同步下引用的子项目。直接克隆的代码很小,包括子项目之后的大概是不到60MB,请留一下项目大小。

在这里插入图片描述
进入到项目目录后执行以下命令:

git submodule update --init --recursive

一定要确认所有操作成功了才行,否则编译时一定失败。

2.开始配置

1.配置介绍

log4cplus配置项众多,可以根据需要来配置。

请注意,不同的版本分支配置项可能不一样,请注意区分。这个东西在配置文件里可以看到,这里不细说了。

Configure script options
--enable-debugging
This option is disabled by default. This option mainly affects GCC builds but it also has some limited effect on non-GCC builds. It turns on debugging information generation, undefines NDEBUG symbol and adds -fstack-check (GCC).--enable-warnings
This option is enabled by default. It adds platform / compiler dependent warning options to compiler command line.--enable-so-version
This option is enabled by default. It enables SO version decoration on resulting library file, e.g., the .2.0.0 in liblog4cplus-1.2.so.2.0.0.--enable-release-version
This option is enabled by default. It enables release version decoration on the resulting library file, e.g., the -1.2 in liblog4cplus-1.2.so.2.0.0.--enable-symbols-visibility-options
This option is enabled by default. It enables use of compiler and platform specific option for symbols visibility. See also the Visibility page on GCC Wiki.--enable-profiling
This option is disabled by default. This option adds profiling information generation compiler option -pg to GCC and Sun CC / Solaris Studio builds.--enable-threads
This option is enabled by default. It turns on detection of necessary compiler and linker flags that enable POSIX threading support.While this detection usually works well, some platforms still need help with configuration by supplying additional flags to the configure script. One of the know deficiencies is Solaris Studio on Linux. See one of the later note for details.--with-wchar_t-support
This option is enabled by default. When enabled, additional binaries will be built, marked with U suffix in file name and compiled with -DUNICODE=1 flag. In effect, these binaries assume that log4cplus::tchar is wchar_t.--with-working-locale
This is one of three locale and wchar_t↔char conversion related options. It is disabled by default.It is know to work well with GCC on Linux. Other platforms generally have lesser locale support in their implementations of the C++ standard library. It is known not to work well on any BSDs.See also docs/unicode.txt.--with-working-c-locale
This is second of wchar_t↔char conversion related options. It is disabled by default.It is known to work well on most Unix--like platforms, including recent Cygwin.--with-iconv
This is third of wchar_t↔char conversion related options. It is disabled by default.The conversion using iconv() function always uses "UTF-8" and "WCHAR_T" as source/target encoding. It is known to work well on platforms with GNU iconv. Different implementations of iconv() might not support "WCHAR_T" encoding selector.Either system provided iconv() or library provided libiconv() are detected and accepted. Also both SUSv3 and GNU iconv() function signatures are accepted.--with-qt
This option is disabled by default. It enables compilation of a separate shared library (liblog4cplusqt4debugappender) that implements Qt4DebugAppender. It requires Qt4 and pkg-config to be installed.--enable-tests
This option is enabled by default. It enables compilation of test executables.--enable-unit-tests
This option is disabled by default. It enables compilation of unit tests along their units. These unit tests then can be executed through unit_tests test executable that is built during compilation.

主要包括调试,so版本号支持,宽字符支持和本地化等。如果看不懂英文就维持原样。

2.开始编译

编译方法原作者已经给出了,这里着重说一下LInux上的编译。

这里还是建议安装到/usr/local;一方面,因为/usr本身包含很多操作系统预装的应用,相比来说/usr/local基本上空空如也,管理起来方便。另一方面,也是为了以后使用pkgconfig查找方便,这个后面再说。

./configure --prefix=/usr/local --enable-so-version=yes --enable-release-version=yes \
--enable-threads=yes

配置好之后使用下面的命令:

make -j6 && sudo make install

安装好之后会在/usr/local下面找到,重点是/usr/local/lib/pkgconfig/log4cplus.pc,一会配置要用到这个文件。

3.cmake引用

这里选用的是cmake,不为了别的就是因为简单。这里需要先通过cmake找到pkgconf这个包管理器,再通过pkgconf进一步定位log4cplus这个最终需要的包。
请看配置:

cmake_minimum_required(VERSION 3.10)
project(log_4_cplus)set(CMAKE_CXX_STANDARD 11)
find_package(PkgConfig REQUIRED)
if (PKG_CONFIG_FOUND)message(STATUS "PkgConfig Found")pkg_search_module(log4cplusREQUIREDlog4cplusIMPORTED_TARGET)if (TARGET PkgConfig::log4cplus)message(STATUS "log4cplus Found")add_executable(log_4_cplus main.cpp)target_link_libraries(log_4_cplus PkgConfig::log4cplus)endif ()
endif ()

重点就是find_package(PkgConfig REQUIRED)pkg_search_module,前者找到Linux上面安装的pkgconf,后者通过pkgconf找到它管理的module,也就是log4cplus。

这个时候你就可以使用log4cplus了。下面列出几个简单的例子,其它的用法可以看下开发者的tests或wiki。

4.示例

简单实用1:

#include <iostream>
#include <iomanip>
#include <log4cplus/logger.h>
#include <log4cplus/loggingmacros.h>
#include <log4cplus/configurator.h>
#include <log4cplus/initializer.h>using namespace std;
using namespace log4cplus;
using namespace log4cplus::helpers;void printTest(log4cplus::Logger const &logger) {LOG4CPLUS_INFO(logger,LOG4CPLUS_TEXT("This is")<< LOG4CPLUS_TEXT(" a reall")<< LOG4CPLUS_TEXT("y long message.") << std::endl<< LOG4CPLUS_TEXT("Just testing it out") << std::endl<< LOG4CPLUS_TEXT("What do you think?"));LOG4CPLUS_INFO(logger, LOG4CPLUS_TEXT("This is a bool: ") << true);LOG4CPLUS_INFO(logger, LOG4CPLUS_TEXT("This is a char: ")<< LOG4CPLUS_TEXT('x'));LOG4CPLUS_INFO(logger, LOG4CPLUS_TEXT("This is a short: ")<< static_cast<short>(-100));LOG4CPLUS_INFO(logger, LOG4CPLUS_TEXT("This is a unsigned short: ")<< static_cast<unsigned short>(100));LOG4CPLUS_INFO(logger, LOG4CPLUS_TEXT("This is a int: ") << 1000);LOG4CPLUS_INFO(logger, LOG4CPLUS_TEXT("This is a unsigned int: ") << 1000U);LOG4CPLUS_INFO(logger, LOG4CPLUS_TEXT("This is a long(hex): ")<< std::hex << 100000000L);LOG4CPLUS_INFO(logger, LOG4CPLUS_TEXT("This is a unsigned long: ")<< static_cast<unsigned long>(100000000U));LOG4CPLUS_INFO(logger, LOG4CPLUS_TEXT("This is a float: ") << 1.2345f);LOG4CPLUS_INFO(logger, LOG4CPLUS_TEXT("This is a double: ")<< std::setprecision(15)<< 1.2345234234);LOG4CPLUS_INFO(logger, LOG4CPLUS_TEXT("This is a long double: ")<< std::setprecision(15)<< 123452342342.342L);
}int main(){log4cplus::Initializer initializer;log4cplus::BasicConfigurator config;config.configure(logger);log4cplus::Logger logger = log4cplus::Logger::getInstance(LOG4CPLUS_TEXT("main"));printTest();return 0;
}

简单实用2:

#include <iostream>
#include <iomanip>
#include <log4cplus/logger.h>
#include <log4cplus/loggingmacros.h>
#include <log4cplus/configurator.h>
#include <log4cplus/initializer.h>using namespace std;
using namespace log4cplus;
using namespace log4cplus::helpers;//带时间格式的日志
void time_format_test() {log4cplus::tchar const fmtstr[] =LOG4CPLUS_TEXT("%s, %Q%%q%q %%Q %%q=%%%q%%;%%q, %%Q=%Q");std::cout << "Entering main()..." << std::endl;log4cplus::Initializer initializer;try {Time time;log4cplus::tstring str;time = now();str = getFormattedTime(fmtstr, time);log4cplus::tcout << LOG4CPLUS_TEXT ("now: ") << str << std::endl;time = time_from_parts(0, 7);str = getFormattedTime(fmtstr, time);log4cplus::tcout << str << std::endl;time = time_from_parts(0, 17);str = getFormattedTime(fmtstr, time);log4cplus::tcout << str << std::endl;time = time_from_parts(0, 123);str = getFormattedTime(fmtstr, time);log4cplus::tcout << str << std::endl;time = time_from_parts(0, 1234);str = getFormattedTime(fmtstr, time);log4cplus::tcout << str << std::endl;time = time_from_parts(0, 12345);str = getFormattedTime(fmtstr, time);log4cplus::tcout << str << std::endl;time = time_from_parts(0, 123456);str = getFormattedTime(fmtstr, time);log4cplus::tcout << str << std::endl;time = time_from_parts(0, 0);str = getFormattedTime(fmtstr, time);log4cplus::tcout << str << std::endl;}catch (std::exception const &e) {std::cout << "Exception: " << e.what() << std::endl;}catch (...) {std::cout << "Exception..." << std::endl;}std::cout << "Exiting main()..." << std::endl;
}int main(){time_format_test();return 0;
}

总结

1、蛮简单的,倒是log4cplus的使用有很多需要研究的地方

这篇关于c++编译使用log4cplus的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/276239

相关文章

Java使用SLF4J记录不同级别日志的示例详解

《Java使用SLF4J记录不同级别日志的示例详解》SLF4J是一个简单的日志门面,它允许在运行时选择不同的日志实现,这篇文章主要为大家详细介绍了如何使用SLF4J记录不同级别日志,感兴趣的可以了解下... 目录一、SLF4J简介二、添加依赖三、配置Logback四、记录不同级别的日志五、总结一、SLF4J

使用Python实现一个优雅的异步定时器

《使用Python实现一个优雅的异步定时器》在Python中实现定时器功能是一个常见需求,尤其是在需要周期性执行任务的场景下,本文给大家介绍了基于asyncio和threading模块,可扩展的异步定... 目录需求背景代码1. 单例事件循环的实现2. 事件循环的运行与关闭3. 定时器核心逻辑4. 启动与停

如何使用Nginx配置将80端口重定向到443端口

《如何使用Nginx配置将80端口重定向到443端口》这篇文章主要为大家详细介绍了如何将Nginx配置为将HTTP(80端口)请求重定向到HTTPS(443端口),文中的示例代码讲解详细,有需要的小伙... 目录1. 创建或编辑Nginx配置文件2. 配置HTTP重定向到HTTPS3. 配置HTTPS服务器

Java使用ANTLR4对Lua脚本语法校验详解

《Java使用ANTLR4对Lua脚本语法校验详解》ANTLR是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件,下面就跟随小编一起看看Java如何使用ANTLR4对Lua脚本... 目录什么是ANTLR?第一个例子ANTLR4 的工作流程Lua脚本语法校验准备一个Lua Gramm

Java Optional的使用技巧与最佳实践

《JavaOptional的使用技巧与最佳实践》在Java中,Optional是用于优雅处理null的容器类,其核心目标是显式提醒开发者处理空值场景,避免NullPointerExce... 目录一、Optional 的核心用途二、使用技巧与最佳实践三、常见误区与反模式四、替代方案与扩展五、总结在 Java

使用Java将DOCX文档解析为Markdown文档的代码实现

《使用Java将DOCX文档解析为Markdown文档的代码实现》在现代文档处理中,Markdown(MD)因其简洁的语法和良好的可读性,逐渐成为开发者、技术写作者和内容创作者的首选格式,然而,许多文... 目录引言1. 工具和库介绍2. 安装依赖库3. 使用Apache POI解析DOCX文档4. 将解析

Qt中QUndoView控件的具体使用

《Qt中QUndoView控件的具体使用》QUndoView是Qt框架中用于可视化显示QUndoStack内容的控件,本文主要介绍了Qt中QUndoView控件的具体使用,具有一定的参考价值,感兴趣的... 目录引言一、QUndoView 的用途二、工作原理三、 如何与 QUnDOStack 配合使用四、自

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

使用Python构建一个Hexo博客发布工具

《使用Python构建一个Hexo博客发布工具》虽然Hexo的命令行工具非常强大,但对于日常的博客撰写和发布过程,我总觉得缺少一个直观的图形界面来简化操作,下面我们就来看看如何使用Python构建一个... 目录引言Hexo博客系统简介设计需求技术选择代码实现主框架界面设计核心功能实现1. 发布文章2. 加

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a