Mam skrypt Perla, który jest używany do monitorowania baz danych i próbuję zapisać go jako skrypt powłoki.Uczyń dziennik wydajnym
W perl skryptu jest funkcja, która odczytuje poprzez errorlog i filtruje się, co to jest, że sprawy i wraca z powrotem. Zapisuje również bieżącą pozycję pliku dziennika, aby następnym razem, gdy musiał odczytać dziennik, można rozpocząć od miejsca, w którym zostało, zamiast odczytywać cały dziennik ponownie. Odbywa się to za pomocą funkcji tell.
Mam pomysł, aby skorzystać z polecenia Get-Content, i zacząć czytać na ostatniej pozycji, proces każdą linię aż do końca pliku, a następnie zapisać pozycję.
Znasz sztuczki, dzięki czemu można uzyskać pozycję w pliku dziennika po przeczytaniu i uczynić rozpoczęcia odczytu w określonym miejscu.
Czy istnieje lepszy i/lub łatwiejszy sposób osiągnięcia tego?
Gisli
EDIT: To musi być zrobione przez skrypt, a nie z jakiegoś innego narzędzia.
EDIT: Więc ja dostaję gdzieś z API .NET, ale to nie dość pracuje dla mnie. znalazłem pomocne linki here i here
Oto co mam do tej pory:
function check_logs{
param($logs, $logpos)
$count = 1
$path = $logs.file
$br = 0
$reader = New-Object System.IO.StreamReader("$path")
$reader.DiscardBufferedData()
$reader.BaseStream.Seek(5270, [System.IO.SeekOrigin]::Begin)
for(;;){
$line = $reader.ReadLine()
if($line -ne $null){$br = $br + [System.Text.Encoding]::UTF8.GetByteCount($line)}
if($line -eq $null -and $count -eq 0){break}
if($line -eq $null){$count = 0}
elseif($line.Contains('Error:')){
$l = $line.split(',')
Write-Host "$line $br"
}
}
}
nie znalazłem sposób, aby poprawnie korzystać z funkcji szukania. Czy ktoś może wskazać mi właściwy kierunek?
Jeśli uruchomić ten wyprowadza 5270 ale jeśli uruchomię to z zewnątrz linii, gdzie staram się szukać w strumieniu bazowej uzyskać:
2011-08-12 08:49:36.51 Logon Error: 18456, Severity: 14, State: 38. 5029
2011-08-12 08:49:37.30 Logon Error: 18456, Severity: 14, State: 38. 5270
2011-08-12 16:11:46.58 spid18s Error: 1474, Severity: 16, State: 1. 7342
2011-08-12 16:11:46.68 spid18s Error: 17054, Severity: 16, State: 1. 7634
2011-08-12 16:11:46.69 spid29s Error: 1474, Severity: 16, State: 1. 7894
Jeżeli pierwsza część jest linia odczytu z rejestru a liczba na końcu reprezentuje bajty odczytane w tym punkcie. Tak więc, jak widać, próbuję teraz użyć funkcji wyszukiwania, aby pominąć pierwszą linię błędu, ale jak już powiedziałem wcześniej, wyjście to 5270, jeśli używam funkcji wyszukiwania.
Czego mi brakuje ?????
Gisli
+1 za dodanie funkcji [tell] (http://perldoc.perl.org/functions/tell.html). Nie słyszałam o tym wcześniej. Zastanawiasz się tylko, czy spodziewasz się, że przepisanie skryptu będzie trudniejsze niż instalacja Perla, czy też dotyczy to wymagań? –
Odtworzenie to piekło, jeśli o to pytasz. Chodzi o to, że monitorujemy bazy danych dla innych, co w przyszłości ułatwiłoby konfigurację na nowych serwerach Windows. Powinienem też wspomnieć, że tego lata jestem stażystą, a ten projekt jest także sposobem, aby pozwolić mi nauczyć się kodu i zrozumieć, co robią skrypty. I chcieli też, żeby ktoś zaczął się uczyć powershell. Krótko mówiąc, łatwiej byłoby zainstalować perl i używać tego skryptu. – Gisli
Nie jestem do końca pewien, o co prosisz w tej chwili - przejdę do kolejnej lektury, ale sprawdzę zmienne - $ l jest zwrotem podziału, ale piszesz $ line - czy miałeś na myśli? – Matt