Log4net相关说明
几乎所有的大型应用都会有自己的用于跟踪调试的API。因为一旦程序被部署以后,就不太可能再利用专门的调试工具了。然而一个管理员可能需要有一套强大的日志系统来诊断和修复配置上的问题。
经验表明,日志记录往往是软件开发周期中的重要组成部分。它具有以下几个优点:它可以提供应用程序运行时的精确环境,可供开发人员尽快找到应用程序中的Bug;一旦在程序中加入了Log 输出代码,程序运行过程中就能生成并输出日志信息而无需人工干预。另外,日志信息可以输出到不同的地方(控制台,文件等)以备以后研究之用。
Log4net就是为这样一个目的设计的,用于.NET开发环境的日志记录包。
Log4net配置步骤
1. 在自己的程序中引用log4net.dll文件 下载地址:http://logging.apache.org/log4net/download_log4net.cgi
注意版本要选择正确了
2. 在项目中新建Log4Net.config配置文件,将原有代码删除,放上官方配置代码:
官方的文档说明:http://logging.apache.org/log4net/release/config-examples.html 里面说的配置很详尽,比如 SQL数据库怎么配置,Oracle的怎么配置,怎么配置发送邮件的等等
下面的代码给个范例,附加说明:
<?xml version="1.0" encoding="utf-8"?> <!-- 注意: 除了手动编辑此文件以外,您还可以使用 Web 管理工具来配置应用程序的设置。可以使用 Visual Studio 中的 “网站”->“Asp.Net 配置”选项。 设置和注释的完整列表在 machine.config.comments 中,该文件通常位于 /Windows/Microsoft.Net/Framework/v2.x/Config 中 --> <configuration> <configSections> <section name="log4net" type="System.Configuration.IgnoreSectionHandler"/> </configSections> <log4net> <logger name="loggerAX"> <!--control log level: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF--> <!--如果没有定义LEVEL的值,则缺省为DEBUG--> <level value="ALL" /> <appender-ref ref="SmtpAppenderAX"></appender-ref> <appender-ref ref="FileAppenderAX"></appender-ref> </logger> <appender name="SmtpAppenderAX" type="log4net.Appender.SmtpAppender"> <!--这个丢弃可能邮件发送不了--> <authentication value="Basic" /> <to value="to@domain.com"></to> <from value="from@domain.com" /> <subject value="AX'Test Log Message" /> <smtpHost value="smtp.163.com" /> <username value="发送邮箱的用户名" /> <password value="密码" /> <bufferSize value="2048" /> <!--超长部分是否丢弃--> <lossy value="false" /> <!--输出级别在WARN和OFF之间的日志--> <filter type="log4net.Filter.LevelRangeFilter"> <param name="LevelMin" value="WARN" /> <param name="LevelMax" value="OFF" /> </filter> <!--日志格式布局--> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%newline%date [%thread] %-5level %logger [%property{NDC}] : %newline%message%newline" /> </layout> </appender> <appender name="FileAppenderAX" type="log4net.Appender.RollingFileAppender"> <!--绝对路径--> <file value="D://log.txt"></file> <!--相对路径,在项目的根目录下--> <!--以最后一个路径为准,所以上面的绝对路径下不会写日志--> <file value="./Log/server.log.txt"></file> <!--防止多线程时不能写Log,官方说线程非安全--> <!--实际使用时,本地测试正常,部署后有不能写日志的情况--> <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> <appendToFile value="true" /> <!--可以为:Once|Size|Date|Composite--> <!--Composite为Size和Date的组合--> <rollingStyle value="composite" /> <!--日志最大个数,都是最新的--> <!--rollingStyle节点为Date时,该节点不起作用--> <!--rollingStyle节点为Size时,只能有value个日志--> <!--rollingStyle节点为Composite时,每天有value个日志--> <maxSizeRollBackups value="10" /> <!--当备份文件时,为文件名加的后缀--> <!--后缀为*.txt时,例:AX.txt_2008-07-24.PxP 应该是程序上的一个bug--> <!--后缀为*.TXT时,例:AX.txt_2008-07-25.TXT--> <datePattern value="yyyy-MM-dd.TXT" /> <!--可用的单位:KB|MB|GB--> <!--不要使用小数,否则会一直写入当前日志--> <maximumFileSize value="1KB" /> <!--置为true,当前最新日志文件名永远为file节中的名字--> <staticLogFileName value="true" /> <!--输出级别在INFO和ERROR之间的日志--> <filter type="log4net.Filter.LevelRangeFilter"> <param name="LevelMin" value="INFO" /> <param name="LevelMax" value="ERROR" /> </filter> <!--必须结合起来用,第一个只过滤出WARN,第二个拒绝其它其它日志输出--> <filter type="log4net.Filter.LevelMatchFilter"> <param name="LevelToMatch" value="WARN" /> </filter> <filter type="log4net.Filter.DenyAllFilter" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger [%ndc] - %message%newline" /> </layout> </appender> </log4net> </configuration>
<!--==================layout节点的配置说明======================-->
%m(message):输出的日志消息,如ILog.Debug(…)输出的一条消息
%n(new line):换 行
%d(datetime):输出当前语句运行的时刻
%r(run time):输出程序从运行到执行到当前语句时消耗的毫秒数
%t(thread id):当前语句所在的线程ID
%p(priority): 日志的当前优先级别,即DEBUG、INFO、WARN…等
%c(class):当前日志对象的名称,例如:
模式字符串为:%-10c -%m%n
代码为:
ILog log=LogManager.GetLogger(“Exam.Log”);
log.Debug(“Hello”);
则输出为下面的形式:
Exam.Log - Hello
%L:输出语句所在的行 号
%F:输出语句所在的文件名
%-数字:表示该项的最小长度,如果不够,则用空格填充
例如,转换模式为%r [%t]%-5p %c - %m%n 的 PatternLayout 将生成类似于以下内容的输出:
176 [main] INFO org.foo.Bar - Located nearest gas station.
<!--=========================================================-->
3. 新建一个写log的类,我的在common的类库下新建的
并在通用类层(Common)的assemblyinfo.cs 里加上
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
表示引用该配置文件
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Common { public class Log { private static log4net.ILog log = log4net.LogManager.GetLogger("loggerAX"); public static void Debug(string message) { if (log.IsDebugEnabled) { log.Debug(message); } } public static void Debug(System.Exception ex1) { if (log.IsDebugEnabled) { log.Debug(ex1.Message.ToString() + "/r/n" + ex1.Source.ToString() + "/r/n" + ex1.TargetSite.ToString() + "/r/n" + ex1.StackTrace.ToString()); } } public static void Error(string message) { if (log.IsErrorEnabled) { log.Error(message); } } public static void Fatal(string message) { if (log.IsFatalEnabled) { log.Fatal(message); } } public static void Info(string message) { if (log.IsInfoEnabled) { log.Info(message); } } public static void Warn(string message) { if (log.IsWarnEnabled) { log.Warn(message); } } } }
Log4net的使用
新建一个default.aspx文件,在page_load中写:
protected void Page_Load(object sender, EventArgs e) { Common.Log.Debug("haha,wo shi ceshi de wa "); Common.Log.Error("我是error"); Common.Log.Info("我是info'"); Common.Log.Warn("我是warn"); try { Log.Info("这是hansong的LOG INFO测试!"); Log.Debug("这是hansong的LOG DEBUG测试!"); throw new Exception("这是hansong的LOG ERROR测试!"); } catch (Exception er) { Log.Error("错误日志"+ er); } }
浏览页面,我们会发现项目下面会自动新建一个log文件夹,且文件夹里面有一个log.txt档,里面放的就是日志文件了
server.log.txt里面的内容:
Log4net写日志原则
1.在catch后,把异常写入日志.
2.在调用第三方控件的开始和结束处.
3.在连接数据库的开始结束处.
4.除非必要,不要在循环体中加入日志,否则一旦出问题可能导致日志暴增.
5.在自己认为很重要的逻辑处写入日志.
参考文档:
http://blog.youkuaiyun.com/huwei2003/article/details/6060201
http://www.cnblogs.com/dragon/archive/2005/03/24/124254.html