Loglar, bir yazılım uygulamasının çalışma durumuyla ilgili bilgileri kaydetmek için kullanılan kayıtlardır. Bu kayıtlar, uygulamanın hangi süreçleri izlediğini, hangi hatalarla karşılaştığını ve diğer önemli olayları içerir.
Bu yazıda size uygulamalarınız için gelişmiş log tutma sınıfı oluşturacağız.Yazdığımız class genel olarak logları yazdırma ve gerektiği zaman logları kaydetmeye yönelik olacak.
Logların Önemi
- Hata Ayıklama ve Sorun Giderme: Loglar, bir uygulamadaki hataları belirlemenin ve sorunları gidermenin temel bir yolunu sağlar. Bir hata durumunda, loglar genellikle hatanın nerede ve ne zaman meydana geldiğini gösterir.
- Performans İzleme: Loglar, uygulamanın performansını izlemek için kullanılabilir. Belirli bir sürecin ne kadar süreyle çalıştığını veya belirli bir işlemin ne kadar zaman aldığını gösteren loglar, performans sorunlarını tanımlamak için kullanılır.
-
Güvenlik İzleme: Loglar, güvenlikle ilgili olayları izlemek ve potansiyel güvenlik ihlallerini tespit etmek için kullanılır. Uygulamada gerçekleşen önemli güvenlik olayları loglarda kaydedilebilir.
-
Kullanım İstatistikleri: Loglar, kullanıcıların uygulama içindeki etkileşimlerini izlemek için kullanılabilir. Hangi özelliklerin daha sık kullanıldığını anlamak, uygulamanın kullanıcı dostu olup olmadığını değerlendirmeye yardımcı olabilir.
Logların Türleri
-
INFO: Uygulamanın normal çalışması hakkında genel bilgiler içerir. Örneğin, bir işlem başlatıldığında veya tamamlandığında bilgi verir.
-
WARNING: Potansiyel bir sorunu gösterir, ancak uygulama devam edebilir. Uygulamanın istenmeyen bir duruma yaklaştığını belirtir.
-
ERROR: Uygulamanın çalışmasını etkileyen bir hatayı gösterir. Ancak, uygulama genellikle devam edebilir.
-
FATAL: Uygulamanın çökmesine veya kapanmasına neden olan kritik bir hatayı gösterir.
C# ile Gelişmiş Log Tutma İşlemleri
Şimdi uygulamamızın içine yeni bir class oluşturup adını Logger koyalım. Ardından sınıf üyelerimizi tanımlamaya başlayalım.
private readonly string m_LogFolder; // Logların kayıt altına alınacağı klasör
private readonly string m_LogFile; // Logların tutulacağı dosya
private string m_GetTime { get { return "[" + DateTime.Now.ToString() + "]"; } } // Sistemin o anki saat ve tarihi
Şimdi ise CreateLogFolderAndFile adında bir metot yazalım.
private void CreateLogFolderAndFile()
{
if (!Directory.Exists(m_LogFolder))
{
Directory.CreateDirectory(m_LogFolder);
}
File.WriteAllText(m_LogFile, m_GetTime + "Logger is started..." + Environment.NewLine + Environment.NewLine);
}
Şimdi ise constructor‘ı yazabiliriz. 2 Adet constructor tanımlaması yapacağız. Nedeni ise ilk kurucu log dosyasının adını otomatik olarak namespace adı ile aynı tutuyor. İkinci kurucu ise log dosyasına istediğiniz adı verebiliyorsunuz.
public Logger()
{
m_LogFolder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Logger");
m_LogFile = Path.Combine(m_LogFolder, GetType().Namespace + ".log");
CreateLogFolderAndFile();
}
public Logger(string appName)
{
m_LogFolder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Logger");
m_LogFile = Path.Combine(m_LogFolder, appName + ".log");
CreateLogFolderAndFile();
}
Şimdi ise isteğe bağlı olarak log klasörünün yolunu ve log dosyasının yolunu bize string olarak döndüren birer metot yazalım.
public string GetLogFileName()
{
return m_LogFile;
}
public string GetLogFolderName()
{
return m_LogFolder;
}
Şimdi ise Logger sınıfı dışına, namespace içinde bir adet LogLevel adında public bir enum oluşturuyoruz.
public enum LogLevel
{
Info = 0,
Warn = 1,
Error = 2,
Fatal = 3
}
Evet. Sıra geldi logları ekrana yazdıracağımız metotlara. İlk önce Print adında bir metot oluşturuyoruz. İçine mesaj ve loglevel alıyoruz. Ardında logları seviyesine göre renklendirip ekrana yazdırıyoruz.
public void Print(string message, LogLevel level)
{
switch (level)
{
case LogLevel.Info:
Console.WriteLine(m_GetTime + "[INFO]:" + message);
break;
case LogLevel.Warn:
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine(m_GetTime + "[WARNING]:" + message);
Console.ResetColor();
break;
case LogLevel.Error:
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine(m_GetTime + "[ERROR]:" + message);
Console.ResetColor();
break;
case LogLevel.Fatal:
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine(m_GetTime + "[FATAL]:" + message);
Console.ResetColor();
break;
default:
break;
}
}
Son olarak logları hem ekrana yazdırıp hemde log dosyasının içine yazmaya. Write adında bir metot oluşturalım.
public void Write(string message, LogLevel level)
{
switch (level)
{
case LogLevel.Info:
File.AppendAllText(m_LogFile, m_GetTime + "[INFO]:" + message + Environment.NewLine);
Print(message, level);
break;
case LogLevel.Warn:
File.AppendAllText(m_LogFile, m_GetTime + "[WARNING]:" + message + Environment.NewLine);
Print(message, level);
break;
case LogLevel.Error:
File.AppendAllText(m_LogFile, m_GetTime + "[ERROR]:" + message + Environment.NewLine);
Print(message, level);
break;
case LogLevel.Fatal:
File.AppendAllText(m_LogFile, m_GetTime + "[FATAL]:" + message + Environment.NewLine);
Print(message, level);
break;
default:
break;
}
}
Harika. Şimdi herşey hazır. Tak yapmanız gereken log tutmak. İşte aşağıda birer örnek bırakıyorum sizlere…
static void Main(string[] args)
{
Logger log = new Logger();
log.Write("Bu hata "info" hem ekrana hemde log dosyasına yazılır.", LogLevel.Info);
log.Write("Bu hata "warn" hem ekrana hemde log dosyasına yazılır.", LogLevel.Warn);
log.Write("Bu hata "error" hem ekrana hemde log dosyasına yazılır.", LogLevel.Error);
log.Write("Bu hata "fatal" hem ekrana hemde log dosyasına yazılır.", LogLevel.Fatal);
Console.WriteLine();
log.Print("Bu hata "info" sadece ekrana yazdırılır.", LogLevel.Info);
log.Print("Bu hata "warn" sadece ekrana yazdırılır.", LogLevel.Warn);
log.Print("Bu hata "error" sadece ekrana yazdırılır.", LogLevel.Error);
log.Print("Bu hata "fatal" sadece ekrana yazdırılır.", LogLevel.Fatal);
Console.WriteLine(log.GetLogFolderName());
Console.ReadLine();
}
Şimdi sizlere Logger sınıfının tüm kodlarını paylaşacağım. Fakat lütfen namespace adını değiştirmeyi unutmayın.
using System;
using System.IO;
namespace BeniDegistir
{
public enum LogLevel
{
Info = 0,
Warn = 1,
Error = 2,
Fatal = 3
}
public class Logger
{
private readonly string m_LogFolder;
private readonly string m_LogFile;
private string m_GetTime { get { return "[" + DateTime.Now.ToString() + "]"; } }
public Logger()
{
m_LogFolder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Logger");
m_LogFile = Path.Combine(m_LogFolder, GetType().Namespace + ".log");
CreateLogFolderAndFile();
}
public Logger(string appName)
{
m_LogFolder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Logger");
m_LogFile = Path.Combine(m_LogFolder, appName + ".log");
CreateLogFolderAndFile();
}
private void CreateLogFolderAndFile()
{
if (!Directory.Exists(m_LogFolder))
{
Directory.CreateDirectory(m_LogFolder);
}
File.WriteAllText(m_LogFile, m_GetTime + "Logger is started..." + Environment.NewLine + Environment.NewLine);
}
public string GetLogFileName()
{
return m_LogFile;
}
public string GetLogFolderName()
{
return m_LogFolder;
}
public void Write(string message, LogLevel level)
{
switch (level)
{
case LogLevel.Info:
File.AppendAllText(m_LogFile, m_GetTime + "[INFO]:" + message + Environment.NewLine);
Print(message, level);
break;
case LogLevel.Warn:
File.AppendAllText(m_LogFile, m_GetTime + "[WARNING]:" + message + Environment.NewLine);
Print(message, level);
break;
case LogLevel.Error:
File.AppendAllText(m_LogFile, m_GetTime + "[ERROR]:" + message + Environment.NewLine);
Print(message, level);
break;
case LogLevel.Fatal:
File.AppendAllText(m_LogFile, m_GetTime + "[FATAL]:" + message + Environment.NewLine);
Print(message, level);
break;
default:
break;
}
}
public void Print(string message, LogLevel level)
{
switch (level)
{
case LogLevel.Info:
Console.WriteLine(m_GetTime + "[INFO]:" + message);
break;
case LogLevel.Warn:
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine(m_GetTime + "[WARNING]:" + message);
Console.ResetColor();
break;
case LogLevel.Error:
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine(m_GetTime + "[ERROR]:" + message);
Console.ResetColor();
break;
case LogLevel.Fatal:
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine(m_GetTime + "[FATAL]:" + message);
Console.ResetColor();
break;
default:
break;
}
}
}
}
Teşekkür ederim. Umarım yardımcı olabilmişimdir sizlere.
Kolay Gelsin…