2016-07-27 15 views
-1

我試圖確定下面的類是功能性的跨多個C#項目如何改進此日誌類以便可以跨C#多個項目使用它?

這個類背後的想法是,它會自動生成一個日誌文件,如果一個已被編輯或刪除的程序運行時使用。

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 

是否有任何問題,你可以看到我應該改變/考慮改變?

+0

只是一個小提點 - 如果你在多個項目中使用這個你可能要考慮使用標準時區,而不是DateTime.Now - 如果你的項目託管在不同的環境或地區,那麼您的日誌記錄日期會因每個項目而異,這可能會使閱讀日誌成爲一場噩夢!也許你可以使用UTC。 – donners45

+0

您應該使用正確的日誌框架,例如* NLog *或* log4net *。 –

回答

1

我有幾個建議...

我同意在donners45嘗試和存儲日期時使用的UTC在可能情況下,當你需要將它們diplay用戶轉換爲本地時間。

如果你想使它具有可移植性,可以避免使用MessageBox,因爲這可能不適用於某些應用程序。

也許使用Enum作爲格式而不是傳遞幻數。像...

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; 
      } 
     } 
    } 

還有一件事要考慮的是做一個記錄器接口,並在你的應用程序中使用它。你可以編寫一個文件系統實現,但是如果你稍後改變主意,比如說登錄一個數據庫的例子,你可以寫一個新的實現,而不必改變使用它的代碼(只要創建實現的地方) 。

例如...

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... 
    } 
} 
相關問題