{C#} Log4net Repository

如何使用log4net不用多说,这里说一下Repository的用法。log4net Repository代表了仓库的含义,可以生产多个具名log对象。这些对象可分别写入日志。

创建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是所有log的基本配置,其他的log都继承自root。level定义了可访问的最低级别。

问题是log4net只提供了Info(),Warn(),Error()三个接口来写入日志。如果我们要单独写入其他级别的日志,比如NOTICE,该如何实现呢?

其他级别日志

首先,appender设置成不同的输出目录,Filter采用LevelRangeFilter并限定好,确保该级别日志会被输出。
其次,调整好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
    关于Filter,LevelMatchFilter并不像其字面含义,在匹配时才输出日志。其真正作用,是在level匹配时,配合AcceptOnMatch=false阻止后续Filter的执行。
    从反编译的源代码可以看出这一点:
// 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);
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,588评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,456评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,146评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,387评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,481评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,510评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,522评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,296评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,745评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,039评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,202评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,901评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,538评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,165评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,415评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,081评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,085评论 2 352

推荐阅读更多精彩内容

  • (http://www.cnblogs.com/zhangchenliang/p/4546352.html) 1、...
    凌雲木阅读 2,417评论 0 2
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,646评论 18 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,797评论 6 342
  • 在应用程序中添加日志记录总的来说基于三个目的:监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析...
    时待吾阅读 4,979评论 0 6
  • 父爱如橘 今天去超市购物,猛然抬头看到柑橘又上市了,货仓里堆的高高的,青绿色的叶子衬着金黄的柑橘,在灯光的映衬下闪...
    枫叶如花HH阅读 568评论 2 3