Проблемы с анализом большого количества журналов с использованием подстановочных знаков

Я хочу создать скрипт, который будет обертывать logparser в Powershell и автоматически анализировать набор журналов. Я создам функцию для множества общих задач анализа. Проблема, с которой я сталкиваюсь, заключается в том, что у меня есть отдельный сценарий копирования, который будет отправляться на множество серверов и изменять имена, выгружая файлы в одно место. Я добавляю к файлу имя папки журнала и имя сервера. Поэтому, если у меня есть два сайта на одном сервере, а не u_ex160415.log, у меня будут NYVPRDWEB2_W3SVC1_u_ex160415.log и NYVPRDWEB2_W3SVC2_u_ex160415.log. В итоге у меня есть папка, заполненная примерно 50 журналами для анализа, и, как вы можете себе представить, имена файлов сильно различаются.

Когда я запускаю запрос logparser к журналам с подстановочным знаком, я всегда получаю сообщение об ошибке

logparser "SELECT * FROM C:\Logs\*.log WHERE sc-status <> 200"

Возвращаемая ошибка:

logparser: ошибка: предложение WHERE: синтаксическая ошибка: неизвестное поле «sc-status»

Из прошлого опыта я знал, что это подстановочный знак, поэтому вместо *.log я сделал

logparser "SELECT * FROM C:\Logs\NYVPRDWEB2_W3SVC1_u_ex160415.log,C:\Logs\NYVPRDWEB2_W3SVC2_u_ex160415.log WHERE sc-status <> 200"

Это отлично сработало, поэтому я решил просто написать сценарий, чтобы добавить все имена файлов в строку, которую я передам в запрос logparser. Я пробовал это:

function Get-IISErrors([Parameter(Mandatory=$true)]$LogPath,[Parameter(Mandatory=$true)]$OutputDestination,[datetime]$StartDate,[datetime]$EndDate,$DaysBack)
{
#Validate Parameters
if ($LogPath -eq '')
    {
        Write-Host -ForegroundColor Red "Log Path is a required parameter"
    }
if ($OutputDestination -eq '')
    {
        Write-Host -ForegroundColor Red "Output Destination is a required parameter"
    }

#Get names of Files that will be analyzed
$LogName = (Get-ChildItem $LogPath).Name

#Create String of comma separated files to be analyzed
$LogFileString = ""
foreach($x in $LogName)
    {
        $LogFileString = $LogFileString + "'" + $LogPath + $x + "'" + "," 
    }
$LastIndex = $LogFileString.Length -1
$LogFileString = $LogFileString.Substring(0,$LastIndex)

logparser "SELECT * INTO $OutputDestination FROM $LogFileString WHERE sc-status <> 200"

}

Но когда я запускаю это против большого количества файлов, я получаю

Не удалось запустить LogParser.exe: слишком длинное имя файла или расширение.

Я бы предпочел выяснить это, используя подстановочные знаки Long Parser, кому-нибудь повезло, просто используя *.log ? В конечном итоге я часто использую сторонний инструмент LogLizard, поэтому я немного неопытен, когда дело доходит до синтаксиса в LogParser.


person Kenny    schedule 24.03.2017    source источник
comment
ты пробовал logparser -i:IISW3C "SELECT * FROM C:\Logs\*.log WHERE sc-status <> 200"   -  person wmz    schedule 25.03.2017
comment
wmz прав - причина, по которой вы получаете неизвестное поле «sc-status», заключается в том, что вы позволяете LogParser угадывать поля на основе журналов, которые он видит в предложении FROM. Если вы явно указываете формат ввода - например. с -i:IISW3C - эта ошибка должна исчезнуть. После этого вы сможете использовать подстановочные знаки. Также убедитесь, что ваши подстановочные знаки не собирают посторонние журналы, постарайтесь быть более конкретными, например. _u_ex.log.   -  person Gabriele Giuseppini    schedule 26.03.2017


Ответы (1)


Я использую приведенный ниже запрос, чтобы найти все события с идентификатором = 4771 из всех файлов .evtx на диске с powershell:

PS C:\ Get-ChildItem -Recurse | where {$_.name -like "*.evtx"} | foreach{ cd $_.DirectoryName; pwd; & 'C:\Program Files(x86)\Log Parser 2.2\LogParser.exe'
-stats:OFF -i:EVT -q:ON "select * from $_. where eventid='4771'" >> out.csv}  

Он отлично работает, я думаю, что если я изменю какую-то часть кода, которую он может использовать для вашей проблемы:

PS C:\ Get-ChildItem -Recurse | where {$_.name -like "*.log"} | foreach{ cd $_.DirectoryName; pwd; & 'C:\Program Files(x86)\Log Parser 2.2\LogParser.exe'
-stats:OFF -i:IISW3C -q:ON "select * from $_. where sc-status <> '200'" >> out.csv}   

Наконец, вы можете открыть файл .csv с помощью Microsoft Excel и использовать функцию text to column с разделителем вертикальной черты (|), чтобы получить читаемый формат.

person Tom    schedule 26.01.2020