一、Log4Net简介
Log4Net是用来记录日志的,可以将程序运行过程中的信息输出到一些地方(文件、数据库、EventLog等)
日志就是程序的黑匣子,可以通过日志查看系统的运行过程,从而发现系统的问题。
日志的作用:将运行过程的步骤、成功失败记录下来,将关键性的数据记录下来分析系统问题所在。
对于网站来讲,不能把异常信息显示给用户,异常信息只能记录到日志,出了问题把日志文件发给开发人员,就能知道问题所在。
二、配置Log4Net环境
(1)新建一个WebApplication
(2)添加对log4net.dll的引用(bin\net\2.0\release 不能引用debug版本)(把相应的dll文件拷贝到项目中的lib文件夹下。)
(3)在Web.Config (或App.Config)添加配置,见备注
(4)初始化:在程序最开始加入log4net.Config.XmlConfigurator.Configure();不要加到页面的Load
在Global.asax.cs的Application_Start(网站应用程序第一次启动时执行此方法,以后都不再执行)----------------中写入以上这段代码
这段代码的作用是:当网站应用程序第一次启动,把放在配置文件中的log4Net配置信息读取出来,这样以来,当网站内部出现错误时,会根据配置信息向指定文件中写入错误信息。
protected void Application_Start(object sender, EventArgs e)
{
log4net.Config.XmlConfigurator.Configure();
}
(5)在要打印日志的地方LogManager.GetLogger(typeof(Program)).Debug(“信息”); 。通过LogManager.GetLogger传递要记录的日志类类名获得这个类的ILog(这样在日志文件中就能看到这条日志是哪个类输出的了),然后调用Debug方法输出消息。因为一个类内部不止一个地方要打印日志,所以一般把ILog声明为一个static字段。
Private static ILog logger=LogManager.GetLogger(typeof(Test))
输出错误信息用ILog.Error方法,第二个参数可以传递Exception对象。log.Error("***错误"+ex),log.Error("***错误",ex)
测试代码:
(5)测试以上(5)
新建一页面Log4Net_Demo.aspx,并修改其后台代码
第一种方式:自己写入日志
protected void Page_Load(object sender,EventArgs e)
{
LogManager.GetLogger(typeof(Log4Net_Demo)).Debug("日志记录");
}
此时运行网站后,查看Log4Net_Demo.aspx之后,打开网站目录,其中多了一个文件test.txt打开后出现:2013-10-27 22:19:01,577 [15] DEBUG Log4NetApp.Log4Net_Demo - 日志记录,此时可以确定Log4Net已成功配置。
第二种方式:使用Try----Catch
protected void Page_Load(object sender,EventArgs e)
{
try
{
int a=10;
int b=0;
int c=a/b;
}
catch(Exception ex)
{
LogManager.GetLogger(typeof(Log4Net_Demo)).Debug(ex.Message);
}
}
此时运行网站后,查看Log4Net_Demo.aspx之后,打开网站目录,其中多了一个文件test.txt打开后出现:2013-10-27 22:54:09,766 [15] DEBUG Log4NetApp.Log4Net_Demo - 尝试除以零。
第三种方式---因为一个网站中可能有多处需要写入错误日志
private static ILog logger=LogManager.GetLogger(typeof(Log4Net_Demo));
protected void Page_Load(object sender,EventArgs e)
{
try
{
int a=10;
int b=0;
int c=a/b;
}
catch(Exception ex)
{
logger.Debug(ex.Message);
}
}
第四种方式--如果一个网站不想用Log4Net写日志记录了想换一种插件,此时不想一个网页一个网页去改,就要考虑把logger放到WebCommon中
public class WebCommon
{
public static void Logger(Type type, string message)
{
LogManager.GetLogger(type).Debug(message);
}
}
修改Log4Net_Demo.aspx.cs中的代码
protected void Page_Load(object sender, EventArgs e)
{
try
{
int a = 1;
int b = 0;
int c = a / b
}
catch (Exception ex)
{
WebCommon.Logger(typeof(Log4Net_Demo), ex.Message);
}
}
第五种方式----------总不能一直加try--catch吧-------网站中的异常信息要去Global.asax中的Application_Error中去捕获
Application_Error-----捕获网站应用程序在运行过程中出现的错误信息
protected void Application_Error(object sender, EventArgs e)
{
Exception ex=HttpContext.Current.Server.GetLastError();
ILog logger = LogManager.GetLogger(typeof(Global));
logger.Debug(ex); //这里最好不要写ex.Message,因为不准
}
修改Log4Net_Demo.aspx.cs中的代码
protected void Page_Load(object sender, EventArgs e)
{
int a = 1;
int b = 0;
int c = a / b
}
Log4Net基本配置之保存日志到文本文件(学习参考)
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<log4net>
<!-- Define some output appenders -->
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="test.txt"/>
<appendToFile value="true"/>
<maxSizeRollBackups value="10"/>
<maximumFileSize value="1024KB"/>
<rollingStyle value="Size"/>
<staticLogFileName value="true"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline"/>
</layout>
</appender>
<root>
<level value="DEBUG"/>
<appender-ref ref="RollingLogFileAppender"/>
</root>
</log4net>
</configuration>
这里要注意的是configSections必须是configuration下的第一个元素,否则会出错
配置文件解释
Appender:可以将日志输出到不同的地方,
不同的输出目标对应不同的Appender:RollingFileAppender(滚动文件)、AdoNetAppender(数据库)、SmtpAppender (邮件)等;
这里用的是滚动文件;
file是向哪个文件中写入日志记录;
appendToFile用来指定是不是向日志文件中追加记录(一般都是追加);
maximumFileSize-----------最多可以向这个文件中写入多大数据这里是1024KB(1M);
maxSizeRollBackups------如果这个文件中的记录超过1M就是滚动了,当test.txt中的日志达到1M它就会去创建一个文本文件用来存放test.txt中的内容,并将test.txt的内容进行清空,再过一段时间后test.txt中的日志文件又满了它就会再创建一个文本文件去存放test.txt中的内容,并将test.txt,最多可以10个test.txt的备份;
layout--------------------------日志文件中日志的格式;
level(级别):标识这条日志信息的重要级别。None>Fatal>ERROR>WARN>DEBUG>INFO>ALL,
设定一个Level,那么低于这个Level的日志是不会被写到Appender中的。
Log4Net还可以设定多个Appender,可以实现同时将日志记录到文件、数据、发送邮件等;
可以设定不同的Appender的不同的Level,可以实现普通级别都记录到文件,Error以上级别发送邮件;
可以实现对不同的类设定不同的Appender;还可以自定义Appender,这样可以自己实现将Error信息发短信等。
(*)除了Log4Net,还有Enterprise Library中的Logging Application Block、Apache的CommonLog 以及NLog等,都差不多。
Log4Net专业配置之保存日志到文本文件(项目中用的)
<log4net>
<!-- OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL -->
<!-- Set root logger level to ERROR and its appenders -->
<root>
<level value="ALL"/>
<appender-ref ref="SysAppender"/>
</root>
<!-- Print only messages of level DEBUG or above in the packages -->
<logger name="WebLogger">
<level value="DEBUG"/>
</logger>
<appender name="SysAppender" type="log4net.Appender.RollingFileAppender,log4net" >
<param name="File" value="App_Data/" />
<param name="AppendToFile" value="true" />
<param name="RollingStyle" value="Date" />
<param name="DatePattern" value=""Logs_"yyyyMMdd".txt"" />
<param name="StaticLogFileName" value="false" />
<layout type="log4net.Layout.PatternLayout,log4net">
<param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" />
<param name="Header" value=" ----------------------header-------------------------- " />
<param name="Footer" value=" ----------------------footer-------------------------- " />
</layout>
</appender>
<appender name="consoleApp" type="log4net.Appender.ConsoleAppender,log4net">
<layout type="log4net.Layout.PatternLayout,log4net">
<param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" />
</layout>
</appender>
</log4net>
三、配置错误页
当页面发生错误的时候,asp.net会将错误展示出来(SqlConnection错误就能暴露连接字符串),这样一来不好看,二来会泄露网站的内部信息,给网站带来安全隐患因此要定制错误页
配置Web.Config
<system.web>
<compilation debug="true" targetFramework="4.0" />
<customErrors mode="On" defaultRedirect="MyErrorPage.html">
<error statusCode="500" redirect="SerrorError.html"/>
<error statusCode="404" redirect="FileNotFind.html"/>
<error statusCode="403" redirect="NoAccess.html"/>
</customErrors>
</system.web>
mode三个可选值:On总是显示定制的错误页面;
Off不显示定制的错误页面,直接显示调用堆栈等异常信息;
remoteonly:对于本机的访问显示调用堆栈等异常信息,对于外部用户显示定制的错误页面。
这样发生错误的话,管理员可以在服务器的浏览器上看到详细的错误信息,普通用户看不到。