esmaspäev, 20. aprill 2009

Kirjutame ja loeme Windows Serveri Application logisse kasutades LINQ-i

Aeg-ajlat ika viskab vigu ja mõtekas need veateated kuskilegi kirja panna, et hiljem saaks uurida mis süsteemis tegelikult juhtus. Täiesti võimalik on kasutada selleks Windows Serveri EventLog-i

Kõigepealt teeb eelnevalt käsitsi ühe vastava võtme REGEDIT-iga Windows Serverisse

HKEY_LOCAL_MACHINE -> System -> CurrentControlSet -> Services -> EventLog -> Application ja seal paremklõps hiirega Add New Key ja lisab uue võtme MINURAKENDUS

Kui kasutada rakenduse enda vaikimisi veahaldust, ehk Web.Config-is on sees

customErrors mode="RemoteOnly" defaultRedirect="KampError.aspx" redirectMode="ResponseRewrite"

// redirectMode="ResponseRewrite" on .NET Framework 3.5 uuendus

siis KampError.aspx Page_Load meetod võiks välja näha selline

protected void Page_Load(object sender, EventArgs e)
{
this.LiteralViga.Text = "Süsteemis juhtus järgmine tõrge: ";
try
{
Exception ex = Server.GetLastError().GetBaseException();
if (ex != null)
{
this.LiteralViga.Text += "
" + ex.Message.Trim();
// vealogisse kirjutamisel ja ekraanile näitamisel tuleb muidugi jälgida turvalisuse nõudeid
string viga = "SOURCE: " + (ex.Source ?? "") +
"URL: " + (Request.Url == null ? "" : Request.Url.ToString()) +
"URLREFERRER: " + (Request.UrlReferrer == null ? "" : Request.UrlReferrer.ToString()) +
"Crawler: " + (Request.Browser.Crawler == null ? "" : Request.Browser.Crawler.ToString()) +
"USERHOSTNAME: " + (Request.UserHostName == null ? "" : Request.UserHostName.ToString()) +
"USERHOSTADDRESS: " + (Request.UserHostAddress == null ? "" : Request.UserHostAddress.ToString()) +
"USERAGENT: " + (Request.UserAgent == null ? "" : Request.UserAgent.ToString()) +
"QUERYSTRING: " + (Request.QueryString == null ? "" : Request.QueryString.ToString());

//näitame midagi ka ekraanile
this.LabelViga.Text = viga;

if (EventLog.SourceExists("MINURAKENDUS", ".")) //kontrollib, kas on see võti olemas jooksval serveril
{
//logisse kirjutab rohkem võrreldes ekraanile näitamisega
viga += "/nTARGETSITE: " + (ex.TargetSite == null ? "" : ex.TargetSite.ToString()) +
"/nSTACKTRACE: " + (ex.StackTrace == null ? "" : ex.StackTrace) +
"/nINNEREXEPTION: " + (ex.InnerException == null ? "" : ex.InnerException.ToString());
//kirjutame logisse
EventLog.WriteEntry("MINURAKENDUS", this.LiteralViga.Text + "\n" + viga.Replace("
", "\n"), EventLogEntryType.Error);
}
Server.ClearError();
}
}
catch (SystemException ex)
{
this.LabelViga.Text = ex.Message;
}
}


ja kui nüüd vaja lugeda seda MINURAKENDUS vealogi

if (EventLog.SourceExists("MINURAKENDUS"))
{
//siin saab teada selle logi nime, kuhu sisse kirjutame, tavaliselt Application Log
this.literalErrSource.Text = EventLog.LogNameFromSourceName("MINURAKENDUS", ".");
EventLog[] logid = EventLog.GetEventLogs("."); //jooksva serveri vealogid
EventLog kalog = null;

//otsime nime järgi ülesse selle logi nime, kuhu oma veateated sisse kirjutame
foreach (EventLog elog in logid)
{
if (elog.Log == this.literalErrSource.Text)
{
kalog = elog; //leitud
break;
}
}
if (kalog != null) //kui leidsime logi nime
{
//otsime välja MINURAKENDUS teated ja vead
// üks koht kus on mõistlik kasutada LINQ-i

var query = from EventLogEntry el in kalog.Entries
where el.Source == "MINURAKENDUS"
orderby el.TimeGenerated descending
select new
{
Time = el.TimeGenerated,
Message = el.Message,
// Category = el.Category,
EntryType = el.EntryType.ToString(),
// TimeWritten = el.TimeWritten,
UserName = el.UserName
};


//bindime GridView külge ekraanile näitamiseks
this.GridViewLogid.DataSource = query.ToList();
this.GridViewLogid.DataBind();

}
else //kui ei leidnud seda logi nime, kuhu enda veateated kirja paneme näitame lihtsalt logide nimetusi
{
this.GridViewLogid.DataSource = logid;
this.GridViewLogid.DataBind();
}
}


ja edaspidi ei pea enam tõrgete uurimiseks serverisse sisse logima vaid saad vaadata otse rakenduse enda kaudu.