c++ - 为什么 ETW EventWriteString 有二进制负载

标签 c++ windows logging etw

我想通过一个我只想记录字符串的附加组件来扩展我的事件日志(Windows 事件跟踪)。我正在使用如下代码。

#include <Evntprov.h>
#include <evntrace.h>
#include <minwindef.h>

// {38F4122A-4D8C-465A-9EFC-F7E632A84ABF}
static const GUID MyApplicationGuid = { 0x38f4122a, 0x4d8c, 0x465a, { 0x9e, 0xfc, 0xf7, 0xe6, 0x32, 0xa8, 0x4a, 0xbf } };

REGHANDLE regHandle = nullptr;
EventRegister(MyApplicationGuid, nil, nil, &regHandle);

EventWriteString(regHandle, TRACE_LEVEL_INFORMATION, 0x0, L"Hello");
EventWriteString(regHandle, TRACE_LEVEL_INFORMATION, 0x0, L", ");
EventWriteString(regHandle, TRACE_LEVEL_INFORMATION, 0x0, L"world");
EventWriteString(regHandle, TRACE_LEVEL_INFORMATION, 0x0, L"!");

EventUnregister(regHandle);

我已经注册了一个正确显示的提供程序,并且这些事件作为通用事件作为 etl 日志文件的一部分。到目前为止,一切似乎都很好,但是当我想将消息添加为一列时,我无法看到记录的字符串,因为它们存储在二进制有效负载元素中。

我有一种方法可以定义事件/模板,以将使用 EventWriteString 完成的跟踪格式化为消息字符串。类似“%1”的东西? ( header 属性 STRING_ONLY 是自动设置的。)

最佳答案

发现添加 ID 为 0 的事件和单个字符串输出将在“Microsoft Messge Analyzer”中显示字符串。

将以下内容添加到您的 list 中。

<?xml version="1.0" encoding="UTF-16"?>
<instrumentationManifest xsi:schemaLocation="http://schemas.microsoft.com/win/2004/08/events eventman.xsd" xmlns="http://schemas.microsoft.com/win/2004/08/events" xmlns:win="http://manifests.microsoft.com/win/2004/08/windows/events" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:trace="http://schemas.microsoft.com/win/2004/08/events/trace">
  <instrumentation>
    <events>
      <provider name="COMPANY-PRODUCT-PART" guid="{??????-????-????-????-????????????}" symbol="COMPANY_PRODUCT_PART" resourceFileName="UNKNOWN.dll" messageFileName="UNKNOWN.dll">
        <events>
          <event symbol="DbgStr" value="0" version="0" template="OneStringParamTemplate" message="$(string.Product.1.message)">
          </event>
        </events>
        <templates>
          <template tid="OneStringParamTemplate">
            <data name="param" inType="win:UnicodeString" outType="xs:string">
            </data>
          </template>
        </templates>
      </provider>
    </events>
  </instrumentation>
  <localization>
    <resources culture="en-US">
      <stringTable>
        <string id="Product.1.message" value="%1">
        </string>
      </stringTable>
    </resources>
  </localization>
</instrumentationManifest>

关于c++ - 为什么 ETW EventWriteString 有二进制负载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33301663/

相关文章:

java - CXF LoggingFeature 不记录入站请求

c++ - 专门化模板类中的模板结构

c# - 读取mfc资源dll内容

c++ - While 循环使用大量 CPU 时间

c++ - 从 SID 创建用户 token ,在用户上下文中扩展环境变量

python - 使用 pip 在 python 中安装模块失败

c++ - 使用 linux 功能读取 block 的不连续运行

c# - .net - 如何将 Windows 服务与系统托盘应用程序连接

Python 日志记录 - 如何继承根记录器级别和处理程序

c++ - 获取有关 catch block 内何处抛出 C++ 异常的信息?