由Apache领衔开发的跨多平台的log4工具在服务器端异常捕捉和日志管理工具,log4net。
官网下载后打开src内的项目文件,编译后取得obj内的dll文件,加载到自己的项目文件夹,引用。
在根目录,添加配置文件,命名log4net.config或者其他的,config内容如下:
<?xml version="1.0" encoding="utf-8"?>
<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">
<to value="To@domain.com"></to>
<from value="From@domain.com" />
<subject value="AX'Test Log Message" />
<smtpHost value="mail.eshinfo.com" />
<username value="eshinfo" />
<password value="eshinfo" />
<bufferSize value="2048" />
<!--超长部分是否丢弃-->
<lossy value="false" />
<!--输出级别在WARN和OFF之间的日志-->
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="ALL" />
<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://AX.txt"></file>
<!--相对路径,在项目的根目录下-->
<!--以最后一个路径为准,所以上面的绝对路径下不会写日志-->
<file value="./Log/AX.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>
几乎可以直接复制使用,然后在同级目录创建Log文件夹(因为使用的相对路径),然后在aspx文件的后台代码中加上如下代码:
//下面两句应该放在网站刚刚启动时加载,并放在一个静态方法里方便调用
log4net.Config.XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo(Server.MapPath
("Log4Net.config")));
ILog logAX = LogManager.GetLogger("Admin");
//写日志
logAX.Error("Error AX");
logAX.Info("Info AX");
通过静态调用就可以写入异常或其他日志。
基于封装的角度,我们将配置文件简化,并通过类代码操作log4net库,修改log4net.config文件如下:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<!--Log设定-->
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net-net-1.0" />
</configSections>
<log4net>
<!--日志记录器logger,可以有多个-->
<logger name="fileLog">
<level value="ALL" />
<appender-ref ref="ConsoleAppender" />
<!--<appender-ref ref="LogFileAppender" />-->
<appender-ref ref="RollingLogFileAppender" />
</logger>
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n"/>
</layout>
</appender>
<!--<appender name="LogFileAppender" type="log4net.Appender.FileAppender" >
<param name="File" value="logRaifuRFID.txt" />
<param name="AppendToFile" value="true" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" />
</layout>
</appender>-->
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<param name="File" value="./Log/"/>
<param name="AppendToFile" value="true"/>
<param name="MaxSizeRollBackups" value="10"/>
<param name="StaticLogFileName" value="false"/>
<param name="DatePattern" value="yyyyMMdd".log""/>
<param name="RollingStyle" value="Date"/>
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n%n"/>
</layout>
</appender>
</log4net>
</configuration>
通过对比差异可以发现,新的config文件可以在Log文件夹下每天以日期为名生成.log文件。
封装操作项目Common,新建Mylog类库,代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace Common
{
public class MyLog
{
private static log4net.ILog log = log4net.LogManager.GetLogger("fileLog");
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);
}
}
}
}
这里要注意,需要在Common的AssemblyInfo.cs文件里添加一句:[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
指定程序集,并将先前的log4net.dll文件引用到Common项目,然后在web项目里引用Common,如果这样子封装,那么log4net.config文件应该放在web项目的根目录。
然后在aspx的后台代码里添加测试代码:
try
{
Convert.ToInt32("没想好");
}
catch (Exception ex1)
{
Common.MyLog.Debug(ex1);
}
在我们的Debug方法里,参数可以是Exception类型的异常,也可以是string字符串。
封装和调用方法到此结束,实际应用看自己的项目需求,附上个人一点见解。
【写日志的原则】
1.在catch后,把异常写入日志.
2.在调用第三方控件的开始和结束处.
3.在连接数据库的开始结束处.
4.除非必要,不要在循环体中加入日志,否则一旦出问题可能导致日志暴增.
5.在自己认为很重要的逻辑处写入日志.
【注意】
发现有重要问题时最好用邮件日志,但不要指望上面的邮件配置节能发日志.
要使用能用的smtp服务器,163的只有部分用户能用.我的就不能用,很是郁闷.
要合理配置下列参数.
Ⅰ.日志文件的大小
Ⅱ.备份的日志名样式,最好时间精确到分