niedziela, 29 grudnia 2024

C# - Logowanie danych, prosta klasa

W tym poście chciałem pisać prostą klasę, która służy do logowania danych. Bez konieczności dokładanie dużych zewnętrznych bibliotek. 


Klasa:


W klasie znajdują się pola prywatne, definiują one:

  • _loggerLock - obiekt blokady. Używany do synchronizacji zapisu logów. 
  • _componentName - przechowuje nazwę komponentu, która będzie używana w nazwie pliku logu.
  • _logsDirectory - określa katalog, w którym będą przechowywane pliki logów. 
  • _dateFormat - format daty, który będzie wykorzystywany przy zapisie.

Właściwości publiczne:

  • ComponentName - pozwala na ustawienie nazwy komponentu. Ma to wływ na nazwę pliku logu. 
  • LogsDirectory - pozwala na zmiane katalogu, w którym będą zapisywane pliku logów. 
Dostępna jest jedna metoda publiczna WriteToFile(string message). Zapisuje ona przekazany komunikat do pliku logów. Plik tworzony jest w katalogu z nazwą bazującą na nazwie komponentu i aktualnej dacie. 

Na samym początku w metodzie sprawdzamy czy tylko jeden wątek wykonuje zapis do pliku. Usuwa to konflikty, gdy wiele wątków prubuje uzyskać dostęp do jednego wątku. Jeśli nie to przechodzimy do obsługi wyjątku, gdzie błąd jest wpisywany w konsoli. Następnie sprawdzamy czy katalog istnieje, jeśli nie to go tworzymy. Dalej przygotowywana jest ścieżka do pliku. Metoda File.AppendAllText, otwiera dokument w trybie dopisywania nowych linii. 

  1. public static class Logger
  2. {
  3.         private static readonly object _loggerLock = new();
  4.         private static string _componentName = "DefaultComponent";
  5.         private static string _logsDirectory = "Logs";
  6.         private static string _dateFormat = "yyyy-MM-dd HH:mm:ss.fff";
  7.  
  8.         public static string ComponentName
  9.         {
  10.             set => _componentName = value;
  11.         }
  12.  
  13.         public static string LogsDirectory
  14.         {
  15.             set => _logsDirectory = value;
  16.         }
  17.  
  18.         public static void WriteToFile(string message)
  19.         {
  20.             try
  21.             {
  22.                 lock (_loggerLock)
  23.                 {
  24.                     string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, _logsDirectory);
  25.                     Directory.CreateDirectory(path);
  26.  
  27.                     // Ścieżka do pliku
  28.                     string filePath = Path.Combine(path, $"{_componentName}_{DateTime.Now:ddMMyyyy}.txt");
  29.  
  30.                     // Zapisanie wiadomości do pliku
  31.                     string logEntry = $"[{DateTime.Now.ToString(_dateFormat)}] {message}";
  32.                     File.AppendAllText(filePath, logEntry + Environment.NewLine);
  33.                 }
  34.             }
  35.             catch (Exception ex)
  36.             {
  37.                 Console.Error.WriteLine($"[Logger Error]: {ex.Message}");
  38.             }
  39.         }
  40. }

Poniżej przykład użycia:

  1. class Program
  2. {
  3.     static void Main()
  4.     {
  5.         // Konfiguracja loggera
  6.         Logger.ComponentName = "App";
  7.         Logger.LogsDirectory = "Log";
  8.  
  9.         // Logowanie wiadomości
  10.         Logger.WriteToFile("Aplikacja została uruchomiona.");
  11.         Logger.WriteToFile("Wykonywana operacja...");
  12.         Logger.WriteToFile("Zakończono działanie.");
  13.     }
  14. }