【问题标题】:How can this log class be improved so that it can be used across C# multiple projects?如何改进这个日志类,以便它可以跨 C# 多个项目使用?
【发布时间】:2016-07-27 11:06:15
【问题描述】:

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

您是否发现我应该改变/考虑改变的任何问题?

【问题讨论】:

  • 只需提一点——如果您在多个项目中使用它,您可能需要考虑使用标准时区而不是 DateTime.Now – 如果您的项目托管在不同的环境或地区,那么您的每个项目的日志记录日期会有所不同,这会使阅读日志成为一场噩梦!也许您可以改用 UTC。
  • 您应该真正使用适当的日志框架,例如 NLoglog4net

标签: c# logging


【解决方案1】:

我有一些建议......

我同意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;
            }
        }
    }

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

例如...

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

【讨论】:

    猜你喜欢
    • 2011-12-15
    • 2018-09-05
    • 1970-01-01
    • 1970-01-01
    • 2012-06-01
    • 2020-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多