热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Log4Net开源日志控件

利用log4net可以方便地将日志信息记录到文件、控制台、Windows事件日志和数据库,并且我们还可以记载要控制的日志级别,可以记载的日志级别包括&#

  利用log4net可以方便地将日志信息记录到文件、控制台、Windows事件日志和数据库,并且我们还可以记载要控制的日志级别,可以记载的日志级别包括:FATAL(致命错误)、ERROR(一般错误)、WARN(警告)、INFO(一般信息)、DEBUG(调试信息)。log4net有四种重要组建,分别为Logger(记录器),Repository(仓储、库),Appender(附着器)以及Layout(布局)。

  log4net.dll下载地址:http://logging.apache.org/log4net/download_log4net.cgi。

  选择下载文件log4net-1.2.13-bin-newkey.zip。解压选择对应的net版本找到log4net.dll。bin->net->4.0。

  项目添加log4net.dll引用。

  在项目中创建一个文件夹(Log4NetConfig)。把有关log4net的一些配置文件和类都放在这个文件夹里面。

  WEB网站为例,在项目Log4NetConfig文件夹中创建Log4Net.config配置文件。

"1.0" encoding="utf-8"?>

"log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>"Log4Net_INFO" type="log4net.Appender.RollingFileAppender">"C:/log4net/"/>"true"/>"Date"/>"INFO_yyyyMMdd".log"" />"false"/>"log4net.Appender.FileAppender+MinimalLock" />"log4net.Layout.PatternLayout">"[Header]
"/>
"[Footer]
"/>"记录时间:%date 线程ID:[%thread] 日志级别:%-5level 出错类:%logger property:[%property{NDC}] - 错误描述:%message%newline" />"Log4Net_ERROR" type="log4net.Appender.RollingFileAppender">"C:/log4net/"/>"true"/>"Date"/>"ERROR_yyyyMMdd".log"" />"false"/>"log4net.Appender.FileAppender+MinimalLock" />"log4net.Layout.PatternLayout">"[Header]
"/>
"[Footer]
"/>"记录时间:%date 线程ID:[%thread] 日志级别:%-5level 出错类:%logger property:[%property{NDC}] - 错误描述:%message%newline" />"DEBUG"/>ref ref="Log4Net_ERROR" />"INFO"/>ref ref="Log4Net_INFO" />
Log4Net.config

  配置文件写完后我们再来写一个Helper类。同样在项目中创建一个名为LogHelper.cs的类文件。

  

using log4net;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;//指定log4net使用的config文件来读取配置信息
[assembly: log4net.Config.XmlConfigurator(ConfigFile = @"LogConfig\Log4Net.config", Watch = true)]
namespace Project.Log4.Net.LogConfig
{
///

/// 日志帮助类/// public class LogHelper{private static readonly ConcurrentDictionary _loggers = new ConcurrentDictionary();/// /// 获取记录器/// /// /// private static ILog GetLogger(Type source){if (_loggers.ContainsKey(source)){return _loggers[source];}else{ILog logger = LogManager.GetLogger(source);_loggers.TryAdd(source, logger);return logger;}}/* Log a message object *//// /// 调试信息/// /// /// public static void Debug(object source, string message){Debug(source.GetType(), message);}/// /// 调试信息/// /// /// /// public static void Debug(object source, string message, params object[] ps){Debug(source.GetType(), string.Format(message, ps));}/// /// 调试信息/// /// /// public static void Debug(Type source, string message){ILog logger = GetLogger(source);if (logger.IsDebugEnabled)logger.Debug(message);}/// /// 关键信息/// /// /// public static void Info(object source, object message){Info(source.GetType(), message);}/// /// 关键信息/// /// /// public static void Info(Type source, object message){ILog logger = GetLogger(source);if (logger.IsInfoEnabled)logger.Info(message);}/// /// 警告信息/// /// /// public static void Warn(object source, object message){Warn(source.GetType(), message);}/// /// 警告信息/// /// /// public static void Warn(Type source, object message){ILog logger = GetLogger(source);if (logger.IsWarnEnabled)logger.Warn(message);}/// /// 错误信息/// /// /// public static void Error(object source, object message){Error(source.GetType(), message);}/// /// 错误信息/// /// /// public static void Error(Type source, object message){ILog logger = GetLogger(source);if (logger.IsErrorEnabled)logger.Error(message);}/// /// 失败信息/// /// /// public static void Fatal(object source, object message){Fatal(source.GetType(), message);}/// /// 失败信息/// /// /// public static void Fatal(Type source, object message){ILog logger = GetLogger(source);if (logger.IsFatalEnabled)logger.Fatal(message);}/* Log a message object and exception *//// /// 调试信息/// /// /// /// public static void Debug(object source, object message, Exception exception){Debug(source.GetType(), message, exception);}/// /// 调试信息/// /// /// /// public static void Debug(Type source, object message, Exception exception){GetLogger(source).Debug(message, exception);}/// /// 关键信息/// /// /// /// public static void Info(object source, object message, Exception exception){Info(source.GetType(), message, exception);}/// /// 关键信息/// /// /// /// public static void Info(Type source, object message, Exception exception){GetLogger(source).Info(message, exception);}/// /// 警告信息/// /// /// /// public static void Warn(object source, object message, Exception exception){Warn(source.GetType(), message, exception);}/// /// 警告信息/// /// /// /// public static void Warn(Type source, object message, Exception exception){GetLogger(source).Warn(message, exception);}/// /// 错误信息/// /// /// /// public static void Error(object source, object message, Exception exception){Error(source.GetType(), message, exception);}/// /// 错误信息/// /// /// /// public static void Error(Type source, object message, Exception exception){GetLogger(source).Error(message, exception);}/// /// 失败信息/// /// /// /// public static void Fatal(object source, object message, Exception exception){Fatal(source.GetType(), message, exception);}/// /// 失败信息/// /// /// /// public static void Fatal(Type source, object message, Exception exception){GetLogger(source).Fatal(message, exception);}}}
LogHelper

