C#使用日志组件log4net

目录
  • 一、概述
    • 1、下载与版本
    • 2、Log4net的结构
    • 3、日志的级别
  • 二、建立log4net配置文件
    • 1、配置文件
    • 2、Logger
    • 3、Appender
    • 4、PatternLayout中的转换模式
  • 三、定义配置文件
    • 1、在Winfrom中,在AssemblyInfo.cs中添加如下代码:
    • 2、在asp.net中,在Global.asax文件中的Application_Start方法中增加:
  • 四、调用log4net写日志
    • 1、创建或获取日志对象
    • 2、输出日志信息
  • 五、更改Appender设置
    • 1、获取root的Appender
    • 2、获取指定Logger的Appender:不包括继承的Appender
    • 3、更改Appender设置
  • 六、自定义appender
    • 1、定义myMemAppender类
    • 2、注册Appender

一、概述

log4net库是Apache log4j框架在Microsoft .NET平台的实现,是一个帮助程序员将日志信息输出到各种目标(控制台、文件、数据库等)的工具。

1、下载与版本

Apache log4net ™,最新版本log4net 2.0.8

2、Log4net的结构

log4net 有四种主要的组件,分别是Logger(记录器), Repository(库), Appender(附着器)以及 Layout(布局)。

3、日志的级别

如果没有定义LEVEL的值,则缺省为DEBUG。

  • OFF 级别最高
  • FATAL
  • RROR
  • WARN
  • INFO
  • DEBUG 缺省
  • ALL 级别最低

比如:定义一个日志对象,设置级别为INFO,表示比INFO级别高(或相等)的日志将被记录。即log.Info(“XX”)将记录,log.Debug(“**”)不记录

二、建立log4net配置文件

config/log4net.config文件:

<log4net>
  <root>
    <level value="INFO" />
    <appender-ref ref="RollingFileAppender" />
    <appender-ref ref="ColoredConsoleAppender" />
  </root>
  <logger name="MessageHandler">
    <level value="ERROR" />
    <appender-ref ref="SmtpAppender" />
  </logger>
  <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
    <file value="Log\pamsdc" />
    <threshold value="INFO" />
    <appendToFile value="true" />
    <rollingStyle value="Composite" />
    <datePattern value="yyyyMMdd" />
    <maxSizeRollBackups value="100"></maxSizeRollBackups>
    <layout type="log4net.Layout.PatternLayout">
      <header value="[Header]" />
      <footer value="[Footer]" />
      <conversionPattern value="%date [%thread] %-5level %logger [%ndc] <%property{auth}> - %message%newline" />
    </layout>
  </appender>
  <appender name="ColoredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender">
    <mapping>
      <level value="WARN" />
      <foreColor value="White" />
      <backColor value="Red, HighIntensity" />
    </mapping>
    <layout type="log4net.Layout.PatternLayout">
      <header value="[Header]" />
      <footer value="[Footer]" />
      <conversionPattern value="%date [%thread] %-5level %logger [%ndc] <%property{auth}> - %message%newline" />
    </layout>
  </appender>
  <appender name="SmtpAppender" type="log4net.Appender.SmtpAppender,log4net">
    <to value="" />
    <from value="GPEHZ-MIS@GoldPeak" />
    <subject value="PAMS DC 致命错误" />
    <smtpHost value="192.50.6.248" />
    <bufferSize value="32" />
    <lossy value="true" />
    <Authentication value="Basic"/>
    <Username value="GPEHZ-MIS@GoldPeak"/>
    <Password value=""/>
    <evaluator type="log4net.Core.LevelEvaluator,log4net">
      <threshold value="ERROR" />
    </evaluator>
    <layout type="log4net.Layout.PatternLayout,log4net">
      <conversionPattern value="日期:%date 线程:[%thread] 级别: %-5level 类:%logger [%ndc] < %property{auth}> - 消息:%message%newline" />
    </layout>
  </appender>
</log4net>

1、配置文件

配置信息一般放在单独的配置文件中,也可以放在在程序的配置文件里,如app.config 或web.config. 或者任意文件中。 
log4net框架会在相对于AppDomain.CurrentDomain.BaseDirectory 属性定义的目录路径下查找配置文件。

