C#完成Log4Net日記分類和主動保護實例。本站提示廣大學習愛好者:(C#完成Log4Net日記分類和主動保護實例)文章只能為提供參考,不一定能成為您想要的結果。以下是C#完成Log4Net日記分類和主動保護實例正文
本文實例講述了C#完成Log4Net日記分類和主動保護的完成辦法。分享給年夜家供年夜家參考。詳細完成辦法以下:
1、配景
在法式中,我們調試運轉時信息,Log4Net是一個不錯的處理計劃。不曉得是我用的欠好,用到最初反而都不想看日記了。緣由是由於我n個功效應用的默許的Logger來記載日記,如許以來,一切功效記載的信息都依附統一個設置裝備擺設,因而一切的信息都在一個文件中,有時刻查找起來,極端不便利。
我想,能不克不及依照功效分類呢?假如經由過程設置裝備擺設分歧的logger,然後功效依據分歧的LoggerName加載Ilog實例,是可以做到。但因為這些功效的log設置裝備擺設差別性極小,或許僅僅就是文件名分歧。因而想經由過程代碼停止設置裝備擺設。
2、處理計劃
想來如許的需求應當也算正常,但經由查找,發明在log4j中有相干的征詢,但看不懂,只能本身下載log4net的源碼,看看它的運轉道理。
假如我們須要經由過程設置裝備擺設分歧的ILog,流程是如許的,起首要創立一個ILoggerRepository,經由過程它來停止日記品級的設置裝備擺設,和各類Appender,接著經由過程LogManager在ILoggerRepository獲得一個Ilog對象,便可以寫日記了。代碼以下:
public static ILog GetLogger(string repositoryName = "")
{
if (string.IsNullOrEmpty(repositoryName)) return LogManager.GetLogger("Defalut");
ILoggerRepository repository = null;
try
{
repository = LogManager.GetRepository(repositoryName);
}
catch (Exception) { }
//找到直接前往ilog
if (repository != null)
return LogManager.GetLogger(repositoryName, "Defalut");
//未找到則創立,多線程下很有能夠創立時,就存在了
try
{
repository = LogManager.CreateRepository(repositoryName);
}
catch (Exception)
{
repository = LogManager.GetRepository(repositoryName);
}
//設置裝備擺設日記品級 讀取Appsettings默許設置裝備擺設
var appSet = ConfigurationManager.AppSettings.AllKeys;
//查找日記品級
const string logLevel = "LogLevel";
var hasSettings = Array.IndexOf(appSet, logLevel);
if (hasSettings > -1)
{
var level = ConfigurationManager.AppSettings[logLevel].ToLower();
if (level == "all") repository.Threshold = Level.All;
else if (level == "debug") repository.Threshold = Level.Debug;
else if (level == "info") repository.Threshold = Level.Info;
else if (level == "warn") repository.Threshold = Level.Warn;
else if (level == "error") repository.Threshold = Level.Error;
else if (level == "fatal") repository.Threshold = Level.Fatal;
else if (level == "off") repository.Threshold = Level.Off;
}
else repository.Threshold = Level.All;
//查找輸入Appender
const string logAppender = "LogAppender";
hasSettings = Array.IndexOf(appSet, logAppender);
if (hasSettings > -1)
{
var appenders = ConfigurationManager.AppSettings[logAppender].ToLower().Split(',');
foreach (var appender in appenders)
{
if (appender == "rollingfile") LoadRollingFileAppender(repository);
else if (appender == "console") LoadConsoleAppender(repository);
else if(appender == "trace") LoadTraceAppender(repository);
}
}
else LoadRollingFileAppender(repository);
return LogManager.GetLogger(repositoryName, "Default");
}
Log4net 會主動保護ILog和ILoggerRepository,所以不消保留,經由過程LogManger獲得便可。然則我沒有找到辦法來查找指定的ILoggerRepository能否存在,所以在上述代碼中經由過程try catch停止斷定。因為我們是經由過程代碼方法設置裝備擺設log4net,但仍然願望經由過程設置裝備擺設來設置日記品級和輸入類型,所以我選擇在Appsettings文件中停止設置裝備擺設,一次設置裝備擺設,針對一切的ILoggerRepository都失效。之所以不是針對每個功效停止設置裝備擺設,重要是因為設置裝備擺設費事,並且假如真要這麼做,直接在log4net中設置裝備擺設分歧的logger,經由過程loggername援用,能夠會更好些。
3、日記保護
因而接上去的成績是,若何刪除日記?
log4net可以設置裝備擺設RollingFileAppender,翻譯過去是轉動文件。經由過程設置MaximumFileSize和MaxSizeRollBackups 2個參數可以完成如許的目標,該日記文件每到達必定年夜小就會發生一個新文件,文件最年夜總數則為MaxSizeRollBackups,但條件的是文件名分歧。
好比我們采取以下設置裝備擺設:
<!--RollingFileAppender:輸入到文件中-->
<appender name="SysAppender" type="log4net.Appender.RollingFileAppender">
<!--日記的途徑-->
<file value="Logs/" />
<!--能否籠罩,默許是追加true-->
<appendToFile value="true"/>
<!--不占用日記文件過程-->
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<rollingStyle value="Composite"/>
<!--文件稱號-->
<DatePattern value="yyyy-MM-dd HH'時.log'"></DatePattern>
<!--設置無窮備份=-1 ,最年夜備份數為1000-->
<param name="MaxSizeRollBackups" value="1000"/>
<!--每一個文件的年夜小-->
<param name="MaximumFileSize" value="500KB"/>
<!--稱號能否可以更改 為false為可以更改-->
<param name="StaticLogFileName" value="false"/>
<layout type="log4net.Layout.PatternLayout">
<!--輸入格局-->
<conversionPattern value="%n【記載時光】%date%n【描寫】%message%n"/>
</layout>
</appender>
後果則是 日記以小時為單元,每小時最年夜備份總數為1000,每到500kb後構成日記文件。當跟著天數的增長,文件也開端變多,須要我們本身去清算。所以上述設置裝備擺設可以略微改下:
<!--RollingFileAppender:輸入到文件中-->
<appender name="SysAppender" type="log4net.Appender.RollingFileAppender">
<!--日記的途徑-->
<file value="Logs/日記.log" />
<!--能否籠罩,默許是追加true-->
<appendToFile value="true"/>
<!--不占用日記文件過程-->
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<rollingStyle value="Composite"/>
<!--文件稱號-->
<DatePattern value="yyyy-MM-dd HH'時.log'"></DatePattern>
<!--設置無窮備份=-1 ,最年夜備份數為1000-->
<param name="MaxSizeRollBackups" value="1000"/>
<!--每一個文件的年夜小-->
<param name="MaximumFileSize" value="500KB"/>
<!--稱號能否可以更改 為false為可以更改-->
<param name="StaticLogFileName" value="true"/>
<layout type="log4net.Layout.PatternLayout">
<!--輸入格局-->
<conversionPattern value="%n【記載時光】%date%n【描寫】%message%n"/>
</layout>
</appender>
重要是設置了日記文件名,並且是靜態稱號,不許可更改。如許以來,日記文件最多只要1000個了,就不消手工保護了,你會看到如許的日記文件名:
日記.log 日記.log.1 日記.log.2 ... 默許是文件名最初的數字越年夜,時光最老,所以檢查新日記,重要是在 第一個文件名 中。
別的提示下:假如設置Appender應用了靜態文件名,那末汗青日記會被籠罩,而極端在乎汗青日記的運用,建議不要應用此計劃,清算日記的話,照樣老誠實實寫代碼吧。
完全實例代碼點擊此處本站下載。
願望本文所述對年夜家的C#法式設計有所贊助。