我想编写自己的 Logging 类(在 C# 中),它实现了一个标准接口,我可以从代码的任何部分调用它。
我的想法是让多个 Log 类实现 Logger 接口,每个类都有其特定的日志目标,例如,FileLogger 将实现对文件的日志记录,TextBox 记录器将实现对 Form 中的多行 TextBox 的日志记录,DBLogger 将实现对数据库表的日志记录等。
此外,每个记录器类可以有一个嵌套记录器或链式记录器类,以便从应用程序代码对 Log() 方法的单个调用可以将消息记录到多个目的地;示例在一次调用中记录到 Form 上的文件和文本框。
我面临的困难是这样的:
通常我会登录到一个正在运行的日志文件(它将包含调试所需的所有日志消息)、一个审查日志文件(它只包含要由用户审查或需要用户操作的日志消息)、一个多行文本框屏幕(将复制所有日志消息以向用户提供进度指示)和另一个多行文本框(将仅记录用户需要查看的消息)。
当我调用 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
}
编辑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,依此类推。
返回的记录器对象可以被类型转换为特定的类,调用者可以设置文件路径、文本框等进一步的值,或者我可以在 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 中的解决方案,否则很好,我可以移动到更高版本。
这种设计的缺点:每个需要记录的类都需要知道应用程序实例化的所有可用记录器,并相应地设置位模式。任何想法如何进行松散耦合的设计?