Aplikácia Read_error_log.exe vie otvoriť a prečitať naraz niekolko error logov a vytiahnuť z nich tie časti, ktoré obsahujú slovo error. Poskladať výstup do jednoduchého reťazca, ktorý je možné potom použiť napríklad ako informáciu pre administrátorov alebo aj pre užívateľov, v prípade potreby podrobnejších informácií o chybách a zlyhaniach DB serverov alebo iných aplikácii. V tomto prípade ide o aplikáciu na kontrolu databázovych alert logov z ORACLE databáz. V prípade, že sa nájde v logoch reťazec error, je do výstupu priložená celá čast správy logu, no a túto časť je možne potom poslať mailom napr. administrátorovi.
Ide o jednoduchú konzolovú aplikáciu, ktorej časť zdrojového súboru po úprave je možne použiť aj v iných programoch.
Jednoduchy popis:
program obsahuje - triedu ORACLE_AlertLogReader :
public class ORACLE_AlertLogReader: IDisposable
{
private const String CRLF = "\r\n";
private int LAST_BYTES;
public int Last_bytes
{
get
{
return this.LAST_BYTES;
}
set
{
this.LAST_BYTES = value;
}
}
public ORACLE_AlertLogReader()
{
this.Last_bytes = 0;
}
private bool Is_header(String line)
{
String mask = line.Length >= 4 ? line.Substring(0, 4) : "";
switch (mask)
{
case "Mon ":
case "Tue ":
case "Wen ":
case "Thu ":
case "Fri ":
case "Sat ":
case "Sun ":
return true;
default:
return false;
}
}
private bool Is_error(String line)
{
return line.IndexOf("error", StringComparison.OrdinalIgnoreCase) > -1;
}
public String Read_error_log(String filename)
{
String result = null;
using (StreamReader reader = new StreamReader(filename))
{
// read and check last log lines ...
if (reader.BaseStream.Length > this.Last_bytes)
{
reader.BaseStream.Seek(-this.Last_bytes, SeekOrigin.End);
}
String line = null;
String block = null;
while ((line = reader.ReadLine()) != null)
{
if (this.Is_header(line))
{
// look up for an error in the block ...
if (block.Length > 0)
{
if (this.Is_error(block))
result += (block + ORACLE_AlertLogReader.CRLF);
block = null;
}
}
block += (line + ORACLE_AlertLogReader.CRLF);
}
if (block.Length > 0 && this.Is_error(block))
result += (block + ORACLE_AlertLogReader.CRLF);
}
return result;
}
public String Read_error_logs(string[,] LOG_FILES)
{
String output = null;
String dbname = null;
String logfile = null;
String dboutput = String.Empty;
for (int i = 0; i < LOG_FILES.GetLength(0); i++)
{
dbname = LOG_FILES[i, 0];
logfile = LOG_FILES[i, 1];
dboutput = this.Read_error_log(logfile);
if (dboutput != null)
{
output += (dbname + ORACLE_AlertLogReader.CRLF + dboutput);
}
}
return output;
}
public void Dispose()
{
//throw new NotImplementedException();
}
}
V triede sa nachádzajú privátne (tzv. "súkromne" metódy, ktoré užívatel nevidí) metody. Is_header(String line) - metoda zistí, či riadok error logu je hlavička správy. Metóda Is_error(String line) zistí, či sa v riadku nachádza slovo "error". Túto metódu je jednoduche doplniť aj o ďalšie možnosti hladania podvýrazov alebo doplniť o iné obmedzenia. Ďalej sa v triede nachádzaju verejné metódy Read_error_log(String filename) - táto metóda prečita "alert log" a výstup z nej je reťazec s obsahom len tých časti správ, ktoré obsahujú reťazec "error", metóda String Read_error_logs(string[,] LOG_FILES) prečita niekoľko alert logov naraz. V podstate ako vidieť, metóda volá v cykle metódu Read_error_log, kedže vstupny parameter je pole reťazcov - v tomto prípade ciest súborov - "alert logov".
V triede program je vytvoreny objekt:
ORACLE_AlertLogReader alr = new ORACLE_AlertLogReader();
, ktorému som nastavil, aby prečítal len 2kB "alr.Last_bytes = 1024 * 2;" zo spodu súboru a zároveň vyvolal metódu na prečítanie výstupu
output = alr.Read_error_logs(LOG_FILES);
ktorý je uložený v reťazcovej premennej output. Ja som obsah tejto premennej nechal vypísať metódou drzo na obrazovku :
Console.WriteLine(output);
Kód v c# :
class Program
{
static void Main(string[] args)
{
string[,] LOG_FILES = new String[,] {
{"DB1","C:\\bendak\\applications\\C#_app\\Read_error_log\\alert_db1.log"},
{"DB2","C:\\bendak\\applications\\C#_app\\Read_error_log\\alert_db2.log"}
};
String output = null;
using (ORACLE_AlertLogReader alr = new ORACLE_AlertLogReader())
{
alr.Last_bytes = 1024 * 2; // read from 2kB from the end of the log file ...
output = alr.Read_error_logs(LOG_FILES);
}
if (output == null)
output = "No errors in any DB logs in last 2kB ...";
Console.WriteLine(output);
}
}
Verím, že program pomôže začínajúcim programátorom aspoň na začiatok. Predpokladám, že programátor už ovláda aspoň základné pojmy a rysy objektového programovania a už má za sebou naprogramovaných zopár malých aplikácii. Kompletný zdrojový kód je v prílohe.
S pozdravom AB:)







