október 2013 havi bejegyzések

Log Parser Studio

Létezik a Log Parserhez egy, az MS által gyártott ingyenes GUI felület is, a hivatalos neve Log Parser Studio. Nem telepítős cucc, viszont, ha a Log Parser nincs telepítve, akkor problémázni fog.

Többféle loghoz van előre elkészített query, támogatja pl: a powershell exportot, képes megjeleníteni a log gyűjtés eredményét. Akit érdekel a Log Parserrel való bűvészkedés, annak érdemes megnézni a GUI felületet is.

A Studio letölthető innen. Egy kis tutorial pedig itt olvasható.

Egy kép a Studioról:
042_LogParserStudio

Reklámok

Log gyűjtés SQL-be, logparser-el

Ma bemutatnék egy egyszerű megoldást a logok gyűjtésére. Windows eseménynapló logokat fogunk gyűjteni egyszerűen, hatékonyan, majd begyömöszöljük SQL-be, hogy később elemezni lehessen őket.

Ami szükségünk van:

  • Log parser 2.2 (Innen letölthető): ezzel egyszerűen be tudjuk gyűjteni a logokat
  • Powershell: ez lesz a scriptnyelvünk, amivel a logparser parancsokat összerakjuk
  • Egy SQL adatbázis: ide mentjük a logokat későbbi felhasználásra

A log parser egy csudajó dolog, sokféle log olvasását támogatja, ráadásul SQL lekérdezésekkel lehet a logokból adatokat kibányászni. Akinek nincs, telepítse arra a gépre, amiről a többi szervert monitorozni szeretné. Nálam a “c:\Program Files (x86)\Log Parser 2.2\” mappában van, így ide fogok hivatkozni, ha szükséges.

A következő lépés, hogy készítsünk egy adatbázis, ahova gyűjteni fogjuk a logokat. Nálam ez most a “Logs” lesz. A legegyszerűbb módszer Management Studióban a bal oldali fán “Database” mappán jobb gomb, majd “New Database…”. Legyen legalább 1 GB az adatfájl és 100 MB a logfile, illetve simple recovery modellben az adatbázis (ALTER DATABASE Logs SET RECOVERY SIMPLE).

A powershell script, amit erre a célra készítettem az így néz ki:

# Ide írjuk a LogParser.exe elérési útját
 cd "c:\Program Files (x86)\Log Parser 2.2"

# Itt vannak azok a naplók, amelyek logjait gyűjteni akarjuk
 $event_logs = "system", "Application", "security", "HardwareEvents", "OAlerts"
 # Ide a szerverek nevei: Ha több van, akkor vesszővel elválasztva $server = "server1", "server2", stb..
 $servers = "ZSOLT-SQL"

# Végigmegyünk az eseménynaplókon
 foreach ($event_log in $event_logs) {
    $path = "reports\CPT\Windows\$event_log"
    # Ha nincs adott naplónak még logfájlja, akkor csinálunk egye
    if(!(Test-Path -Path $path)) {
        new-item $path -itemtype directory
    }
    # Végigmegyünk a szervereken
    foreach ($server in $servers) {
        # Összeállítjuk a logparser parancsot
        $command = "logparser ""SELECT '$server' as ServerName, Computername, EventLog,RecordNumber,TimeGenerated,EventID,EventType,EventTypeName,EventCategory,EventCategoryName,SourceName,Strings,Message FROM \\$server\$event_log TO dbo.tbl_windows_logs"" -i:EVT -o:SQL -driver:""SQL Server"" -database:Logs -createtable:ON -server:"".\SQLEXPRESS"" -iCheckPoint:$path\$server.cpt -transactionRowCount:10000"
        #Write-Host $command
        # Futtatjuk a parancsot
        cmd /C $command
    }
 }
 

Ha a Write-Host parancsal kiíratnánk a $command változó értékét, akkor egy ilyesmit kapnánk:

logparser "SELECT
    'ZSOLT-SQL' as ServerName,
    Computername,
    EventLog,
    RecordNumber,
    TimeGenerated,
    EventID,
    EventType,
    EventTypeName,
    EventCategory,
    EventCategoryName,
    SourceName,
    Strings,
    Message
FROM \\ZSOLT-SQL\system
TO dbo.tbl_windows_logs"
-i:EVT
-o:SQL
-driver:"SQL Server"
-server:".\SQLEXPRESS"
-database:Logs
-createtable:ON
-transactionRowCount:10000
-iCheckPoint:reports\CPT\Windows\HardwareEvents\ZSOLT-SQL.cpt

A fenti kódban két fontos paraméter van. Az egyik a “transactionRowCount” paraméter, ami megmondja, mennyi insert utasítás legyen 1 tranzakció. Alapból 1 utasítás 1 tranzakció, de az több mint lassú lenne. A másik paraméter a “-iCheckPoint”, amivel beállítjuk, hogy a logparserünk jegyezze meg, hogy hol tartott a logolvasásban. A fenti parancs benyomja a logfájl teljes tartalmát SQL-be. Ha valaki nem szeretné a kezdetektől ezt megtenni, hanem csak egy adott dátumtól, akkor az SQL utasítást egészítse ki a következő sorral:

WHERE TimeGenerated > '2010-10-10 10:00:00'

Ahol a dátum, egy tetszőleges, viszont vigyázni kell a formátumával, mert ott nem fogad el mindent.
Én azt tapasztaltam, hogy dátumszűrés nélkül gyorsabb a betöltés, tehát megéri egyszer betolni az összes logot SQL-be, majd a feleslegeset kitörölni. (Egyébként is szükség lesz majd egy törölő script-re).
Ha minden jól csináltunk, akkor ilyen sorokat kell visszakapjunk:


Statistics:
-----------
Elements processed: 57374
Elements output:    57374
Execution time:     4.23 seconds

Fontos, hogy az user, amivel futtatjuk a script-et, annak legyen joga hozzáférni mind az sql szerverhez, mind az adott logfájlhoz, amit a logparserrel beolvastatunk. Ez azt jelenti, hogy kell egy jó windows-os vagy domain user. Az SQL-es kapcsolat lehet SQL login is, akkor kell a logparsert futtató kódba egy felhasználót és jelszót is felvenni, de nem szerencsés, ha plain text jelszavaink vannak, ezért ezt nem javaslom.

Ha lekérdezzük az adatbázisból a sorokat, akkor láthatjuk, hogy ott vannak:

select top 100 * from  Logs.dbo.tbl_windows_logs

logparser01

A következő részben optimalizálunk az adatbázison.