我想编写自己的日志记录类(用 C# 编写),它实现一个标准接口,我可以从代码的任何部分调用该接口。
我的想法是让多个 Log 类实现 Logger 接口,每个类都有其特定的日志目的地,例如,FileLogger 将实现记录到文件,TextBox 记录器将实现记录到表单中的多行 TextBox,DBLogger 将实现记录到文件实现日志记录到数据库表等。
此外,每个记录器类可以具有嵌套记录器或链式记录器类,以便从应用程序代码中对 Log() 方法的单次调用可以将消息记录到多个目的地;示例在一次调用中记录到表单上的文件和文本框。
我面临的困难是这样的:
通常我会记录到一个正在运行的日志文件(其中包含调试所需的所有日志消息)、一个审阅日志文件(其中仅包含要由用户审阅或需要用户操作的日志消息)、一个多行文本框屏幕(它将复制所有日志消息以向用户提供进度指示)和另一个多行文本框(它将仅记录用户查看所需的消息)。
当我调用 logger.Log(message) 时,某些消息可能不适用于特定日志目标。例如,某些消息可能旨在仅记录在运行日志文件或进度文本框中,而不记录在用户审阅文本框中,反之亦然。
由于记录器将被链接起来,以便单个函数调用可以登录到所有所需的目的地,因此特定记录器如何识别日志消息不是为它准备的,从而忽略该日志消息?
我的示例日志界面是:
public interface Logger
{
public void Log(string msg);
public void Log(string msgType, string msg);
public void InitLogSession();
public void EndLogSession();
public void AddLogger(Logger chainedLogger);
public void RemoveLogger(Logger chainedLogger);
}
public class FileLogger : Logger
{
//implement methods
}
public class TextBoxLogger : Logger
{
//implement methods
}
public class DBLogger : Logger
{
//implement methods
}
EDIT 1:
更准确地说,可能有 4 个记录器:2 个文件记录器和 2 个文本框记录器。假设一条特定消息适用于 1 个文本框记录器和 1 个文件记录器;我的设计应该如何处理这个问题?
编辑2:
请不要建议现有的日志框架。我只想自己写!
编辑3:
好的。我有一个设计。请提供您的反馈并可能填补空白。
修改后的界面:
public interface Logger
{
public void Log(string msg);
public void Log(string msgType, string msg);
public void Log(int loggerIds, string msg);
public void Log(int loggerIds, string msgType, string msg);
public void InitLogSession();
public void EndLogSession();
public int getLoggerId();
}
public enum LoggerType
{
File,
TextBox
};
public class LoggerFactory
{
public Logger getLogger(LoggerType loggerType)
{
}
}
LoggerFactory 类将是实例化记录器的唯一方法。此类将为记录器的每个实例分配一个唯一的 ID。这个唯一的 id 将是 2 的幂。例如,第一个记录器将获得 id 1,第二个记录器将获得 id 2,第三个记录器将获得 4,第四个记录器将获得 8,依此类推。
返回的记录器对象可以类型转换为特定的类,并且调用者可以设置其他值,例如 filePath、文本框等,或者我可以在 LoggerFactory 中拥有多个方法:每种类型的记录器都有一个方法,它将接受特定的参数。
因此,假设我们有 4 个记录器,id 分别为 1,2,4,8。
必须使用以下函数记录必须由第一个和第三个记录器(即记录器 ID 1 和 4)处理的特定消息:
public void Log(int loggerIds, string msg);
要传递给 loggerIds 的值应该是“0101”。每个记录器都会检查其记录器 ID 位是否为 ON。如果是,只有这样它才会记录该消息。
现在在函数签名中,我提到了 int 类型,但是执行位操作和比较的具体优化类型是什么?
在这种方法中,最大数量可能有限制。伐木工,但这对我来说很好。请提供您的反馈。
注意:目前我仍在使用.NET 2.0。如果可能的话,建议在 .NET 2.0 内提供解决方案,否则很好,我可以迁移到更高版本。
这种设计的缺点:每个需要记录的类都需要了解应用程序实例化的所有可用记录器,并相应地设置位模式。关于如何进行松散耦合设计有什么想法吗?