dll和一個可執行文件都使用boost :: log。他們最終使用不同的單身日誌核心。我如何公開dll核心到可執行文件,並將dll-core註冊到exe-core,以便我可以將它們重定向到一個日誌文件中。如何將一個boost日誌核心公開並註冊到另一個
我寫了一個最小的例子來說明其中I絆倒:
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的構造函數創建一個以控制檯結束的跟蹤消息。主要將其輸出重定向到日誌文件,但不會將dll輸出重定向到相同的日誌文件。我想dll包含自己的日誌,我必須首先將其消息重定向到另一個核心。我搜索了這個問題,但我找不到一個簡單的解決方案,儘管它在安裝過程中認爲這應該是主要的單線調用。並在dll界面中獲取提升logcore單例的getter。
有沒有我失蹤的標準方式?我將如何重定向該日誌記錄?
編輯#2: - 我找到了一個可能的解決方案here。 - 如果該提示解決了問題,我將刪除此問題,因爲它是一個克隆。
編輯#3: 我從EDIT#2實現了建議的解決方案。它有效,但不是我想要的。
本質上你應該#define BOOST_LOG_DYN_LINK
。不幸的是,這不起作用,因爲日誌正在使用遞歸的其他庫也必須添加。我結束了#define BOOST_ALL_DYN_LINK
。 所有的提升現在都是動態的,V1.59可能是30個dll。在我最小的例子中,我必須爲chrono,date_time,文件系統,log_setup,日誌,正則表達式,系統和線程(.count = 8)提供dll。
所以,即使結果正是我想要的方法是不同的,這與其他問題區分開來。 該DLL方法確保只有一個單獨的核心dll。 我更喜歡擁有2個核心來提供dll,因此鏈接在一起對我來說是可以接受的。
有沒有辦法獲得相同的結果,同時仍然靜態鏈接?
您參與開發Boost.Log,是否正確?我如何與你取得聯繫?我想分享一個關於如何做到這一點的願景,看看你是否認爲這是值得的。我希望通過作爲程序員的貢獻來幫助實現這些變化。 – Johannes
當然。您可以在GitHub上提交pull請求和問題:https://github.com/boostorg/log/。有關該圖書館的討論將在Boost開發人員郵件列表上進行討論:http://www.boost.org/community/groups.html#main。 –