log4net使用(WinForm/WebFrom)

原来的一篇文章,今天用 WLW 转到页面上,原文章以及附件下载地址:http: // zhq.ahau.edu.cn/blog/article.asp?id=366


--------------------------------------------------------------------------------

log4net为Apache 的一个子项目,其为Java版的.Net实现,具体介绍可以参看其官方网站,另外其下载地址和详细开发文档也可以找到.

Log4net官方网站http:
// logging.apache.org/log4net

WinForm和WebForm中的使用方式有点雷同,基本为(
1 .)配置config,( 2 .)初始化日志系统,( 3 .)类文件内记录日志.

Config 文件内的配置方法可以为以下:

< configuration >
<!-- 日志配置部分 -->
< configSections >
< section name = " log4net "  type = " log4net.Config.Log4NetConfigurationSectionHandler,log4net " />
</ configSections >
<!-- 站点日志配置部分 -->
< log4net >
< root >
< priority value = " ALL " />
< appender - ref   ref = " RollingFileAppender " />
</ root >
< appender name = " TraceAppender "  type = " log4net.Appender.TraceAppender " >
< layout type = " log4net.Layout.PatternLayout " >
< conversionPattern value = " %date [%thread] %-5level %logger [%property{NDC}] - %message%newline " />
</ layout >
</ appender >
< appender name = " ConsoleAppender "  type = " log4net.Appender.ConsoleAppender " >
< layout type = " log4net.Layout.PatternLayout " >
< conversionPattern value = " %date [%thread] %-5level %logger [%property{NDC}] - %message%newline " />
</ layout >
</ appender >
< appender name = " RollingFileAppender "  type = " log4net.Appender.RollingFileAppender " >
< file value = " log\\log.txt " />
< appendToFile value = " true " />
< maxSizeRollBackups value = " 10 " />
< maximumFileSize value = " 2000KB " />
< rollingStyle value = " Size " />
< staticLogFileName value = " true " />
< lockingModel type = " log4net.Appender.FileAppender+MinimalLock " />
< layout type = " log4net.Layout.PatternLayout " >
< conversionPattern value = " %date [%thread] %-5level %logger [%property{NDC}] - %message%newline " />
</ layout >
</ appender >
</ log4net >
</ configuration >  

以上配置信息提供了RollingFile方式的日志记录方式,并保存在log.txt文件内,当日志文件超过2000k时就会自动更名,并建立新的log.txt文件,配置文件的具体使用说明可以参看log4net的开发文档.

Log4net的基本使用方式可以参看其开发文档.这里提供一个cnblogs.com的某牛人写的一个日志操作类(AppLog.cs),这样就可以很方便使用log4net日志系统了,但缺点也就出现了(具体的缺点就是在WinForm程序内无法捕捉到追加日志的具体位置了).下面为AppLog.cs文件具体代码:

    
/// <summary>
/// 日志处理
/// </summary>

