C#实现Log4Net日志分类和自动维护实例
本文实例讲述了C#实现Log4Net日志分类和自动维护的实现方法。分享给大家供大家参考。具体实现方法如下:
一、背景
在程序中,我们调试运行时信息,Log4Net是一个不错的解决方案。不知道是我用的不好,用到最后反而都不想看日志了。原因是因为我n个功能使用的默认的Logger来记录日志,这样以来,所有功能记录的信息都依赖同一个配置,于是所有的信息都在一个文件中,有时候查找起来,极其不方便。
我想,能不能按照功能分类呢?如果通过配置不同的logger,然后功能根据不同的LoggerName加载Ilog实例,是可以做到。但由于这些功能的log配置差异性极小,也许仅仅就是文件名不同。于是想通过代码进行配置。
二、解决方案
想来这样的需求应该也算正常,但经过查找,发现在log4j中有相关的咨询,但看不懂,只能自己下载log4net的源码,看看它的运行原理。
如果我们需要通过配置不同的ILog,流程是这样的,首先要创建一个ILoggerRepository,通过它来进行日志等级的配置,和各种Appender,接着通过LogManager在ILoggerRepository获取一个Ilog对象,就可以写日志了。代码如下:
publicstaticILogGetLogger(stringrepositoryName="") { if(string.IsNullOrEmpty(repositoryName))returnLogManager.GetLogger("Defalut");
ILoggerRepositoryrepository=null; try { repository=LogManager.GetRepository(repositoryName); } catch(Exception){}
//找到直接返回ilog if(repository!=null) returnLogManager.GetLogger(repositoryName,"Defalut");
//未找到则创建,多线程下很有可能创建时,就存在了 try { repository=LogManager.CreateRepository(repositoryName); } catch(Exception) { repository=LogManager.GetRepository(repositoryName); }
//配置日志等级 读取Appsettings默认配置 varappSet=ConfigurationManager.AppSettings.AllKeys;
//查找日志等级 conststringlogLevel="LogLevel"; varhasSettings=Array.IndexOf(appSet,logLevel); if(hasSettings>-1) { varlevel=ConfigurationManager.AppSettings[logLevel].ToLower(); if(level=="all")repository.Threshold=Level.All; elseif(level=="debug")repository.Threshold=Level.Debug; elseif(level=="info")repository.Threshold=Level.Info; elseif(level=="warn")repository.Threshold=Level.Warn; elseif(level=="error")repository.Threshold=Level.Error; elseif(level=="fatal")repository.Threshold=Level.Fatal; elseif(level=="off")repository.Threshold=Level.Off; } elserepository.Threshold=Level.All;
//查找输出Appender conststringlogAppender="LogAppender"; hasSettings=Array.IndexOf(appSet,logAppender); if(hasSettings>-1) { varappenders=ConfigurationManager.AppSettings[logAppender].ToLower().Split(','); foreach(varappenderinappenders) { if(appender=="rollingfile")LoadRollingFileAppender(repository); elseif(appender=="console")LoadConsoleAppender(repository); elseif(appender=="trace")LoadTraceAppender(repository); } } elseLoadRollingFileAppender(repository);
returnLogManager.GetLogger(repositoryName,"Default"); }