  配置和Helper类都有了..现在来看看调用方法。

  

LogHelper.Debug(this, "Debug");
LogHelper.Error(
this, "Error");
LogHelper.Fatal(
this, "Fatal");
LogHelper.Info(
this, "Info");
LogHelper.Warn(
this, "Warn");

  

日志生成格式[每天一个文件]:
参数说明

  

Log4Net.config是配置日志输出参数文件。在这个文件中可以到看很多配置节点,大体可以分为二个大 类......。我们来看看这些节点都是啥意思。

1:..:申明自定义节点log4net解析的类名和程序集名(log4net.dll)。

2:..:使用log4net的配置信息都在这里设置。来重点看看都有那些设置信息,这个大节点整体也可以分为二类。

2.1:定义输出信息设置节点

2.2:定义日志的输出媒介

配置的总体结构就是这样,下面来看一些详细内容。

 

appender:决定日志输出的方式(可设置多个节点,如对INFO,ERROR等设置不同的输出方式)。

主要包括已下几种:

1 AnsiColorTerminalAppender:在ANSI 窗口终端写下高亮度的日志事件。
2 AspNetTraceAppender:能用asp.net中Trace的方式查看记录的日志。
3 BufferingForwardingAppender:在输出到子Appenders之前先缓存日志事件。
4 ConsoleAppender:将日志输出到控制台。
5 EventLogAppender:将日志写到Windows Event Log.
6 FileAppender:将日志写到文件中。
7 LocalSyslogAppender:将日志写到local syslog service (仅用于UNIX环境下).
8 MemoryAppender:将日志存到内存缓冲区。
9 NetSendAppender:将日志输出到Windows Messenger service.这些日志信息将在用户终端的对话框中显示。
10 RemoteSyslogAppender:通过UDP网络协议将日志写到Remote syslog service。
11 RemotingAppender:通过.NET Remoting将日志写到远程接收端。
12 RollingFileAppender:将日志以回滚文件的形式写到文件中。(实例代码中使用的是此类型)
13 SmtpAppender:将日志写到邮件中。
14 TraceAppender:将日志写到.NET trace 系统。
15 UdpAppender:将日志connectionless UDP datagrams的形式送到远程宿主或以UdpClient的形式广播。

从上面提供的方式中可以看出能输出文件、控制台、Windows事件日志和数据库。这个可根据实际情况选择。

"Log4Net_INFO" type="log4net.Appender.RollingFileAppender">
...

这里配置的name(“Log4Net_INFO”)会在定义日志的输出媒介中使用到。name可任意设置。

在appender 节点中还会配置一些文件存放的地址,日志个数等信息。这些在实例代码中都在体现,这里不做说明。我们在来看看日志最后输出呈现的布局设置信息。

"log4net.Layout.PatternLayout">"[Header]"/>

"[Footer]"/>"%d [%t] %-5p %c [%x] - %m%n" />

