目录
引言
log4net
是一个高度灵活且强大的日志记录库,可用于记录应用程序的运行时信息。它支持各种日志输出格式和目的地,如文件、数据库、控制台等。传统用法我们需要手动配置log4net.config文件,这极大不利于我们对日志文件的管理和分类,今天就介绍一种封装方法,可以便于我们利用代码动态生成配置和创建日志文件并记录日志信息。
1、配置文件
如果我们已经在log4net.config文件中配置过logger,我们可以通过GetLogger方法直接获取:
log4net.LogManager.GetLogger("mylogger")
没有的话,我们组织一份配置类,这通常包括:日志名称、保存根目录、分支目录、日志文件大小、日志文件数量等。
public class ClogSetting
{
private const int SIZE_CONTENT = 10485760;
private const int COUNT_BACK = 20;
public string Name { get; set; }
//public string FileName { get; set; }
public string RootDir { get; set; }
public string BranchDir { get; set; }
public int MaxFileSize { get; set; }
public int MaxBackFiles { get; set; }
public int MaxFileDate {get; set; }
public ClogSetting()
: this("Default", "DefaultLogs")
{
}
public ClogSetting(string name, string branchDir)
{
this.RootDir = "D:\\Data\\Logs";
this.MaxFileSize = 10485760;//10MB
this.MaxBackFiles = 100;
this.MaxFileDate= 30;
this.Name = name;
this.BranchDir = branchDir;
}
/// <summary>
/// 删除过期日志
/// </summary>
/// <param name="logpath"></param>
public static void DeleteLog(string logpath)
{
DirectoryInfo dyInfo = new DirectoryInfo(logpath);
//获取文件夹下所有的文件
foreach (FileInfo feInfo in dyInfo.GetFiles())
{
//判断文件日期是否小于指定日期,是则删除
if (feInfo.CreationTime < DateTime.Now.AddDays(-MaxFileDate))
feInfo.Delete();
}
}
}
2、创建日志对象
这里声明一个静态类,在构造函数中进行Log4net的初始化,并提供一个静态方法创建并返回日志对象的接口类型ILog。
public static class ClogHepler
{
private static ConcurrentDictionary<Guid, ClogHepler.PairLogItem> _logPairDictionary;
static ClogHepler()
{
BasicConfigurator.Configure();
ClogHepler._logPairDictionary = new ConcurrentDictionary<Guid, ClogHepler.PairLogItem>();
}
/// <summary>
/// 创建或获取LOG记录实例
/// </summary>
/// <param name="logSetting"></param>
/// <returns></returns>
public static ILog Create(this ClogSetting logSetting)
{
ILog logger1 = LogManager.GetLogger(logSetting.Name);
Logger logger2 = logger1.Logger as Logger;
if (logger2.Appenders.Count == 0)
{
logger2.Level = logger2.Hierarchy.LevelMap["ALL"];
RollingFileAppender rollingFileAppender = new RollingFileAppender();
rollingFileAppender.Name = logSetting.Name;
rollingFileAppender.File = logSetting.RootDir + "/"+logSetting.BranchDir+"/";
rollingFileAppender.AppendToFile = true;
rollingFileAppender.StaticLogFileName = false;
rollingFileAppender.MaxFileSize = (long)logSetting.MaxFileSize;
rollingFileAppender.MaxSizeRollBackups = logSetting.MaxBackFiles;
RollingFileAppender newAppender = rollingFileAppender;
if (logSetting.MaxBackFiles > 0)
{
newAppender.RollingStyle = RollingFileAppender.RollingMode.Composite;
newAppender.DatePattern = "yyyy-MM-dd\".txt\"";
}
else
{
newAppender.RollingStyle = RollingFileAppender.RollingMode.Date;
newAppender.DatePattern = "yyyy-MM-dd\".txt\"";
}
PatternLayout patternLayout = new PatternLayout()
{
ConversionPattern = "%d{yyyy-MM-dd HH:mm:ss.fff}\t[%thread]\t%level\t%logger\t-\t%message%newline"
};
patternLayout.ActivateOptions();
newAppender.Layout = (ILayout)patternLayout;
newAppender.Encoding = Encoding.UTF8;
newAppender.ActivateOptions();
logger2.AddAppender((IAppender)newAppender);
}
logSetting.DeleteLog(Path.Combine(logSetting.RootDir,logSetting.BranchDir));
return logger1;
}
}
3、使用
ClogSetting logsetting = new ClogSetting("logger", "logdir");
ILog mylogger = logsetting.Create();
mylogger.Info("日志消息");
mylogger.Error("日志消息");
mylogger.Warn("日志消息");
D:/Data/Logs/logdir/2024-02-23.txt
2024-02-23 09:15:15.880 [1] INFO logger - 日志消息
2024-02-23 09:15:16.141 [1] ERROR logger - 日志消息
2024-02-23 09:15:16.277 [1] WARN logger - 日志消息