C#日志设计:扩展方法,替代方案?

我想编写一个可以轻松附加到当前项目中任何类的记录器。 对于开发,将消息记录到控制台会很方便,而在最终版本中,我想记录到文件或其他内容。 一个人应该能够通过编辑几行代码或理想情况下的设置文件来改变行为。

到目前为止我所拥有的是这种类结构:

public interface ILogger { void LogMessage(String message); // ... other logging functions (exceptions, time etc.) don't matter here }; public interface ILoggable { }; public static class LoggingProvider { private static ILogger logger = ConsoleLogger.handle; public static void LogMessage(this ILoggable obj, String message) { logger.LogMessage(message); } } public sealed class NullLogger : ILogger { // A logger that does nothing.. }; public sealed class FileLogger : ILogger { // A logger that writes to a file.. }; public sealed class ConsoleLogger : ILogger { #region Console Allocation [DllImport("kernel32.dll", SetLastError = true)] static extern bool AllocConsole(); [DllImport("kernel32.dll", SetLastError = true)] static extern bool FreeConsole(); #endregion #region Singleton implementation private static Object cs = new Object(); private static ILogger instance = null; private ConsoleLogger() { AllocConsole(); } ~ConsoleLogger() { FreeConsole(); } public static ILogger handle { get { lock ( cs ) { if ( instance == null ) instance = new ConsoleLogger(); } return instance; } } #endregion #region ILogger Member public void LogMessage(string message) { lock ( cs ) { String logString = getTimeString(); logString += ( " -> \t " + message ); Console.WriteLine(logString); } } #endregion #region Helper functions // ... #endregion }; 

现在,我可以拥有任何我想要实现ILoggable ,并通过扩展方法LogingProvider.LogMessage我可以在这些类中调用this.LogMessage("...") 。 如果它是C ++,我只会使用私有inheritance。

这是现在好还是坏的设计? 我可以改进什么吗? 有没有一种方法可以在没有扩展方法的情况下为类提供日志记录function,但是同样几乎没有更改?

你的设计乍一看似乎有点过度设计了。 在这个方法中:

 public static void LogMessage(this ILoggable obj, String message) { logger.LogMessage(message); } 

ILoggable obj没有使用ILoggable obj 。 你为什么需要呢? 为什么不只是:

 public static void LogMessage(String message) { logger.LogMessage(message); } 

并称之为LoggingProvider.LogMessage(...)

另外,请看一下Log4Net ,这是日志记录function的行业标准实现。