Я хочу создать скрипт, который будет обертывать 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.
logparser -i:IISW3C "SELECT * FROM C:\Logs\*.log WHERE sc-status <> 200"
- person wmz   schedule 25.03.2017