Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.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
Regex 如何优化扩展事件到JSON的转换_Regex_Powershell_Optimization_Extended Events - Fatal编程技术网

Regex 如何优化扩展事件到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

我有一个小流程,用于接收.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) {

        #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日志,但这至少可以解释下游问题的一部分。这也可能是一个配置问题,我没有足够的可见性来说明。我只是在解决眼前的问题