Regex 如何优化扩展事件到JSON的转换
我有一个小流程,用于接收.xel文件,使用dba工具模块将其转换为自定义对象,然后将其转换为单行JSON,并将其导出到一个文件,然后发送到任何地方。在这里:Regex 如何优化扩展事件到JSON的转换,regex,powershell,optimization,extended-events,Regex,Powershell,Optimization,Extended Events,我有一个小流程,用于接收.xel文件,使用dba工具模块将其转换为自定义对象,然后将其转换为单行JSON,并将其导出到一个文件,然后发送到任何地方。在这里: $path = 'C:\temp\big_xe_file.xel' #Read in file $xes = Read-DbaXEFile -Path $path #Output Variable $file = "" foreach ($xe in $xes) { #f
$path = 'C:\temp\big_xe_file.xel'
#Read in file
$xes = Read-DbaXEFile -Path $path
#Output Variable
$file = ""
foreach ($xe in $xes) {
#format date column
$xe.timestamp = ($xe.timestamp.DateTime).ToString("yyyy-MM-ddThh:mm:ss.ffff")
# convert to JSON and change escaped unicode characters back
$xe = (($xe | ConvertTo-Json -compress)) | % { #| % { [System.Text.RegularExpressions.Regex]::Unescape($_) }
[Regex]::Replace($_,
"\\u(?<Value>[a-zA-Z0-9]{4})", {
param($m) ([char]([int]::Parse($m.Groups['Value'].Value,
[System.Globalization.NumberStyles]::HexNumber))).ToString() } )}
#Write line to file
Add-Content -Value "$($xe)`n" -Path 'C:\temp\myevents.json' -Encoding utf8 -NoNewline
}
$path='C:\temp\big\u xe\u file.xel'
#读入文件
$xes=读取DbaXEFile-路径$Path
#输出变量
$file=“”
foreach($xe中的$xes){
#格式化日期列
$xe.timestamp=($xe.timestamp.DateTime).ToString(“yyyy-MM-ddThh:MM:ss.ffff”)
#转换为JSON并将转义的unicode字符更改回
$xe=($xe | ConvertTo Json-compress))|%{|%{[System.Text.RegularExpressions.Regex]::Unescape($|)}
[Regex]::替换($\ux),
“\\u(?[a-zA-Z0-9]{4}”{
param($m)([char]([int]::Parse($m.Groups['Value'].Value),
[System.Globalization.NumberStyles]::HexNumber()).ToString()}
#将行写入文件
添加内容-值“$($xe)`n”-路径“C:\temp\myevents.json”-编码utf8-非WLINE
}
这正合我的口味,也正是我所需要的。中间的讨厌的正则表达式是因为当你转换到JSON时,它轻松地逃离了所有的Unicode字符,正则表达式神奇地将它们全部转换成我们所知道和喜爱的字符。p>
然而,这一切都有点太慢了。我们生产了大量的.xel文件,通常大小为500mb,我们希望在记录道写入和接收之间有更短的延迟。目前,以这种方式连续处理一个文件大约需要35分钟。如果我们落后的话,延误可能会增加,这似乎有可能以那样的速度
我已经加快了速度。我已经尝试使用[System.Text.RegularExpressions.Regex]::Unescape来代替我的正则表达式代码,但是它只稍微快了一点,并且没有提供我们所需要的正确格式。我的下一步是将文件分割成更小的部分并并行处理它们,但这将大大增加CPU密集度,如果可能的话,我希望避免这种情况
任何帮助优化这是非常感谢 结果是出现了一个配置问题,我们能够抛弃那些毫无意义的正则表达式,并在JSON中保留转义字符。然而,我也找到了一个加速的解决方案,以防有人看到这一点。解决方案是将writer更改为使用.NET类而不是powershell方法
$stream = [System.IO.StreamWriter] $outfile
foreach ($xe in $xes) {
#format date column
$xe.timestamp = ($xe.timestamp.DateTime).ToString("yyyy-MM-ddThh:mm:ss.ffff")
$xe | Add-Member -MemberType NoteProperty -Name 'source_host_name' -Value $server_name
# convert to JSON and change escaped unicode characters back
$xe = (($xe | ConvertTo-Json -compress)) #| % { #| % { [System.Text.RegularExpressions.Regex]::Unescape($_) }
# [Regex]::Replace($_,
# "\\u(?<Value>[a-zA-Z0-9]{4})", {
# param($m) ([char]([int]::Parse($m.Groups['Value'].Value,
# [System.Globalization.NumberStyles]::HexNumber))).ToString() } )}
#Add-Content -Value "$($xe)`n" -Path 'C:\DBA Notes\Traces\Xel.json' -Encoding utf8 -NoNewline
$stream.WriteLine($xe)
}
$stream.close()
$stream=[System.IO.StreamWriter]$outfile
foreach($xe中的$xes){
#格式化日期列
$xe.timestamp=($xe.timestamp.DateTime).ToString(“yyyy-MM-ddThh:MM:ss.ffff”)
$xe |添加成员-成员类型NoteProperty-名称'source_host_Name'-值$server_Name
#转换为JSON并将转义的unicode字符更改回
$xe=($xe | ConvertTo Json-compress))|%{|%{[System.Text.RegularExpressions.Regex]::Unescape($|)}
#[Regex]::替换($\ux),
#“\\u(?[a-zA-Z0-9]{4}”{
#param($m)([char]([int]::Parse($m.Groups['Value'].Value),
#[System.Globalization.NumberStyles]::HexNumber()).ToString()}
#添加内容-值“$($xe)`n”-路径'C:\DBA Notes\Traces\Xel.json'-编码utf8-NoNewline
$stream.WriteLine($xe)
}
$stream.close()
这需要十分之一的时间。干杯我可以问一下为什么让编码过程避开unicode字符是一个问题吗?当其他人必须读取它时,它允许正确解码。将unicode点转换回它们的实际字符可能会导致问题。我们使用ELK堆栈进行日志记录,由于某些原因,这些转义字符会导致弹性搜索在尝试接收它们时抛出错误。我在问题中对其进行配置的方式会生成JSON,接收时不会出现任何错误。我对麋鹿的配置没有任何影响,所以我认为这是不可避免的。哎呀,谢谢麋鹿堆叠警告。我无法想象为什么麋鹿会有这个问题。我真的希望他们没有重新注册JSON日志,但这至少可以解释下游问题的一部分。这也可能是一个配置问题,我没有足够的可见性来说明。我只是在解决眼前的问题