09/02/2016 Doru Bulubasa

Importanta LOG-ului in administrarea aplicatiilor

Image blog

Odatacu inceputul anului m-am gândit ca ar fi timpul sa impartasim din experienta noastra tehnica cu voi, cei care ne urmariti.

De-a lungul timpului, nu doar o data, ne-am gasit in situatia de a nu putea rezolva o problema intr-un timp scurt din cauza faptului ca nu s-a putut identifica problema in timp util.

Clar era nevoie de o solutie de identificare a erorilor foarte rapida. Si aici putem alege intre doua optiuni: LOG-ul (toata lumea, intr-un mod mai mult sau mai putin constient s-a lovit de astfel de fisiere, ca ar fi ele ale unui sistem custom sau ale sistemului de operare) sau scrierea in baza de date a erorilor aparute (sau orice altceva se doreste a fi urmarit).

O sa începem cu LOG-ul.

Cea mai buna varianta ar fi sa cream propria noastra librarie care sa scrie in LOG ceea ce dorim; in felul acesta nu facem altceva decât sa apelam o metoda de mai multe ori, nefiind nevoie sa ne incarcam codul aplicatiei.

Deci primul pas: trebuie sa punem in fisierul de configurare locatia unde se afla fisierul de log:

<appSettings>
<add key="LogPath" value="LOG" />
</appSettings>

Apoi cream un nou proiect de tip Clasa Library unde punem codul de mai jos:

public void LogForDebug(string message)
{
try
{
string str = LogCreateFolder();
string data = string.Format("{0:yyyyMMdd}", DateTime.Now);
string PathLog = str + "\\" + data + ".txt";

string LogToWrite = DateTime.Now.ToString() + " *** LOG FOR DEBUG - ";
LogToWrite += message;

if (!File.Exists(PathLog))
{
StreamWriter writer = new StreamWriter(PathLog);
writer.Close();
}
using (TextWriter tw = File.AppendText(str))
{
tw.WriteLine(Environment.NewLine);
tw.WriteLine(LogToWrite);
}
}
catch { }
}

Urmatoarea metoda este pentru a verifica existent folder-ului. In cazul in care acesta nu exista, il cream:

private string LogCreateFolder()
{
string str = ConfigurationManager.AppSettings["LogPath"];
if (!Directory.Exists(str))
Directory.CreateDirectory(str);
return str;
}

Si in acest fel se poate scrie log-ul.

Scrierea LOG-ului intr-o baza de date

A doua varianta este cea de a scrie in baza de date.

Putem folosi acelasi proiect creat mai sus. Codul o sa difere intr-o oarecare masura, deoarece trebuie sa lucram cu baza de date.

public void LogForDebug(Guid SessionGuid,string message)
{
SqlConnection Conn = DataBaseConnection.Instance.LogConnection();
string Script = "INSERT INTO LOG VALUES ('" + SessionGuid + "','" + message + "')";
try
{
if (CheckLogTable())
{
using (SqlCommand Comm = new SqlCommand(Script, Conn))
{
Conn.Open();
Comm.CommandType = System.Data.CommandType.Text;
Comm.ExecuteNonQuery();
Conn.Close();
}
}
}
catch { }
}

Urmatoarea metoda este pentru a verifica daca tabela pentru LOG exista in baza de date. In cazul in care tabela nu exista, folosim metoda LogTableCreate pentru a o crea in mod automat direct din cod.

private bool CheckLogTable()
{
bool Exists;
const string sqlStatement = @"SELECT COUNT(*) FROM LOG";
SqlConnection conn = DataBaseConnection.Instance.LogConnection();
Try
{
using (SqlCommand cmd = new SqlCommand(sqlStatement, conn))
{
conn.Open();
object o = cmd.ExecuteScalar();
Exists = (o == null ? false : true);
if (!Exists)
{
LogTableCreate();
Exists = true;
}
}
}
Catch
{
LogTableCreate();
Exists = true;
}
return Exists;
}

private void LogTableCreate()
{
using (SqlConnection conn = DataBaseConnection.Instance.LogConnection())
{
conn.Open();
Server srv = new Server(conn.DataSource);
Database db = srv.Databases[conn.Database];
Table tb = new Table(db, "LOG");
Column Id = new Column(tb, "Id", DataType.Int);
Id.Identity = true;
Id.IdentityIncrement = 1;
Column Guid = new Column(tb, "SessionGuid", DataType.UniqueIdentifier);
Column LogMessage = new Column(tb, "LogMessage", DataType.VarCharMax);
tb.Columns.Add(Id);
tb.Columns.Add(Guid);
tb.Columns.Add(LogMessage);
tb.Create();
conn.Close();
}
}

Ce informatii scriem in LOG

In fisierele fizice de LOG putem scrie absolut toate informa?iile pe care le dorim. Ca este vorba de erori sau pur si simplu de informatii diverse.

In schimb, recomandarea este sa limitam pe cat posibil interactiunea interfata si baza de date. Astfel, putem sa ne limitam exclusiv la scrierea erorilor.