一直以来,都是把log4net写有应用程序中,在每个需要输出日志的类中都先声明一下,然后再调用它的输出函数,如debug,error等等,这样也没有感觉出有多大的不方便,直到有一次,在每个输出日志的地方需要加一个写到库中的语句,就是把错误级别的日志在输出到文件的同时也写到专门的数据库中,以方便管理与查看,这样一来可把我们给害惨了,这么多error级别的日志,得花费多少时间去添加呀。
一个同事在输出日志的时候写了一个公共方法,所有输出日志的地方都调用这个方法,在这次的添加过程中,他只需要在这个方法中添加一句话就完成了所需的功能。这样太方便了,能不能把输出日志写成单独一个类,然后在应用程序中调用这个类的dll呢?由于时间原因,一直没能去作实验,在新项目中我想用这个方法去实现日志输出,于是作了这个实验,记录下来,请高人指教,同时了也是作为一个备份,以便自己以后查看吧。
以下是实现的正文:
1、新建一个解决方案,取名为AloneLog
2、添加一个类库工程,取名为Log.Class
2.1 为Log.Class工程引用log4net.dll;
2.2 为Log.Class工程添加log4net.dll的引用;
2.3在AssemblyInfo.cs文件的最后添加:
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "web.config", Watch = true)]
2.4 为Log.Class工程添加一个输出日志的类文件LogOut.cs,其内容如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace AloneLog
{
public class LogOut
{
public static void debug(string message)
{
log4net.ILog log = log4net.LogManager.GetLogger("LogOut");
if (log.IsDebugEnabled)
{
log.Debug(message);
}
log = null;
}
public static void error(string message)
{
log4net.ILog log = log4net.LogManager.GetLogger("LogOut");
if (log.IsErrorEnabled)
{
log.Error(message);
}
log = null;
}
public static void fatal(string message)
{
log4net.ILog log = log4net.LogManager.GetLogger("LogOut");
if (log.IsFatalEnabled)
{
log.Fatal(message);
}
log = null;
}
public static void info(string message)
{
log4net.ILog log = log4net.LogManager.GetLogger("LogOut");
if (log.IsInfoEnabled)
{
log.Info(message);
}
log = null;
}
public static void warn(string message)
{
log4net.ILog log = log4net.LogManager.GetLogger("LogOut");
if (log.IsWarnEnabled)
{
log.Warn(message);
}
log = null;
}
}
}
2.5 编译Log.Class类库工程。
3、添加一个web 应用程序,取名为Log.Web。
3.1 为Log.Web应用程序引入Log.Class工程bin目录下的Log.Class.dll;
3.2 在web 应用程序Log.Web的配置文件web.config文件中添加log4net的配置:
<?xml version="1.0"?>
<configuration>
<configSections>
<sectionGroup >
........
</sectionGroup>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
</configSections>
<appSettings/>
<connectionStrings/>
<log4net>
<root>
<!--
<level value="ALL" />
<appender-ref ref="rootFile" />
-->
</root>
<logger name="LogWebEdu">
<level value="DEBUG" />
<appender-ref ref="rollingFile" />
</logger>
<appender name="rollingFile" type="log4net.Appender.RollingFileAppender,log4net" >
<param name="File" type="" value="log/log.txt" />
<param name="AppendToFile" value="true" />
<param name="RollingStyle" value="Date" />
<param name="DatePattern" value="yyyyMMdd" />
<param name="StaticLogFileName" value="true" />
<layout type="log4net.Layout.PatternLayout,log4net">
<param name="ConversionPattern" value="%n%d %r [%t] %-5p %c %L - %m%n" />
</layout>
</appender>
</log4net>
<system.web>
......
</system.web>
</configuration>
3.2 在需要输出日志的文件里(在此为default.aspx.cs)调用输出日志的方法,代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Log.Class;
namespace Log.Web
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
LogOut.debug("单独日志类测试");
}
}
}
}
除此之外,不需要再配置其它内容,原来写在一起的时候,还要在gloab.asax里添加对log4net的声明,在这个项目中我没有添加也可以输出日志文件,在web应用程序Log.Web的AssemblyInfo.cs中也没有添加对log4net的声明,只是在类库文件的AssemblyInfo.cs中添加了。
7、运行Log.Web应用程序,在Log.Web目录下会多了一个log目录,在log目录下就可以看到日志文件了,
2009-04-26 11:17:36,671 86425156 [8] DEBUG LogOut 15 - 单独日志类测试
附加:
log4net.Layout.PatternLayout中的转换模式(ConversionPattern)
%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:输出语句所在的文件名
%-数字:表示该项的最小长度,如果不够,则用空格填充