如何将一个boost log core公开并注册到另一个

How to expose and register one boost log core to another

dll 和可执行文件都使用 boost::log。他们最终使用不同的单例日志核心。如何将 dll 核心公开给可执行文件并将 dll 核心注册到 exe 核心,以便我可以将两者重定向到一个日志文件中。

我写了一个最小的例子来说明我在哪里绊倒了:

LogUser.hpp

#pragma once

#ifdef DYNLIB_EXPORTS
#define DYNLIB_API __declspec(dllexport)
#else
#define DYNLIB_API __declspec(dllimport)
#endif

class DYNLIB_API LogUser
{
public:
    LogUser();
    ~LogUser() {}
};

LogUser.cpp

#include "LogUser.hpp"
#include <boost\log\trivial.hpp>
LogUser::LogUser()
{
    BOOST_LOG_TRIVIAL(trace) << "LogUser constructed";
}

Main.cpp

#include <boost/log/trivial.hpp>
#include <boost/log/utility/setup/file.hpp>
#include <boost/log/utility/setup/common_attributes.hpp>

#pragma comment (lib, "dynlib.lib")
#include <dynlib/LogUser.hpp>

void setupLogging();

int main()
{
    setupLogging();
    BOOST_LOG_TRIVIAL(trace) << "main enter";
    LogUser dynamicLogUser;
    BOOST_LOG_TRIVIAL(trace) << "main exit";
    return 0;
}

void setupLogging()
{
    using namespace boost::log;
    add_common_attributes();
    register_simple_formatter_factory< trivial::severity_level, char >("Severity");
    add_file_log
        (
        keywords::file_name = "file.log",
        keywords::format = "[%TimeStamp%] [%ThreadID%] [%Severity%]: %Message%"
        );
}

LogUser 编译成 LogUser.dll。 LogUser 的构造函数创建一个最终显示在控制台上的跟踪消息。 Main 将其输出重定向到一个日志文件,但不会将 dll 输出重定向到同一个日志文件。我想 dll 包含它自己的 logcore,我必须先将它的消息重定向到另一个核心。我用谷歌搜索了这个问题,但我找不到一个简单的解决方案,尽管感觉这应该是在安装过程中在 main 中进行的单行调用。和 dll 接口中的 boost logcore 单例getter。

有没有我遗漏的标准方法?我如何在此处重定向该日志记录?

编辑 #1:- 在我的系统上输出我想要发生的事情。

编辑#2: - 我找到了一个可能的解决方案 here。 - 如果那个提示解决了问题,我会删除这个问题,因为我是一个克隆人。

编辑 #3: 我实施了 EDIT #2 中建议的解决方案。它有效,但不是我想要的。

基本上你应该#define BOOST_LOG_DYN_LINK。不幸的是,这不起作用,因为日志正在使用其他也必须递归添加的库。我结束了 #define BOOST_ALL_DYN_LINK 。 所有的提升现在都是动态的,V1.59 可能是 30 个 dll。在我的最小示例中,我必须为计时、date_time、文件系统、log_setup、日志、正则表达式、系统和线程(.count = 8)提供 dll。

所以尽管结果正是我想要的,但实现它的方法不同,这将这个问题与另一个问题区分开来。 DLL 方法确保只有一个核心的 dll 单例。 我更喜欢有 2 个内核而不是必须提供 dll,所以将两者链接在一起对我来说是可以接受的。

有没有办法在仍然静态链接的同时获得相同的结果?

这一切都归结为全局变量。 "Singleton" 只是全局变量的别名。

如果您 link 您的可执行文件和 DLL 都针对 Boost 进行了静态处理,那么它们每个都有自己的单例(全局变量)。如果您想共享它们,那么您必须 link 您的可执行文件和 DLL 都针对共享日志库,以便它们共享相同的全局单例。

这只是使用共享库的结果:由于全局数据,它们倾向于强制其他库也共享。

Boost.Log requires 如果您从多个模块中使用它,则将其构建为共享库。库设计依赖于该需求,日志记录核心不是库中唯一的单例。根据您使用的库功能,如果您违反此先决条件,您或多或少可能 运行 陷入难以调试的问题。也有可能适用于您当前使用的 Boost.Log 版本的代码会因其他版本而中断。