Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ETW格式字符串中的转义字符?_C#_Event Log_Etw_Etw Eventsource - Fatal编程技术网

C# ETW格式字符串中的转义字符?

C# ETW格式字符串中的转义字符?,c#,event-log,etw,etw-eventsource,C#,Event Log,Etw,Etw Eventsource,我正在使用新的EventSource类从我的应用程序写入Windows事件日志,到目前为止,它非常棒。但是,我观察到有两件事可能会导致相关的问题:传递给Event属性的格式字符串在写入事件日志之前似乎没有经过正常的string.format处理 考虑一下这一块: [Event((int)LogEvent.UserCreated, Keywords=Keywords.Directory, Channel=EventChannel.Operational, Message="Created user

我正在使用新的EventSource类从我的应用程序写入Windows事件日志,到目前为止,它非常棒。但是,我观察到有两件事可能会导致相关的问题:传递给Event属性的格式字符串在写入事件日志之前似乎没有经过正常的string.format处理

考虑一下这一块:

[Event((int)LogEvent.UserCreated, Keywords=Keywords.Directory, Channel=EventChannel.Operational,
Message="Created username {0} with forum post signature {1} and homepage {2}.")]
public void UserCreated(string username, string signature, string homepageAddress)
{
    WriteEvent((int)LogEvent.UserCreated, username, signature, homepageAddress);
}
发生了几件事:

  • 如果尝试在消息的格式字符串中插入\n,则事件日志中不会打印换行符
  • 如果签名字符串包含换行符,则会在事件日志中自然打印换行符
  • 如果签名或homepageAddress字符串包含类似ETW的标记(%1、%2或%3),则ETW开始用变量本身替换这些伪标记,而我最终使用嵌套在其内部的变量
我假设如果ETW有一个转义字符,它可以用来将换行符放在格式字符串中,还允许我预处理字符串值以防止这些sql注入式错误


这样的转义字符存在吗?这通常是如何完成的?

由EventSource清单生成器执行的转换是

{0}->%1
...
{n} ->%(n+1)
&->&;
<   -> 
>   -> 
“->&apos;
"   -> "
作为参考,转换在中进行

然后,您将到达消息编译器:

%n[!format\u specifier!]描述插入。每个插入项都是
FormatMessage函数中的Arguments数组。n的值可以是一个数字
在1到99之间。格式说明符是可选的。如果未指定任何值,
默认值是!s有关格式说明符的信息,请参阅wsprintf。
格式说明符可以使用*表示精度或宽度。什么时候
指定时,它们使用编号为n+1和n+2的插入。
%0终止不带尾随换行符的消息文本行。这个可以
用于生成一条长线或终止一条没有尾随符号的提示消息
换行符。
%。生成单个期间。这可用于在最短时间内显示周期
行的开头,否则将终止消息文本。
%!  生成一个感叹号。这可用于指定
插入后立即加上感叹号。
%%生成一个百分号。
%当硬线中断发生在一行的末尾时,n生成硬线中断。这可能是
与FormatMessage一起使用,以确保消息符合一定的宽度。
%b生成一个空格字符。这可用于确保适当的数量
在一条线上的尾随空格。
%r生成不带尾随换行符的硬回车。

由EventSource清单生成器执行的转换是

{0}->%1
...
{n} ->%(n+1)
&->&;
<   -> 
>   -> 
“->&apos;
"   -> "
作为参考,转换在中进行

然后,您将到达消息编译器:

%n[!format\u specifier!]描述插入。每个插入项都是
FormatMessage函数中的Arguments数组。n的值可以是一个数字
在1到99之间。格式说明符是可选的。如果未指定任何值,
默认值是!s有关格式说明符的信息,请参阅wsprintf。
格式说明符可以使用*表示精度或宽度。什么时候
指定时,它们使用编号为n+1和n+2的插入。
%0终止不带尾随换行符的消息文本行。这个可以
用于生成一条长线或终止一条没有尾随符号的提示消息
换行符。
%。生成单个期间。这可用于在最短时间内显示周期
行的开头,否则将终止消息文本。
%!  生成一个感叹号。这可用于指定
插入后立即加上感叹号。
%%生成一个百分号。
%当硬线中断发生在一行的末尾时,n生成硬线中断。这可能是
与FormatMessage一起使用,以确保消息符合一定的宽度。
%b生成一个空格字符。这可用于确保适当的数量
在一条线上的尾随空格。
%r生成不带尾随换行符的硬回车。

请记住,日志记录应该快速、轻便。你不希望你漂亮的格式成为瓶颈。@BrianRasmussen,但这是ETW的乐趣所在。格式化由使用者执行,而不是在写入事件时执行。如果没人看,就没有格式化费用。@Mitch对不起,我没说清楚。我想表达的观点只是建议不要使用任何自定义格式。如果格式化字符串并将其传递给ETW,则会增加开销。请记住,日志记录应该快速且轻量级。你不希望你漂亮的格式成为瓶颈。@BrianRasmussen,但这是ETW的乐趣所在。格式化由使用者执行,而不是在写入事件时执行。如果没人看,就没有格式化费用。@Mitch对不起,我没说清楚。我想表达的观点只是建议不要使用任何自定义格式。如果格式化字符串并将其传递给ETW,则会增加开销。啊,这是有道理的。因此,传递的格式字符串实际上是通过某种搜索/替换或正则表达式来运行的,然后再传送到ETW,尽管看起来像string.format()格式字符串。太好了@bwerks,我现在正在做的一个项目需要这些信息,所以它是非常偶然的。不过,我没法让新词起作用。你有没有想过这个问题?我从来没有想过,没有,我不太记得当时的行为,但似乎它实际上是在进来的路上逃离了%符号本身,或者别的什么。我们决定我们可以忍受这种怪诞,并停止在它上面投入时间,unfo