框架在配置文件里要查找的唯一标识是标签。一个完整的配置文件的例子如下:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net"  type="log4net.Config.Log4NetConfigurationSectionHandler,
            log4net-net-1.0" />
  </configSections>

  <log4net>
    ..
  </log4net>
</configuration>

2、Logger

Logger是应用程序需要交互的主要组件,它用来产生日志消息。产生的日志消息并不直接显示,还要预先经过Layout的格式化处理后才会输出。 
Logger提供了多种方式来记录一个日志消息,你可以在你的应用程序里创建多个Logger,每个实例化的Logger对象都被log4net框架作为命名实体(named entity)来维护。这意味着为了重用Logger对象,你不必将它在不同的类或对象间传递,只需要用它的名字为参数调用就可以了。

log4net框架使用继承体系,在框架的体系里所有的日志对象都是根日志(root logger)的后代。也就是说,如果有两个logger,分别被定义为a.b.c和a.b,那么我们说a.b是a.b.c的祖先。每一个logger都继承了祖先的属性 。这种缺省的继承方式也可以通过显式地设定标签的additivity属性为false而改变。 
Log4net框架定义了一个ILog接口,所有的logger类都必须实现这个接口。如果你想实现一个自定义的logger,你必须首先实现这个接口。

Log4net框架定义了一个叫做LogManager的类,用来管理所有的logger对象。它有一个GetLogger()静态方法,用我们提供的名字参数来检索已经存在的Logger对象。如果框架里不存在该Logger对象,它也会为我们创建一个Logger对象。代码如下所示:

log4net.ILog log = log4net.LogManager.GetLogger("logger-name");

通常来说,我们会以类(class)的类型(type)为参数来调用GetLogger(),以便跟踪我们正在进行日志记录的类。

3、Appender

一个好的日志框架应该能够产生多目的地的输出。比如说输出到控制台或保存到一个日志文件。log4net 能够很好的满足这些要求。它使用一个叫做Appender的组件来定义输出介质。正如名字所示,这些组件把它们附加到Logger日志组件上并将输出传递到输出流中。你可以把多个Appender组件附加到一个日志对象上。 Log4net框架提供了几个Appender组件。

关于log4net提供的Appender组件的完整列表可以在log4net框架的帮助手册中找到。有了这些现成的Appender组件,一般来说你没有必要再自己编写了。但是如果你愿意,可以从log4net.Appender.AppenderSkeleton类继承。

log4net的各种Appender配置示例

http://logging.apache.org/log4net/release/config-examples.html

输出方式主要包括:

  • AdoNetAppender:将日志记录到数据库中。可以采用SQL和存储过程两种方式
  • AspNetTraceAppender:能用ASP.NET中跟踪的方式查看记录的日志。
  • BufferingForwardingAppender:在输出到子Appenders之前先缓存日志事件。
  • ColoredConsoleAppender:在终端的窗口写下高亮度的日志事件。
  • ConsoleAppender:将日志输出到控制台。
  • EventLogAppender:将日志写到Windows操作系统的日志中去。
  • FileAppender:将日志写到文件中。
  • ForwardingAppender:用来为一个Appender指定一组约束。
  • MemoryAppender:将日志存到内存缓冲区。
  • NetSendAppender:将日志输出到Windows Messenger service,这些日志信息将在用户终端的对话框中显示。
  • OutputDebugStringAppender:配置该Appender以向OutputDebugString API写入日志。
  • RemotingAppender:通过.NET Remoting将日志写到远程接收端。
  • RollingFileAppender:将日志以回滚文件的形式写到文件中。
  • SmtpAppender:将日志写到邮件中。
  • SmtpPickupDirAppender:配置与SmtpAppender类似,但要把SmtpHost换为PickupDir。
  • TraceAppender:将日志写到.NET trace 系统。
  • UdpAppender:将日志connectionless UDP datagrams的形式送到远程宿主或以UdpClient的形式广播。

