背景
项目开发中,我们或多或少会使用诸如NLog,Log4Net,Kafka+ELK等等日志套件;
基于关注点分离原则,业务开发的时候不应该关注日志具体实现;并且后续能方便切换其他日志套件;
这里先实现基于文件的日志服务,在下一篇将实现基于Kafka+ELK;
具体源码:MasterChief
Nuget:Install-Package MasterChief.DotNet.Core.Log
欢迎Star,欢迎Issues;
日志接口定义
/// <summary>
/// 日志记录接口
/// </summary>
public interface ILogService
{
#region Methods
/// <summary>
/// Debug记录
/// </summary>
/// <param name="message">日志信息</param>
void Debug(string message);
/// <summary>
/// Debug记录
/// </summary>
/// <param name="message">日志信息</param>
/// <param name="ex">异常信息</param>
void Debug(string message, Exception ex);
/// <summary>
/// Error记录
/// </summary>
/// <param name="message">日志信息</param>
void Error(string message);
/// <summary>
/// Error记录
/// </summary>
/// <param name="message">日志信息</param>
/// <param name="ex">异常信息</param>
void Error(string message, Exception ex);
/// <summary>
/// Fatal记录
/// </summary>
/// <param name="message">日志信息</param>
void Fatal(string message);
/// <summary>
/// Fatal记录
/// </summary>
/// <param name="message">日志信息</param>
/// <param name="ex">异常信息</param>
void Fatal(string message, Exception ex);
/// <summary>
/// Info记录
/// </summary>
/// <param name="message">日志信息</param>
void Info(string message);
/// <summary>
/// Info记录
/// </summary>
/// <param name="message">日志信息</param>
/// <param name="ex">异常信息</param>
void Info(string message, Exception ex);
/// <summary>
/// Warn记录
/// </summary>
/// <param name="message">日志信息</param>
void Warn(string message);
/// <summary>
/// Warn记录
/// </summary>
/// <param name="message">日志信息</param>
/// <param name="ex">异常信息</param>
void Warn(string message, Exception ex);
#endregion Methods
}
基于Log4Net本地文件日志服务实现
/// <summary>
/// 基于Log4Net的文件日志记录
/// </summary>
public sealed class FileLogService : ILogService
{
#region Constructors
static FileLogService()
{
DebugLogger = LogManager.GetLogger(DebugLoggerName);
InfoLogger = LogManager.GetLogger(InfoLoggerName);
WarnLogger = LogManager.GetLogger(WarnLoggerName);
ErrorLogger = LogManager.GetLogger(ErrorLoggerName);
FatalLogger = LogManager.GetLogger(FatalLoggerName);
}
#endregion Constructors
#region Fields
/// <summary>
/// The debug logger name
/// </summary>
public const string DebugLoggerName = "DEBUG_FileLogger";
/// <summary>
/// The error logger name
/// </summary>
public const string ErrorLoggerName = "ERROR_FileLogger";
/// <summary>
/// The fatal logger name
/// </summary>
public const string FatalLoggerName = "FATAL_FileLogger";
/// <summary>
/// The information logger name
/// </summary>
public const string InfoLoggerName = "INFO_FileLogger";
/// <summa