 这里配置的信息最终是日志打印出来的样式。我们可以看到这里可以设置内容头Header和尾Footer。正文ConversionPattern。在正文中有出现有 %d  [%t]这些都是啥意思了表示什么。这里有一个对照表可提供参考:

%m(message):输出的日志消息,如ILog.Debug(…)输出的一条消息
%n(new line):换行
%d(datetime):输出当前语句运行的时刻
%r(run time):输出程序从运行到执行到当前语句时消耗的毫秒数
%t(thread id):当前语句所在的线程ID
%p(priority): 日志的当前优先级别,即DEBUG、INFO、WARN…等
%c(class):当前日志对象的名称,例如:
%L:输出语句所在的行号
%F:输出语句所在的文件名
%-数字:表示该项的最小长度,如果不够,则用空格填充

配置的基本也就这些。下就是root的配置说明 。

root:

对设置输出的方式进行指定。


  
  
  

  
  
  

控制级别,由低到高: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF
比如定义级别为INFO,则INFO级别向下的级别,比如DEBUG日志将不会被记录
如果没有定义LEVEL的值,则缺省为DEBUG

 

"ErrorAppender" type="log4net.Appender.RollingFileAppender"> "File" value="Log\\LogError\\" /> "AppendToFile" value="true" />"MaxSizeRollBackups" value="100" />"MaxFileSize" value="10MB" />"StaticLogFileName" value="false" />"DatePattern" value="yyyyMMdd".htm"" />"RollingStyle" value="Date" />"log4net.Layout.PatternLayout">"ConversionPattern" value="


%n异常时间:%d [%t]
%n异常级别:%-5p
%n异 常 类:%c [%x]
%n%m
%n
" />

 

"LogFileAppender" type="log4net.Appender.FileAppender">"D:\123.txt" />"true" />"Date" />"yyyyMMdd-HH:mm:ss" />"Size" />"-1" />"1GB" />"log4net.Layout.PatternLayout">

"by Mr.Jun" />"记录时间:%date 线程ID:[%thread] 日志级别:%-5level 出错类:%logger property:[%property{NDC}] - 错误描述:%message%newline" />ref ref="LogFileAppender" />

"logger">"ALL" />ref ref&#61;"LogSmtpAppender" />ref ref&#61;"LogFileAppender" />"LogFileAppender" type&#61;"log4net.Appender.FileAppender">"D:\123.txt" />"true" />"Date" />"yyyyMMdd-HH:mm:ss" />"log4net.Layout.PatternLayout">"记录时间&#xff1a;%date 线程ID:[%thread] 日志级别&#xff1a;%-5level 出错类&#xff1a;%logger property:[%property{NDC}] - 错误描述&#xff1a;%message%newline" />"LogSmtpAppender" type&#61;"log4net.Appender.SmtpAppender">"Basic" />"xxx&#64;qq.com" /><from value&#61;"xxx&#64;163.com" />"xxx&#64;163.com" />"xxx" />"XXX应用错误日志消息" />"smtp.163.com" />"2048" />"true" />"log4net.Core.LevelEvaluator">"ERROR"/>"log4net.Layout.PatternLayout">"%property{log4net:HostName} :: %level :: %message %newlineLogger: %logger%newlineThread: %thread%newlineDate: %date%newlineNDC: %property{NDC}%newline%newline" />

 


转:https://www.cnblogs.com/wangjp/p/4826536.html



推荐阅读
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 如何去除Win7快捷方式的箭头
    本文介绍了如何去除Win7快捷方式的箭头的方法,通过生成一个透明的ico图标并将其命名为Empty.ico,将图标复制到windows目录下,并导入注册表,即可去除箭头。这样做可以改善默认快捷方式的外观,提升桌面整洁度。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • 本文讨论了如何使用Web.Config进行自定义配置节的配置转换。作者提到,他将msbuild设置为详细模式,但转换却忽略了带有替换转换的自定义部分的存在。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
author-avatar
daniel
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有