4、PatternLayout中的转换模式

  • %F/%file:输出语句所在的文件名
  • %U/%identity:用户名
  • %l/%location:调用者位置
  • %L/%line:输出语句所在的行号
  • %M/%method:方法
  • %C(class),%class,%type::类名
  • %w/%username:Windows Identity
  • %a/%appdomain:域
  • %t/%thread:当前语句所在的线程ID
  • %c(category), %logger::当前日志对象的名称
  • %p(priority),%level:日志的当前优先级别,即DEBUG、INFO、WARN…等
  • %m/%message:输出的日志消息,如ILog.Debug(…)输出的一条消息
  • %exception:异常
  • %d,%date:输出当前语句运行的时刻,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy-MM-dd HH:mm:ss },输出2015-03-10 14:53:28;也可以%d{ISO8601}输出2015-03-10 14:51:12,220, %d{DATE}输出‘10 Mar 2015 14:51:51,318’, %d{ABSOLUTE}输出14:54:07,943,%d{HH:mm:ss,fff}, %d{dd MM yyyy HH:mm:ss,fff},yyyy年份,MM月份,dd日期,HH小时小时24制,hh小时12小时制,mm分钟,ss秒,fff毫秒(f为秒的精确位数,几个f代表精确到小数点后几位)
  • %r/%timestamp:输出程序从运行到执行到当前语句时消耗的毫秒数
  • %X/%mdc:输出(mapped diagnostic context)mdc上下文内容
  • %x/%ndc: 输出(nested diagnostic context)ndc上下文内容
  • %p/%Proerties{user}:呈现指定属性
  • %n(newline):换行
  • %-数字:表示该项的最小长度,如果不够,则用空格填充 。%-10,表示最小长度为10,如果不够,则用空格右侧填充;%.10,表示最大长度为10;可以与%m等其他格式组合使用,示例%10m,%-10m,%10.10m,%-10.10m
  • %%:输出%

例如,转换模式为%r [%t]%-5p %c - %m%n 的 PatternLayout 将生成类似于以下内容的输出: 
176 [main] INFO org.foo.Bar - Located nearest gas station.

三、定义配置文件

当我们创建了上面的配置文件后,我们接下来需要把它和我们的应用联系起来。缺省的,每个独立的可执行程序集都会定义它自己的配置。

log4net框架使用 log4net.Config.XmlConfiguratorAttribute在程序集的级别上定义配置文件。

  • ConfigFile:指出了我们的配置文件的路径及文件名,包括扩展名。
  • ConfigFileExtension:如果我们对被编译程序的程序集使用了不同的文件扩展名,那么我们需要定义这个属性,缺省的,程序集的配置文件扩展名为”config”。
  • Watch (Boolean属性): log4net框架用这个属性来确定是否需要在运行时监视文件的改变。如果这个属性为true,那么FileSystemWatcher将会被用来监视文件的改变,重命名,删除等事件。

1、在Winfrom中,在AssemblyInfo.cs中添加如下代码:

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]//关联log4net.config文件
//或者
[assembly: log4net.Config.XmlConfigurator(ConfigFileExtension = "log4net", Watch = true)]//关键到xxx.exe.log4net或xxx.dll.log4net,并监测变化。

2、在asp.net中,在Global.asax文件中的Application_Start方法中增加:

log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo("log4net.config"));
//或者
log4net.Config.XmlConfigurator.ConfigureAndWatch(new FileInfo(Server.MapPath(@”Config.log4net.config”)))

四、调用log4net写日志

1、创建或获取日志对象

日志对象会使用在配置文件里定义的Logger的Name属性。如果某个日志对象没有事先在配置文件里定义,那么框架会根据继承结构获取祖先节点的属性,最终的,会从根root日志获取属性。如下所示:

Log4net.ILog log = Log4net.LogManager.GetLogger("MyLogger");
//或
Log4net.ILog log = Log4net.LogManager.GetLogger(typeof(_Default));
//或
Log4net.ILog log = Log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

2、输出日志信息

if (log.IsDebugEnabled)
    log.Debug("message");
