C#使用日志组件log4net
作者:springsnow 发布时间:2022-11-05 03:48:15
一、概述
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();
来源:https://www.cnblogs.com/springsnow/p/12921997.html
猜你喜欢
- 使用Android AudioRecord 录制PCM文件,android SDK保证在所有设备上都支持的采样频率只有44100HZ,所以如
- 需求:request的content-type为applciation/json,进入controller之前需要把body中的参数取出来做
- 一、项目简述本系统功能包括: 系统管理,招生计划,学生管理,录取结果,自动分配,调剂管理等等。二、项目运行环境配置:Jdk1.8 + Tom
- 简介MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)
- 程序目的从java字节码层理解,为何i = i++后,结果是+1之前的数值。而i=++i后,结果是+1之后的值。关键指令iload_<
- 1. 源码阅读环境搭建ide:IntelliJ IDEA 2020.1包管理:gradleeureka版本:1.10.11Spring Cl
- 本文实例讲述了C#设置页面单位和缩放的方法。分享给大家供大家参考。具体如下:using System;using System.Collec
- 一、树形结构树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树
- 一、TCP/IP简介TCP/IP协议族是互联网使用的协议,也可以用在独立的专用网络中。TCP/IP协议族包括了IP协议、TCP协议和UDP协
- 运行在TCP之上常见的网络应用协议有比如HTTP、FTP、SMTP、POP3、IMAP。TCP是TCP/IP体系中最重要的传输协议,它提供全
- 一:form在前台以post方式提交数据: 浏览器将数据(假设为“中国”)发送给服务器的时
- 数字可以标志货币、百分比、积分和电话号码等,就货币而言,在不同的国家会以不同的格式来定义,本实例将接收用户输入的数字,然后在控制台中输出其货
- spinner组件有点类型于HTML中的下拉框<Select></select>的样子,让用户每次从下拉框中选取一个
- 本文实例讲述了Android编程实现将应用强制装到手机内存的方法。分享给大家供大家参考,具体如下:在Froyo(android 2.2,AP
- 对谷歌地图操作使用的是WebBrowser控件,通过对javascript的操作来实现对谷歌地图的各种操作,所以首先要创建一个html文件,
- 之前看过一句话,说的特别好。有人问阅读源码有什么用?学习别人实现某个功能的设计思路,提高自己的编程水平。是的,大家都实现一个功能,不同的人有
- 目录一、二叉树的顺序存储1.堆的存储方式2.下标关系二、堆(heap)1.概念2.大/小 根堆2.1小根堆2.2大根堆3.建堆操作3.1向下
- 事务介绍一个事务要么同时成功,要么同时失败特性Atomic原子性 事务是由一个或多个活动组成的一个工作单元。原子性确保事务中的所有操作全部发
- 一:简介方法引用分为三种,方法引用通过一对双冒号:: 来表示,方法引用是一种函数式接口的另一种书写方式静态方法引用,通过类名::静态方法名,
- 作为开发者我们需要经常站在用户角度考虑问题,比如在应用商城下载软件时,当用户点击下载按钮,则会有下载进度提示页面出现,现在我们通过线程休眠的