dll 和可执行文件都使用 boost::log。他们最终使用不同的单例日志核心。如何将 dll 核心暴露给可执行文件并将 dll 核心注册到 exe 核心,以便我可以将两者重定向到一个日志文件中。
我写了一个最小的例子来说明我绊倒的地方:
日志用户.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() {}
};
日志用户.cpp
#include "LogUser.hpp"
#include <boost\log\trivial.hpp>
LogUser::LogUser()
{
BOOST_LOG_TRIVIAL(trace) << "LogUser constructed";
}
主文件
#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。
有没有我想念的标准方式?我将如何在此处重定向该日志记录?
编辑#2:-我在这里找到了一个可能的解决方案。- 如果该提示解决了问题,由于是克隆,我将删除此问题。
编辑#3:我实施了编辑#2 中建议的解决方案。它有效,但不是我想要的。
基本上你应该这样做#define BOOST_LOG_DYN_LINK。不幸的是,这不起作用,因为 log 正在使用其他还必须递归添加的库。我结束了#define BOOST_ALL_DYN_LINK。现在所有的 boost 都是动态的,在 V1.59 中可能是 30 个 dll。在我的最小示例中,我必须为 chrono、date_time、filesystem、log_setup、log、regex、system 和 thread (.count = 8) 提供 dll。
因此,即使结果正是我想要得到它的方式不同,这也将这个问题与另一个问题区分开来。DLL 方法确保核心只有一个 dll 单例。我更喜欢拥有 2 个内核而不是必须提供 dll,因此将两者链接在一起对我来说是可以接受的。
有没有办法在静态链接的同时获得相同的结果?
