{C#} Log4net Repository

如何使用log4net不用多說,這里說一下Repository的用法。log4net Repository代表了倉庫的含義,可以生產(chǎn)多個具名log對象摆寄。這些對象可分別寫入日志。

創(chuàng)建Repository的方法
LogManager.CreateRepository(domain);
Repository的配置

有兩種方法坯门,一種是配置文件微饥,一種是手動寫代碼配置。

手動代碼:
    public void InitLog4netConfig3()
    {
        var infoFilter = new LevelRangeFilter();

        infoFilter.LevelMax = log4net.Core.Level.Info;
        infoFilter.LevelMin = log4net.Core.Level.Info;
        infoFilter.ActivateOptions();

        string layoutFormat = "@Log Begin%newlineThread ID:[%thread]%newline%message%newlineLog End@%newline";

        var basepath = AppDomain.CurrentDomain.BaseDirectory;
        var LogDir = Path.Combine(basepath, "log");

        PatternLayout layout = new PatternLayout(layoutFormat);

        var domain = "base";
        var repository = log4net.LogManager.CreateRepository(domain);
        repository.Threshold = Level.Info;

        var fileAppender = new RollingFileAppender();
        fileAppender.Name = domain + "_" + "Info" + "_FileAppender";
        fileAppender.File = System.IO.Path.Combine(LogDir, "Log_" + domain + "\\" + "Info" + "\\");
        fileAppender.AppendToFile = true;
        fileAppender.RollingStyle = RollingFileAppender.RollingMode.Date;
        fileAppender.DatePattern = "yyyy-MM-dd'.log'";
        fileAppender.StaticLogFileName = false;
        fileAppender.Layout = layout;
        fileAppender.AddFilter(infoFilter);
        fileAppender.ActivateOptions();

        BasicConfigurator.Configure(repository, fileAppender);
     }
配置文件:
<log4net>
  <root>
    <level value="WARN" />
    <appender-ref ref="LogFileAppender" />
    <appender-ref ref="ConsoleAppender" />
  </root>

  <logger name="log1">
    <level value="DEBUG"/>
  </logger>

  <logger name="log2">
    <level value="DEBUG"/>
  </logger>

  <appender name="LogFileAppender" type="log4net.Appender.FileAppender" >
    <param name="File" value="your-log-file.txt" />
    <param name="AppendToFile" value="true" />

    <layout type="log4net.Layout.PatternLayout">
      <param name="Header" value="[Header] "/>
      <param name="Footer" value="[Footer] "/>
      <param name="ConversionPattern" value="%d [%t] %-5p %c [%x]  - %m%n" />
    </layout>
    <filter type="log4net.Filter.LevelRangeFilter">
      <param name="LevelMin" value="DEBUG" />
      <param name="LevelMax" value="WARN" />
    </filter>
  </appender>

  <appender name="ConsoleAppender"  type="log4net.Appender.ConsoleAppender" >
    <layout type="log4net.Layout.PatternLayout">
      <param name="ConversionPattern"  value="%d [%t] %-5p %c [%x] - %m%n" />
    </layout>
  </appender>
</log4net>

然后

    public void InitLog4netConfig()
    {
        var domain = "base";
        var repository = log4net.LogManager.CreateRepository(domain);
        var basepath = AppDomain.CurrentDomain.BaseDirectory;
        var filepath = System.IO.Path.Combine(basepath, "log4net.xml");
        var fileInfo = new FileInfo(filepath);

        XmlConfigurator.Configure(repository, fileInfo);
    }

root是所有l(wèi)og的基本配置古戴,其他的log都繼承自root欠橘。level定義了可訪問的最低級別。

問題是log4net只提供了Info(),Warn(),Error()三個接口來寫入日志允瞧。如果我們要單獨(dú)寫入其他級別的日志简软,比如NOTICE蛮拔,該如何實(shí)現(xiàn)呢?

其他級別日志

首先痹升,appender設(shè)置成不同的輸出目錄建炫,F(xiàn)ilter采用LevelRangeFilter并限定好,確保該級別日志會被輸出疼蛾。
其次肛跌,調(diào)整好Repository.Threshold,不要被阻擋在外察郁。
然后衍慎,這么做:

        log4net.ILog log = log4net.LogManager.GetLogger("base", "abc");

        var loggingEventData = new LoggingEventData()
        {
            Level = Level.Notice,
            Message = "put notice message"
        };

        log.Logger.Log(new LoggingEvent(loggingEventData));

        log.Logger.Log(typeof(LogImpl), Level.Notice, "put notice message 2", null);
  • Filter
    關(guān)于Filter,LevelMatchFilter并不像其字面含義皮钠,在匹配時才輸出日志稳捆。其真正作用,是在level匹配時麦轰,配合AcceptOnMatch=false阻止后續(xù)Filter的執(zhí)行乔夯。
    從反編譯的源代碼可以看出這一點(diǎn):
// AppenderSkeleton.cs
protected virtual bool FilterEvent(LoggingEvent loggingEvent)
{
  if (!this.IsAsSevereAsThreshold(loggingEvent.Level))
    return false;
  IFilter filter = this.FilterHead;
  while (filter != null)
  {
    switch (filter.Decide(loggingEvent))
    {
      case FilterDecision.Deny:
        return false;
      case FilterDecision.Neutral:
        filter = filter.Next;
        break;
      case FilterDecision.Accept:
        filter = (IFilter) null;
        break;
    }
  }
  return true;
}

// LevelMatchFilter.cs
public override FilterDecision Decide(LoggingEvent loggingEvent)
{
  if (loggingEvent == null)
    throw new ArgumentNullException("loggingEvent");
  if (this.m_levelToMatch != (Level) null && this.m_levelToMatch == loggingEvent.Level)
    return this.m_acceptOnMatch ? FilterDecision.Accept : FilterDecision.Deny;
  else
    return FilterDecision.Neutral;
}
  • level
    如何定義自己的Level呢? 比如說慢日志款侵,也很簡單末荐。
class SlowLogExample
{
    private Level SLOW = new Level(Level.Info.Value + 1, "SLOW");

    public void InitLogConfig()
    {
        var InfoFilter = new LevelRangeFilter();

        InfoFilter.LevelMax = SLOW;
        InfoFilter.LevelMin = SLOW;
        InfoFilter.ActivateOptions();

        string layoutFormat = "@Log Begin%newlineThread ID:[%thread]%newline%message%newlineLog End@%newline";

        var basepath = AppDomain.CurrentDomain.BaseDirectory;
        var LogDir = Path.Combine(basepath, "log");

        PatternLayout layout = new PatternLayout(layoutFormat);

        var domain = "base";
        var repository = log4net.LogManager.CreateRepository(domain);

        //repository.Threshold = Level.Info;
        repository.LevelMap.Add(SLOW);

        var fileAppender1 = new RollingFileAppender();
        fileAppender1.Name = domain + "_" + "Info" + "_FileAppender";
        fileAppender1.File = System.IO.Path.Combine(LogDir, "Log_" + domain + "\\" + "Slow" + "\\");
        fileAppender1.AppendToFile = true;
        fileAppender1.RollingStyle = RollingFileAppender.RollingMode.Date;
        fileAppender1.DatePattern = "yyyy-MM-dd'.log'";
        fileAppender1.StaticLogFileName = false;
        fileAppender1.Layout = layout;
        fileAppender1.AddFilter(InfoFilter);
        fileAppender1.ActivateOptions();

        BasicConfigurator.Configure(repository, fileAppender1);
    }

    public void LogSlow(string message)
    {
        var log = log4net.LogManager.GetLogger("base", "");

        log.Logger.Log(typeof(LogImpl), SLOW, message, null);
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市新锈,隨后出現(xiàn)的幾起案子甲脏,更是在濱河造成了極大的恐慌,老刑警劉巖妹笆,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件块请,死亡現(xiàn)場離奇詭異,居然都是意外死亡晾浴,警方通過查閱死者的電腦和手機(jī)负乡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來脊凰,“玉大人,你說我怎么就攤上這事茂腥±暧浚” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵最岗,是天一觀的道長帕胆。 經(jīng)常有香客問我,道長般渡,這世上最難降的妖魔是什么懒豹? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任芙盘,我火速辦了婚禮,結(jié)果婚禮上脸秽,老公的妹妹穿的比我還像新娘儒老。我一直安慰自己,他們只是感情好记餐,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布驮樊。 她就那樣靜靜地躺著,像睡著了一般片酝。 火紅的嫁衣襯著肌膚如雪囚衔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天雕沿,我揣著相機(jī)與錄音练湿,去河邊找鬼。 笑死审轮,一個胖子當(dāng)著我的面吹牛鞠鲜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播断国,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼贤姆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了稳衬?” 一聲冷哼從身側(cè)響起霞捡,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎薄疚,沒想到半個月后碧信,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡街夭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年砰碴,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片板丽。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡呈枉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出埃碱,到底是詐尸還是另有隱情猖辫,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布砚殿,位于F島的核電站啃憎,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏似炎。R本人自食惡果不足惜辛萍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一悯姊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧贩毕,春花似錦悯许、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至睛藻,卻和暖如春启上,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背店印。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工冈在, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人按摘。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓包券,卻偏偏與公主長得像,于是被迫代替她去往敵國和親炫贤。 傳聞我的和親對象是個殘疾皇子溅固,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容

  • (http://www.cnblogs.com/zhangchenliang/p/4546352.html) 1、...
    凌雲(yún)木閱讀 2,401評論 0 2
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理兰珍,服務(wù)發(fā)現(xiàn)侍郭,斷路器,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,748評論 6 342
  • 在應(yīng)用程序中添加日志記錄總的來說基于三個目的:監(jiān)視代碼中變量的變化情況掠河,周期性的記錄到文件中供其他應(yīng)用進(jìn)行統(tǒng)計(jì)分析...
    時待吾閱讀 4,961評論 0 6
  • 父愛如橘 今天去超市購物亮元,猛然抬頭看到柑橘又上市了,貨倉里堆的高高的唠摹,青綠色的葉子襯著金黃的柑橘爆捞,在燈光的映襯下閃...
    楓葉如花HH閱讀 562評論 2 3