public   class  AppLog
{
/// <summary>
/// 静态类
/// </summary>

private AppLog(){}
private const string LOG_REPOSITORY = "Default"// this should likely be set in the web config.
private static ILog m_log;
/// <summary>
/// 初始化日志系统
/// 在系统运行开始初始化
/// Global.asax Application_Start内
/// </summary>

public static void Init()
{
log4net.Config.XmlConfigurator.Configure();
}

/// <summary>
/// 写入日志
/// </summary>
/// <param name="message">日志信息</param>
/// <param name="messageType">日志类型</param>

public static void Write(string message, LogMessageType messageType)
{
DoLog(message, messageType, 
null, Type.GetType("System.Object"));
}

/// <summary>
/// 写入日志
/// </summary>
/// <param name="message">日志信息</param>
/// <param name="messageType">日志类型</param>
/// <param name="type"></param>

public static void Write(string message, LogMessageType messageType, Type type)
{
DoLog(message, messageType, 
null, type);
}

/// <summary>
/// 写入日志
/// </summary>
/// <param name="message">日志信息</param>
/// <param name="messageType">日志类型</param>
/// <param name="ex">异常</param>

public static void Write(string message, LogMessageType messageType, Exception ex)
{
DoLog(message, messageType, ex, Type.GetType(
"System.Object"));
}

/// <summary>
/// 写入日志
/// </summary>
/// <param name="message">日志信息</param>
/// <param name="messageType">日志类型</param>
/// <param name="ex">异常</param>
/// <param name="type"></param>

public static void Write(string message, LogMessageType messageType, Exception ex,
Type type)
{
DoLog(message, messageType, ex, type);
}

/// <summary>
/// 断言
/// </summary>
/// <param name="condition">条件</param>
/// <param name="message">日志信息</param>

public static void Assert(bool condition, string message)
{
Assert(condition, message, Type.GetType(
"System.Object"));
}

/// <summary>
/// 断言
/// </summary>
/// <param name="condition">条件</param>
/// <param name="message">日志信息</param>
/// <param name="type">日志类型</param>

public static void Assert(bool condition, string message, Type type)
{
if (condition == false)
Write(message, LogMessageType.Info);
}

/// <summary>
/// 保存日志
/// </summary>
/// <param name="message">日志信息</param>
/// <param name="messageType">日志类型</param>
/// <param name="ex">异常</param>
/// <param name="type">日志类型</param>

private static void DoLog(string message, LogMessageType messageType, Exception ex,
Type type)
{
m_log 
= LogManager.GetLogger(type);
switch (messageType)
{
case LogMessageType.Debug:
AppLog.m_log.Debug(message, ex);
break;
case LogMessageType.Info:
AppLog.m_log.Info(message, ex);
break;
case LogMessageType.Warn:
AppLog.m_log.Warn(message, ex);
break;
case LogMessageType.Error:
AppLog.m_log.Error(message, ex);
break;
case LogMessageType.Fatal:
AppLog.m_log.Fatal(message, ex);
break;
}

}

/// <summary>
/// 日志类型
/// </summary>

public enum LogMessageType
{
/// <summary>
/// 调试
/// </summary>

Debug,
/// <summary>
/// 信息
/// </summary>

Info,
/// <summary>
/// 警告
/// </summary>

Warn,
/// <summary>
/// 错误
/// </summary>

Error,
/// <summary>
/// 致命错误
/// </summary>

Fatal
}

}
此类中提供日志的几种类型的一个枚举LogMessageType,将log4net中的几种日志记录方式进行了类型化抽象.记录日志时可以调用Write()方法写入日志. Write()有几个重载方法,可以实现不同的记录日志方式.例如:异常日志处理方式:

Utility.AppLog.Write(
" Exception: " , Utility.AppLog.LogMessageType.Error, ex);一般的信息类型的日志处理

Utility.AppLog.Write(
" 写入日志测试 " , Utility.AppLog.LogMessageType.Info);WinForm中使用时在Main()方法内初始化log4net日志系统.

// 初始化日志使用封装类

Utility.AppLog.Init();

WebForm中使用时除config文件配置log4net相关设置部分,还需要在全局文件中(Global.asax)初始化相关日志处理类:

    
void  Application_Start( object  sender, EventArgs e)
{
// 在应用程序启动时运行的代码
//初始化日志使用封装类
TestLog4net.Utility.AppLog.Init();
TestLog4net.Utility.AppLog.Write(
"Web站点运行", TestLog4net.Utility.AppLog.LogMessageType.Info);
}

void  Application_End( object  sender, EventArgs e)
{
//  在应用程序关闭时运行的代码
TestLog4net.Utility.AppLog.Write("Web站点关闭", TestLog4net.Utility.AppLog.LogMessageType.Info);
}
 

为了捕捉Web站点的异常还需要在全局文件Application_Error中捕捉异常,并写入日志:

    
void  Application_Error( object  sender, EventArgs e)
{
// 在出现未处理的错误时运行的代码
Exception ex = Server.GetLastError();
if (ex != null)
{
//写入错误日志
TestLog4net.Utility.AppLog.Write("[Exception]:", TestLog4net.Utility.AppLog.LogMessageType.Error, ex);
throw ex;
}

}
大概就记这么多东西,详细的使用代码可以在演示代码文件(TestLog4net)内找到.

演示代码内除了使用封装好的日志操作类记录日志外,还有使用log4net开发文档内所介绍的日志记录方式来记录日志.

演示代码项目具体目录如下:



TestLog4net.WebProject 为web使用测试项目,使用时可能要重新加载一下路径.

TestLog4net.Utility 为log4net的使用封装类AppLog.cs类.

TestLog4net.WinForm 为WinForm使用测试项目.

你可能感兴趣的:(WinForm)