我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C#如何使用日志组件log4net

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C#如何使用日志组件log4net

本篇内容介绍了“C#如何使用日志组件log4net”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

一、概述

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&hellip;等

  • %m/%message:输出的日志消息,如ILog.Debug(&hellip;)输出的一条消息

  • %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}输出&lsquo;10 Mar 2015 14:51:51,318&rsquo;, %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”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C#如何使用日志组件log4net

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C#如何使用日志组件log4net

本篇内容介绍了“C#如何使用日志组件log4net”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、概述log4net库是Apache lo
2023-07-01

.NET6在WebApi中如何使用日志组件log4net

这篇文章主要介绍.NET6在WebApi中如何使用日志组件log4net,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1、安装依赖Microsoft.Extensions.Logging.Log4Net.AspNet
2023-06-22

开源日志记录组件Log4Net怎么用

这篇文章主要介绍了开源日志记录组件Log4Net怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。log4net是.Net下一个非常优秀的开源日志记录组件。log4net记
2023-06-03

ASP.NET Core如何使用Log4net实现日志记录功能

这篇文章主要介绍“ASP.NET Core如何使用Log4net实现日志记录功能”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“ASP.NET Core如何使用Log4net实现日志记录功能”文章能帮
2023-06-29

C++日志库log4cplus如何使用

本篇内容介绍了“C++日志库log4cplus如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!编译&&安装下载完成在ubuntn中解压
2023-07-05

C# 中如何使用TreeView组件

今天就跟大家聊聊有关C# 中如何使用TreeView组件,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1.展开所有节点:要展开C# TreeView组件中的所有节点,首先就要把选定的
2023-06-17

C#中COM组件如何使用

C#中COM组件如何使用,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一.本文程序设计和运行的软件环境1 微软公司视窗2000服务器版2 .Net FrameWork SDK
2023-06-17

C#中TreeView组件如何使用

本篇文章为大家展示了C#中TreeView组件如何使用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。C# TreeView组件是由多个类来定义的,C# TreeView组件是由命名空间"System
2023-06-17

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录