网站首页 > 资源文章 正文
spdlog大家并陌生,是一个好用且易扩展的开源日志模块。它提供了很多默认的sink,省去很多功夫。本篇就讲讲通过它使用windows event log来记录日志时碰到的一些细节问题吧。
事件日志调用方式,类似下面:
std::shared_ptr<spdlog::logger> logger;
logger->sinks.push_back(std::sharedPtr<spdlog::sinks::win_eventlog_sink_mt>("Event Source", 1000));
其事件日志模块在sinks\win_eventlog_sink.h文件中。从中我们可以看到,初始化时它会调用Win32 API RegisterEventSource注册事件源,在写日志时调用ReportEvent通知系统事件日志服务,最后退出时调用DeregisterEventSource注销事件源。
template<typename Mutex>
class win_eventlog_sink : public base_sink<Mutex>
{
......
HANDLE event_log_handle()
{
if (!hEventLog_)
{
hEventLog_ = ::RegisterEventSourceA(nullptr, source_.c_str());
if (!hEventLog_ || hEventLog_ == (HANDLE)ERROR_ACCESS_DENIED)
{
SPDLOG_THROW(internal::win32_error("RegisterEventSource"));
}
}
return hEventLog_;
}
protected:
void sink_it_(const details::log_msg &msg) override
{
......
LPCSTR lp_str = formatted.data();
succeeded = ::ReportEventA(event_log_handle(), eventlog::get_event_type(msg), eventlog::get_event_category(msg), event_id_,
current_user_sid_.as_sid(), 1, 0, &lp_str, nullptr);
......
}
public:
win_eventlog_sink(std::string const &source, WORD event_id = 1000 /* according to mscoree.dll */)
: source_(source)
, event_id_(event_id)
{
......
}
~win_eventlog_sink()
{
if (hEventLog_)
DeregisterEventSource(hEventLog_);
}
};
实操中,碰到的细节问题有几个:
- 自定义事件源
默认情况下如果不指定事件源或找不到事件源,日志会写到系统的应用程序日志下,如下图位置:
- 如果要显示到系统事件查看器自定义的目录下,就需要在注册表中注册事件源,如下图注册表中添加了一个test日志,有两个事件源:
注册成功后,可在日志查看器的test目录下查看日志信息:
3.事件日志查看器是通过注册表中指定的DLL文件来解析日志的。前面"2."图中EventMessageFile指定了DLL的路径, TypeSupported表示支持信息,告警,严重等类型的日志。DLL文件是由微软定义的.mc文件编译生成的,本质上是一个仅含资源的DLL。如下是一个典型的的mc文件:
MessageIdTypedef=DWORD
SeverityNames=(
Success=0x0:STATUS_SEVERITY_SUCCESS
Informational=0x1:STATUS_SEVERITY_INFORMATIONAL
Warning=0x2:STATUS_SEVERITY_WARNING
Error=0x3:STATUS_SEVERITY_ERROR
)
LanguageNames=(
English=0x409:MSG00409
SimplifiedChinese=0x804:MSG00804
)
MessageId=1
SymbolicName=HS_Debug
Language=English
Debug level
.
Language=SimplifiedChinese
调试级别
.
MessageId=2
SymbolicName=HS_Info
Language=English
Info level
.
Language=SimplifiedChinese
信息级别
.
MessageId=3
SymbolicName=HS_Warn
Language=English
Warn level
.
Language=SimplifiedChinese
警告级别
.
MessageId=4
SymbolicName=HS_Error
Language=English
Error level
.
Language=SimplifiedChinese
错误级别
.
MessageId=1000
SymbolicName=HS_Service
Language=English
Log from hsservice:%r%n
%1
.
Language=SimplifiedChinese
来自hsservice的日志:%r
%1
.
要注意的是:
4.DLL的编译和生成。有了上述mc文件后,可启动visual studio编译环境后,运行mc, rc,link工具生成DLL,如:
call "%programfiles%\Microsoft Visual Studio\2022\Professional\VC\Auxiliary\Build\vcvars64.bat" x64
mc.exe hsevtlog.mc
rc.exe /r hsevtlog.rc
link /MACHINE:x64 -dll -noentry -out:hsevtlog.dll hsevtlog.res
猜你喜欢
- 2024-09-21 记一次 .NET某半导体CIM系统 崩溃分析
- 2024-09-21 不要把异常当做业务逻辑,这性能可能你无法承受
- 2024-09-21 使用最新的代码重用攻击绕过执行流保护(二)
- 2024-09-21 net高级调试--应用程序域(net高级程序员)
- 2024-09-21 精通c# -- .NET之道(c#语言从入门到精通)
- 2024-09-21 Mono源码学习-1(mono github)
- 2024-09-21 使用 MiFlash 刷机中出错的解决办法,喜欢自己刷机可以参考一下
- 2024-09-21 除 Win11 外,微软刚发布的 KB5013942 也同样会导致 Win10 出错
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- 电脑显示器花屏 (79)
- 403 forbidden (65)
- linux怎么查看系统版本 (54)
- 补码运算 (63)
- 缓存服务器 (61)
- 定时重启 (59)
- plsql developer (73)
- 对话框打开时命令无法执行 (61)
- excel数据透视表 (72)
- oracle认证 (56)
- 网页不能复制 (84)
- photoshop外挂滤镜 (58)
- 网页无法复制粘贴 (55)
- vmware workstation 7 1 3 (78)
- jdk 64位下载 (65)
- phpstudy 2013 (66)
- 卡通形象生成 (55)
- psd模板免费下载 (67)
- shift (58)
- localhost打不开 (58)
- 检测代理服务器设置 (55)
- frequency (66)
- indesign教程 (55)
- 运行命令大全 (61)
- ping exe (64)
本文暂时没有评论,来添加一个吧(●'◡'●)