如何改进这个日志类,以便它可以在C#多个项目中使用

本文关键字:项目 何改进 日志 | 更新日期: 2023-09-27 17:58:46

我正在尝试确定以下类是否可以在多个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

你能看到我应该改变/考虑改变的问题吗?

如何改进这个日志类,以便它可以在C#多个项目中使用

我有一些建议。。。

我同意donners45的观点,即在存储日期时尽可能使用UTC,并在需要向用户显示日期时转换为当地时间。

如果你想让它变得可移植,也许可以避免使用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;
            }
        }
    }

另外需要考虑的是制作一个记录器接口并在应用程序中使用它。你可以编写一个文件系统实现,但如果你以后改变主意,比如登录数据库fr示例,你可以只编写一个新的实现,而不必更改使用它的代码(只要创建了实现)。

例如。。。

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