if (log.IsInfoEnabled)
   log.Info("message); 

log.Logger.Repostory.Shutdown()//关闭日志

五、更改Appender设置

1、获取root的Appender

log4net.Repository.Hierarchy.Hierarchy h = (log4net.Repository.Hierarchy.Hierarchy)log4net.LogManager.GetRepository();
log4net.Appender.AppenderCollection ac = h.Root.Appenders;

2、获取指定Logger的Appender:不包括继承的Appender

log4net.ILog logger = log4net.LogManager.GetLogger(typeof(_Defaut));
log4net.Appender.AppenderCollection ac = ((log4net.Repository.Hierarchy.Logger)logger.Logger).Appenders;

3、更改Appender设置

for (int i = 0; i < ac.Count; i++)
{
    log4net.Appender.RollingFileAppender rfa = ac[i] as log4net.Appender.RollingFileAppender;
    if (rfa != null)
    {
        rfa.File = "xxx.log";//程序运行时动态的设定log日志的文件名
        rfa.Writer = new System.IO.StreamWriter(rfa.File, rfa.AppendToFile, rfa.Encoding);
    }
 }

六、自定义appender

日志保存于内存中,到一定阈值之后才将数据post到服务器,同时可配置服务端接受数据的地址

1、定义myMemAppender类

public class MyMemAppender : AppenderSkeleton
{
    private ArrayList eventQueue;

    public string RemoteAddress { get; set; }
    public int QueueSize { get; set; }

    public MyMemAppender() : base()
    {
        eventQueue = new ArrayList();
    }

    protected override void Append(log4net.Core.LoggingEvent loggingEvent)
    {
        lock (eventQueue.SyncRoot)
        {
            eventQueue.Add(loggingEvent);
            if (eventQueue.Count >= QueueSize)
            {
                lock (eventQueue.SyncRoot)
                {
                    SaveToServer();
                    eventQueue.Clear();
                }
            }
        }
    }

    private void SaveToServer()
    {
        lock (eventQueue.SyncRoot)
        {
            List logList = new List();
            foreach (log4net.Core.LoggingEvent evt in eventQueue)
            {
                try
                {
                    LogModel m = Newtonsoft.Json.JsonConvert.DeserializeObject(evt.RenderedMessage);//或者evt.MessageObject as LogModel
                    logList.Add(m);
                }
                catch (Exception ex)
                {
                    Console.Write(ex.ToString());
                    continue;
                }
            }
            //将logList序列化上传至remoteAddress
        }
    }

    virtual public LoggingEvent[] GetEvents()
    {
        lock (eventQueue.SyncRoot)
        {
            return (LoggingEvent[])eventQueue.ToArray(typeof(LoggingEvent));
        }
    }
}

2、注册Appender

(1)root根目录下追加

配置文件方式:

<?xml version="1.0" encoding="utf-8" ?>
<log4net debug="true">
<appender name="myMemAppender" type="LogSystem.Common.MyMemAppender">
    <param name="QueueSize" value="10"/>
    <param name="RemoteAddress" value="http://localhost/PostLogData.aspx"/>
</appender>
<root>
   <level value="ALL"/>
   <appender-ref ref="myMemAppender" />
</root>
</log4net>

代码方式:

MyMemAppender appender = new MyMemAppender();
appender.QueueSize = 5;
appender.RemoteAddress = "http://localhost:57427/PostLogData.aspx";
log4net.Config.BasicConfigurator.Configure(appender);
ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

(2)指定Logger名下追加Appender:

MyMemAppender appender = new MyMemAppender();
appender.Name = "MyMemAppender";
appender.QueueSize = 5;
appender.RemoteAddress = "http://localhost:57427/PostLogData.aspx";

Logger logger1 = (Logger)LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
logger1.Level = Level.Info;
IAppender appendered = logger1.GetAppender("MyMemAppender");
if (appendered != null) logger1.RemoveAppender("MyMemAppender");
logger1.AddAppender(appendered);
appender.ActivateOptions();

到此这篇关于C#使用日志组件log4net的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C# log4net 日志输出的实现示例

    目录 第一步:安装log4net 第二步:添加log4net.config配置文件 第三步:添加日志配置 第四步:AssemblyInfo.cs中配置 Watch = true 思路: 1.安装插件:安装log4net 2.使用配置:添加log4net.config配置文件 3.输出日志文件格式:添加日志配置 4.AssemblyInfo.cs中配置 第一步:安装log4net 第二步:添加log4net.config配置文件 新增log4net.config配置文件,内容如下,与Program

  • C#使用log4net记录日志

    一.Nuget安装log4net --> Install-Package log4net 二.在AssemblyInfo.cs文件中添加log4net.dll的参数. [assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", ConfigFileExtension = "config", Watch = true)] 三.右击项目→添加→新建项→xxx配置文件(web或者w

  • C# 使用Log4net添加日志记录的方法

    目录 一.Log4net 二.使用日志库 1. 添加库 2. 配置log4net 3. 使用log4net 4. 结果 一.Log4net 官方网站:https://logging.apache.org/log4net/. 下载二进制dll库: 包中提供了针对各个版本的dll库: 二.使用日志库 1. 添加库 复制对应的库文件到项目中: 2. 配置log4net 2.1. 创建配置文件 添加后修改该文件设置: 2.2. 修改配置文件 替换文件为以下内容,设置为日志文件输出: <?xml vers

  • C#使用log4net打日志

    首先打开vs,右击解决方案,点击管理解决方案的Nuget包管理 然后我们点击浏览,搜索log4net,进行安装 然后我们需要新建一个名为log4net.config的配置文件,在配置文件中,加入以下代码 <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> </config

  • C#中四步轻松使用log4net记录本地日志的方法

    在这里,记录我在项目中使用log4net记录本地日志的步骤.在不会之前感觉很难,很神秘,一旦会了之后其实没那么难.其实所有的事情都是一样的,下面我就分享一下我使用log4Net的经验. 第一步:首先从Visual Studio中的Nuget包管理中搜索下载 Log4Net dll文件 如下图: 选择安装的项目(哪个类库中需要记录日志就勾选上) 第二步:打开配置文件 WinFrom就是 App.config Web就是 web.config 将以下配置信息加入 <configSections>

  • C#实现Log4Net日志分类和自动维护实例

    本文实例讲述了C#实现Log4Net日志分类和自动维护的实现方法.分享给大家供大家参考.具体实现方法如下: 一.背景 在程序中,我们调试运行时信息,Log4Net是一个不错的解决方案.不知道是我用的不好,用到最后反而都不想看日志了.原因是因为我n个功能使用的默认的Logger来记录日志,这样以来,所有功能记录的信息都依赖同一个配置,于是所有的信息都在一个文件中,有时候查找起来,极其不方便. 我想,能不能按照功能分类呢?如果通过配置不同的logger,然后功能根据不同的LoggerName加载Il

  • C# log4net使用案例详解

    这边先介绍简单的使用:在控制台输出和写入文件 首先添加log4net的nuget包 然后在app.config中添加配置项==configSections只能有一个,且是configuration的首个节点 <?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="log4net" typ

  • C# 使用 log4net 日志组件的方法

    一. 什么是 log4net Apache log4net 库是帮助程序员将日志语句输出到各种输出目标的工具,它是从Java中的Log4j迁移过来的一个.Net版的开源日志框架.log4net 的一个显著特征是分层记录器的概念,使用这些记录器可以有选择地控制任意粒度输出日志语句.主要特征如下: 支持多个框架 输出到多个日志记录目标 分层日志记录体系结构 XML 配置 动态配置 日志记录上下文 久经考验的架构 模块化和可扩展设计 高性能和灵活性 二.C# 使用 log4net 添加Nuget 包,

  • C#控制台程序使用Log4net日志组件详解

    C#控制台程序使用Log4net日志组件,供大家参考,具体内容如下 1.Log4net一般都不陌生,但是在配置上不同类型的项目又不相同的地方比如C#控制台程序和C# MVCWeb项目,拿控制台项目为例 项目源码在文章底部 2.首先创建一个控制台程序,引入Log4net.dll --使用NuGet 3.进行一些简单的配置,在App.config文件中配置,如果大家没有App.config文件,可以通过在解决方案中,添加新建项→应用程序配置文件,进行添加. <?xml version="1.0

  • C# log4net日志库的用法小结

    目录 一.简述 二.下载log4net 三.添加log4net.dll引用 四.添加日志配置log.config 五.在AssemblyInfo.cs文件中添加log4net.dll相关参数 六.测试例子 6.1 测试代码 6.2 效果 七.附 7.1 更多日志配置 7.2 日志格式 7.3 日志配置 一.简述 记--log4net日志开源库的简单使用:控制日志文件大小,日志文件个数,滚动式覆盖,自由控制日志打印等级 例子打包: http://xiazai.jb51.net/202110/yua

  • C#使用log4net记录日志的方法步骤

    一.Nuget安装log4net --> Install-Package log4net 二.在AssemblyInfo.cs文件中添加log4net.dll的参数. [assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", ConfigFileExtension = "config", Watch = true 三.右击项目→添加→新建项→xxx配置文件(web或者win

随机推荐