C#中的灵活日志界面设计

All*_*ons 3 c# logging

我想编写自己的Logging类(在C#中),它实现了一个标准接口,我可以从代码的任何部分调用它.

我的想法是让多个Log类实现Logger接口,每个类都用于其特定的日志目的地,例如,FileLogger将实现日志记录到文件,TextBox记录器将实现登录到Form中的多行TextBox,DBLogger将实现日志记录到数据库表等

此外,每个记录器类可以具有嵌套的记录器或链式记录器类,因此从应用程序代码单次调用Log()方法可以在多个目的地中记录消息; 示例在单个调用中记录到Form上的文件和文本框.

我面临的困难是:

通常我会记录一个正在运行的日志文件(其中包含调试所需的所有日志消息),一个审阅日志文件(其中只包含要由用户审阅的日志消息,或需要用户操作的日志消息),一个多线文本框屏幕(将复制所有日志消息以向用户提供进度指示),以及另一个多行文本框(将仅记录用户要查看的消息).

当我调用logger.Log(消息)时,某些消息可能不适用于特定的日志目标.例如,某些消息可能仅用于记录在正在运行的日志文件或进度文本框中,而不能记录在用户评论文本框中,反之亦然.

由于记录器将被链接以便单个函数调用可以登录到所有必需的目标,因此特定记录器如何识别日志消息不是针对它的,因此忽略日志消息?

我的示例日志界面是:

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
}
Run Code Online (Sandbox Code Playgroud)

编辑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)
    {

    }
}
Run Code Online (Sandbox Code Playgroud)

LoggerFactory类将是实例化记录器的唯一方法.该类将为记录器的每个实例分配唯一的id.这个唯一的id将是2的幂.例如,第一个记录器将获得id 1,第二个将获得id 2,第三个将获得4,第四个将获得8,依此类推.

返回的logger对象可以类型化为特定的类,调用者可以设置其他值,如filePath,textbox等,否则我可以在LoggerFactory中有多个方法:每种类型的logger一个,它将接受特定的参数.

所以,假设我们有4个带有ID 1,2,4,8的记录器.必须使用以下函数记录必须由第1和第3记录器(即记录器ID 1和4)处理的特定消息:

    public void Log(int loggerIds, string msg);
Run Code Online (Sandbox Code Playgroud)

传递给loggerIds的值应为"0101".每个记录器将检查其记录器ID位是否为ON.如果是,那么它将记录该消息.

现在在函数签名中,我提到了int类型,但是哪个是用于执行位操作和比较的特定优化类型?

在这种方法中,最大值可能有限制.记录器,但对我来说没问题.请提供反馈.

注意:目前我仍然使用.NET 2.0.如果可能的话,在.NET 2.0中建议解决方案,否则很好,我可以转向更高版本.

这种设计的缺点:每个需要记录的类,需要知道应用程序实例化的所有可用记录器,并相应地设置位模式.任何想法如何设计松散耦合?

dev*_*tal 8

为什么不查看(或确实使用)现有的日志框架,如log4netNLog.

它们具有日志级别的概念(例如跟踪,信息,错误等),并且能够按日志名称(通常是调用日志记录调用的完全限定类型名称)进行过滤.然后,您可以将这些映射到一个或多个"目标".

  • 我想自己做这件事.我此刻不想学习第三方图书馆.日志级别无济于事,因为可能只需要在选定目标中记录具有相同日志级别的不同消息. (2认同)