如何改进这个日志类,以便它可以在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
你能看到我应该改变/考虑改变的问题吗?
我有一些建议。。。
我同意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...
}
}