我有一个由一个 exe 和两个 DLL 组成的 MFC 应用程序。exe 从这两个 DLL 调用函数。现在我正在尝试使用 Pantheios 日志库添加一些日志记录。
我想要实现
的目标: exe 和两个 DLL 都记录到硬盘驱动器中的同一个日志文件中。
这是我所做的:
1)在主exe程序中使用隐式链接:
#include "stdafx.h"
#include <pantheios/implicit_link/core.h>
#include <pantheios/implicit_link/fe.simple.h>
#include <pantheios/implicit_link/be.file.h>
#define USER_SPECIFIED_LEVEL
#ifndef USER_SPECIFIED_LEVEL
#include <pantheios/implicit_link/fe.simple.h>
#endif
#ifdef USER_SPECIFIED_LEVEL
PANTHEIOS_CALL(int) pantheios_fe_init(void* reserved,void** ptoken)
{
*ptoken = NULL;
return 0;
}
PANTHEIOS_CALL(void) pantheios_fe_uninit(void* token)
{}
PANTHEIOS_CALL(PAN_CHAR_T const*) pantheios_fe_getProcessIdentity (void * token)
{
return PANTHEIOS_LITERAL_STRING(MY_PROGRAM_ID);
}
PANTHEIOS_CALL(int) pantheios_fe_isSeverityLogged(void* token
, int severity
, int backEndId)
{
//SEV_CRITICAL=2 < SEV_ERROR=3 < SEV_WARNING=4 < SEV_INFORMATIONAL=6
if(severity <= pantheios::SEV_INFORMATIONAL)
return 1;//allow output for anything above information lvl
return 0;
}
#endif
在我需要添加我使用的日志记录的主 exe 程序中(在查看了 SO 中的这个链接PANTHEIOS_BE_FILE_F_SHARE_ON_WINDOWS
之后):
pantheios_be_file_setFilePath(PSTR("C:\\TestLog.log"),**PANTHEIOS_BE_FILE_F_SHARE_ON_WINDOWS**, 0, PANTHEIOS_BEID_ALL);
pantheios::log_NOTICE(PSTR("process id: ["), pantheios::processId, PSTR("]"));
pantheios::log_NOTICE(PSTR("thread id: ["), pantheios::threadId, PSTR("]"));
pantheios::log_INFORMATIONAL(PSTR("testing log messagse"));
这工作正常,我可以按预期登录 c:\TestLog.log 文件。但是,我根本无法在这两个 DLL 中进行日志记录,它只会为每个日志记录调用提供错误:
pantheios::log_INFORMATIONAL(PSTR("testing message"));
说令牌是空的,所以我用谷歌搜索并找到了一个解决方案:
2)我需要打电话:
pantheios::init();
对于每个 DLL 在其DllMain
函数中的初始化。这样,当我尝试登录 DLL 时,不再出现“空令牌”错误,但日志文件中的 DLL 仍然没有记录任何内容(同样,主 exe 程序很好)。
3)我稍微调整了一下,我必须更改 DLL 日志中的日志文件名,以便它们都记录到不同的文件:
DLL #1:
pantheios_be_file_setFilePath(PSTR("C:\\TestLogDll1.log"),PANTHEIOS_BE_FILE_F_SHARE_ON_WINDOWS, 0, PANTHEIOS_BEID_ALL);
DLL #2:
pantheios_be_file_setFilePath(PSTR("C:\\TestLogDll2.log"),PANTHEIOS_BE_FILE_F_SHARE_ON_WINDOWS, 0, PANTHEIOS_BEID_ALL);
这样我就有 3 个日志文件都可以正常工作:
- 主程序的 TestLog.log
- DLL #1 的 TestLogDll1.log
- DLL #2 的 TestLogDll2.log
但是我仍然无法让两个 DLL 都记录到与主 exe 相同的文件(TestLog.log)。