更正跨越多行的日志文件格式
Correct log file format spanning multiple lines
我想创建一个脚本,允许我更正日志文件的格式,几个月来一直错误生成的日志文件格式如下
xx-xxx-20xx xx:xx:xx INFO : xxxx-x : Demande d'envoi du mail Sujet: XXX - XXXXX
/ EQUIPEMENT / Arrivée:20xx-xx-xx
xx-xxx-20xx xx:xx:xx INFO : xxxx-x : Demande d'envoi du mail Sujet: XXX - XXXXX
/ ACCI / Arrivée:20xx-xx-xx
xx-xxx-20xx xx:xx:xx INFO : xxxx-x : Demande d'envoi du mail Sujet: XXX - XXXXX
/ CMS / Arrivée:20xx-xx-xx
我希望更正以下格式
xx-xxx-20xx xx:xx:xx INFO : xxxx-x : Demande d'envoi du mail Sujet: XXX - XXXXX / EQUIPEMENT / Arrivée:20xx-xx-xx
xx-xxx-20xx xx:xx:xx INFO : xxxx-x : Demande d'envoi du mail Sujet: XXX - XXXXX / ACCI / Arrivée:20xx-xx-xx
xx-xxx-20xx xx:xx:xx INFO : xxxx-x : Demande d'envoi du mail Sujet: XXX - XXXXX / CMS / Arrivée:20xx-xx-xx
我正在尝试使用我已经创建的清晰日志脚本:
$scriptPath = split-path -parent $MyInvocation.MyCommand.Definition
$ADRESSE = $scriptPath
$TEXT1 = ' / EQUIPEMENT*'
$TEXT2 = ' / ACCI*'
$TEXT3 = ' / CMS*'
$files = Get-ChildItem $ADRESSE -Filter LogSplitterProd_20200918_1740.log
foreach ($f in $files)
{
$outfile = $f.FullName
$GetLastWriteFile = Get-Item $outfile
$LastWriteFile = $GetLastWriteFile.LastWriteTime
If ((Get-Item $outfile).length -gt 2kb)
{
$data = foreach($line in Get-Content $outfile )
{
if($line -like $TEXT1 -Or $line -like $TEXT2 -Or $line -like $TEXT3)
{
#$line=$line -replace ("`n`r","") #TEST1
#$line=$line -replace ("``n``r","") #TEST2
#$line=$line.replace("`n",", ").replace("`r",", ") #TEST3
#$line=$line -replace("`n",", ") #TEST4
#$line=$line -replace("`r",", ") #TEST4
#$line=$line -replace("`n`r",", ") #TEST5
}
else
{
$line
}
}
$data | Set-Content $outfile -Force
}
$GetLastWriteFile.LastWriteTime = $LastWriteFile
Write-Host "Save et date $outfile terminé"
}
#start-sleep 5
假设您的日志文件始终采用您指定的格式,您可以一次读取源文件 2 行并将它们连接在一起:
function Repair-LogFile
{
param( $Logfile )
$lineCount = 2;
# read 2 lines of log file into a buffer,
# then join them together and output the result
Get-Content -Path $Logfile -Encoding UTF8 | foreach-object `
-Begin {
$buffer = @();
} `
-Process {
$buffer += $_;
if( $buffer.Length -eq $lineCount )
{
Write-Output ($buffer -join "");
$buffer = @();
}
} `
-End {
if( $buffer.Length -gt 0 )
{
Write-Output ($buffer -join "");
}
}
}
用法:
Repair-LogFile -Logfile "C:\src\so\log.txt" | Set-Content -Path "c:\src\so\log2.txt"
另一种方法是使用带有参数 Regex
和 File
的 switch
:
$result = switch -Regex -File 'D:\Test\some.log' {
'^\s\/' { $line + $_ ; $line = '' }
default { $line = $_ }
}
# output on screen
$result
#output to new log file
$result | Set-Content -Path 'D:\Test\new.log'
输出:
xx-xxx-20xx xx:xx:xx INFO : xxxx-x : Demande d'envoi du mail Sujet: XXX - XXXXX / EQUIPEMENT / Arrivée:20xx-xx-xx
xx-xxx-20xx xx:xx:xx INFO : xxxx-x : Demande d'envoi du mail Sujet: XXX - XXXXX / ACCI / Arrivée:20xx-xx-xx
xx-xxx-20xx xx:xx:xx INFO : xxxx-x : Demande d'envoi du mail Sujet: XXX - XXXXX / CMS / Arrivée:20xx-xx-xx
我想创建一个脚本,允许我更正日志文件的格式,几个月来一直错误生成的日志文件格式如下
xx-xxx-20xx xx:xx:xx INFO : xxxx-x : Demande d'envoi du mail Sujet: XXX - XXXXX
/ EQUIPEMENT / Arrivée:20xx-xx-xx
xx-xxx-20xx xx:xx:xx INFO : xxxx-x : Demande d'envoi du mail Sujet: XXX - XXXXX
/ ACCI / Arrivée:20xx-xx-xx
xx-xxx-20xx xx:xx:xx INFO : xxxx-x : Demande d'envoi du mail Sujet: XXX - XXXXX
/ CMS / Arrivée:20xx-xx-xx
我希望更正以下格式
xx-xxx-20xx xx:xx:xx INFO : xxxx-x : Demande d'envoi du mail Sujet: XXX - XXXXX / EQUIPEMENT / Arrivée:20xx-xx-xx
xx-xxx-20xx xx:xx:xx INFO : xxxx-x : Demande d'envoi du mail Sujet: XXX - XXXXX / ACCI / Arrivée:20xx-xx-xx
xx-xxx-20xx xx:xx:xx INFO : xxxx-x : Demande d'envoi du mail Sujet: XXX - XXXXX / CMS / Arrivée:20xx-xx-xx
我正在尝试使用我已经创建的清晰日志脚本:
$scriptPath = split-path -parent $MyInvocation.MyCommand.Definition
$ADRESSE = $scriptPath
$TEXT1 = ' / EQUIPEMENT*'
$TEXT2 = ' / ACCI*'
$TEXT3 = ' / CMS*'
$files = Get-ChildItem $ADRESSE -Filter LogSplitterProd_20200918_1740.log
foreach ($f in $files)
{
$outfile = $f.FullName
$GetLastWriteFile = Get-Item $outfile
$LastWriteFile = $GetLastWriteFile.LastWriteTime
If ((Get-Item $outfile).length -gt 2kb)
{
$data = foreach($line in Get-Content $outfile )
{
if($line -like $TEXT1 -Or $line -like $TEXT2 -Or $line -like $TEXT3)
{
#$line=$line -replace ("`n`r","") #TEST1
#$line=$line -replace ("``n``r","") #TEST2
#$line=$line.replace("`n",", ").replace("`r",", ") #TEST3
#$line=$line -replace("`n",", ") #TEST4
#$line=$line -replace("`r",", ") #TEST4
#$line=$line -replace("`n`r",", ") #TEST5
}
else
{
$line
}
}
$data | Set-Content $outfile -Force
}
$GetLastWriteFile.LastWriteTime = $LastWriteFile
Write-Host "Save et date $outfile terminé"
}
#start-sleep 5
假设您的日志文件始终采用您指定的格式,您可以一次读取源文件 2 行并将它们连接在一起:
function Repair-LogFile
{
param( $Logfile )
$lineCount = 2;
# read 2 lines of log file into a buffer,
# then join them together and output the result
Get-Content -Path $Logfile -Encoding UTF8 | foreach-object `
-Begin {
$buffer = @();
} `
-Process {
$buffer += $_;
if( $buffer.Length -eq $lineCount )
{
Write-Output ($buffer -join "");
$buffer = @();
}
} `
-End {
if( $buffer.Length -gt 0 )
{
Write-Output ($buffer -join "");
}
}
}
用法:
Repair-LogFile -Logfile "C:\src\so\log.txt" | Set-Content -Path "c:\src\so\log2.txt"
另一种方法是使用带有参数 Regex
和 File
的 switch
:
$result = switch -Regex -File 'D:\Test\some.log' {
'^\s\/' { $line + $_ ; $line = '' }
default { $line = $_ }
}
# output on screen
$result
#output to new log file
$result | Set-Content -Path 'D:\Test\new.log'
输出:
xx-xxx-20xx xx:xx:xx INFO : xxxx-x : Demande d'envoi du mail Sujet: XXX - XXXXX / EQUIPEMENT / Arrivée:20xx-xx-xx xx-xxx-20xx xx:xx:xx INFO : xxxx-x : Demande d'envoi du mail Sujet: XXX - XXXXX / ACCI / Arrivée:20xx-xx-xx xx-xxx-20xx xx:xx:xx INFO : xxxx-x : Demande d'envoi du mail Sujet: XXX - XXXXX / CMS / Arrivée:20xx-xx-xx