2016-07-27 10 views
-1

Ich versuche, wenn die folgende Klasse zu bestimmen, funktioniert über mehr C# -Projekten hinter dieser KlasseWie kann diese Protokollklasse verbessert werden, sodass sie in C# -Projekten verwendet werden kann?

Die Idee ist, zu verwenden, dass es automatisch eine Protokolldatei generiert, wenn ein oder gelöscht bearbeitet wurde, während das Programm läuft .

public static class Utility { 
     #region INTERNAL LOG CLASS 
     private static readonly object Lock = new object(); 

     public static string LogFileName { get; private set; } 
     public static string LogFilePath { get; private set; } 

     public static string GetDate() => DateTime.Now.ToShortDateString(); 
     public static string GetTime() => DateTime.Now.ToShortTimeString(); 

     public static void CreateLog(string filename, string filepath = null) { 
      LogFileName = filename; 
      var directoryInfo = Directory.GetParent(Directory.GetCurrentDirectory()).Parent; 
      if (directoryInfo != null) 
       LogFilePath = Path.Combine(filepath ?? directoryInfo.FullName, @"files\logs\", LogFileName); 

      /* PUT APPROPRIATE WELCOME MESSAGE HERE */ 
      Log($"# NEW INSTANCE OF '{System.Reflection.Assembly.GetCallingAssembly().GetName().Name}' RUNNING"); 
      Log($"# LOG CREATED (FILENAME: {LogFileName}, FILEPATH: {LogFilePath})"); 
     } 

     public static void Log(string message, int format = 0) { 
      lock (Lock) { 
       try 
       { 
        string logFormat = $"{GetDate()} @ {GetTime(),-8} | >"; 

        if (format == 0) { message = $"{message}{Environment.NewLine}"; } 
        else if (format == 1) { message = $"{logFormat} ### {message}{Environment.NewLine}"; } 
        else if (format == 2) { message = $"{logFormat} █ERROR█ {message}{Environment.NewLine}"; } 
        else if (format == 3) { message = $"{logFormat} --- {message} --- {Environment.NewLine}"; } 
        else { message = $"{logFormat} {message}{Environment.NewLine}"; } 

        LogToConsole(message); 
        AppendAllText(LogFilePath, message); 
       } catch (DirectoryNotFoundException ex) { 
        MessageBox.Show("ERROR"); throw ex; //Count not open/create file. 
       } 
      } 
     } 

     public static void LogToConsole(string message) { 
      Console.WriteLine(message); 
     } 

     public static void OpenLog() { 
      Process.Start(new ProcessStartInfo { FileName = LogFilePath, UseShellExecute = true }); 
     } 

     public static void ClearLog() { 
      WriteAllText(LogFilePath, string.Empty); 
      Log("LOG CLEARED!", 1); 
     } 
     #endregion 

Gibt es irgendwelche Probleme, die Sie sehen können, die ich ändern/betrachten sollte?

+0

Nur ein kleiner Punkt zu erwähnen - wenn Sie dies über mehrere Projekte verwenden Sie können mit einer Standard-Zeitzone zu prüfen, anstatt DateTime.Now - Wenn Ihre Projekte gehostet werden In verschiedenen Umgebungen oder Regionen variieren die Protokolldaten je nach Projekt. Dies kann Leseprotokolle zu einem Albtraum machen! Vielleicht könnten Sie stattdessen UTC verwenden. – donners45

+0

Sie sollten wirklich ein richtiges Logging-Framework verwenden, wie * NLog * oder * log4net *. –

Antwort

1

ich ein paar Vorschläge ...

Ich stimme mit donners45 dass in UTC versuchen und zu verwenden, wo möglich, wenn Daten zu speichern und in der lokalen Zeit konvertiert, wenn Sie sie an einen Benutzer Diplay benötigen.

Wenn Sie es portabel machen möchten, vermeiden Sie möglicherweise die Verwendung von MessageBox, da dies in bestimmten Anwendungen möglicherweise nicht verfügbar/verfügbar ist.

Verwenden Sie möglicherweise eine Enum für das Format, anstatt eine magische Zahl zu übergeben. Etwas wie ...

public enum LogFormat 
    { 
     Message, 
     Hash, 
     Error, 
     Dash 
    } 

    public static void Log(string message, LogFormat format = LogFormat.Message) 
    { 
     lock (Lock) 
     { 
      try 
      { 
       string logFormat = $"{GetDate()} @ {GetTime(),-8} | >"; 

       switch (format) 
       { 
        case LogFormat.Message: 
         message = $"{message}{Environment.NewLine}"; 
         break; 

        case LogFormat.Hash: 
         message = $"{logFormat} ### {message}{Environment.NewLine}"; 
         break; 

        case LogFormat.Error: 
         message = $"{logFormat} ERROR {message}{Environment.NewLine}"; 
         break; 

        case LogFormat.Dash: 
         message = $"{logFormat} --- {message} --- {Environment.NewLine}"; 
         break; 

        default: 
         message = $"{logFormat} {message}{Environment.NewLine}"; 
         break; 

       } 

       LogToConsole(message); 
       File.AppendAllText(LogFilePath, message); 
      } 
      catch (DirectoryNotFoundException ex) 
      { 
       LogToConsole($"Error writing log: {ex.Message}"); 
       throw; 
      } 
     } 
    } 

Etwas anderes zu betrachten ist, eine Loggerschnittstelle herzustellen und diese in Ihrer Anwendung zu verwenden. Sie können eine Dateisystemimplementierung schreiben, aber wenn Sie später Ihre Meinung ändern, sagen Sie beispielsweise eine Datenbank anzumelden, können Sie einfach eine neue Implementierung schreiben und müssen den Code, der sie verwendet, nicht ändern (nur dort, wo die Implementierung erstellt wird) .

Zum Beispiel ...

public enum LogFormat 
{ 
    Message, 
    Hash, 
    Error, 
    Dash 
} 

public interface ILogger 
{ 
    void Log(string message, LogFormat format); 

    void LogToConsole(string message); 

    void ClearLog(); 
} 


public class FileSystemLogger : ILogger 
{ 
    public void Log(string message, LogFormat format) 
    { 
     // Your filesystem logging code here... 
    } 

    public void LogToConsole(string message) 
    { 
     Console.WriteLine(message); 
    } 

    public void ClearLog() 
    { 
     // Your filesystem logging code here... 
    } 
} 

public class DatabaseLogger : ILogger 
{ 
    public void Log(string message, LogFormat format) 
    { 
     // Your database logging code here... 
    } 

    public void LogToConsole(string message) 
    { 
     Console.WriteLine(message); 
    } 

    public void ClearLog() 
    { 
     // Your database logging code here... 
    } 
} 
Verwandte Themen