Log4Net五部曲
本文主要讲述如何构建封装一个日志工具类,以及在该过程中遇到的问题,
关于Log4Net的介绍,就不详细赘述了,更多详细的技术可参考http://www.cnblogs.com/kissazi2/p/3393595.html
在我完成本功能的过程中也详细拜读了他的博客,讲解的很详细。接下来我将我自己完成的Log4Net做一个展示。在本系统中,存在一个基础类库存放LogHelper工具类以及其他一些工具类,一个Web项目Zone用于调用Log,输出log信息,其他不相干的就不介绍了。其实该功能是相对来说都大同小异。项目目录如下:

一、引入log4net.dll文件
首先需要在项目中引入log4net,引用->Nuget包管理->搜索log4net->Apache Log4net->安装即可,或直接在项目中引入log4net.dll文件
二、创建log4net的工具类
创建一个类库,Commons类库,创建一个基础类LogHelper,供其他地方调用
具体代码如下:
/// <summary>
/// 日志
/// </summary>
public class LogHelper
{
//日志级别
private const string ErrorLevel = "Error";
private const string DebugLevel = "Debug";
private const string InfoLevel = "Info";
private const string FatalLevel = "Fatal";
private const string WarningLevel = "Warn";
static LogHelper()
{
var path = AppDomain.CurrentDomain.BaseDirectory + @"log4net.config";
log4net.Config.XmlConfigurator.Configure(new FileInfo(path));
}
#region 获得ILog
/// <summary>
/// 根据Log等级获得log
/// </summary>
/// <param name="logLevel">Log等级</param>
/// <returns></returns>
public static ILog GetLog(string logLevel)
{
var log = log4net.LogManager.GetLogger(logLevel);
return log;
}
#endregion #region Info 级别的日志
public static void Info(string message)
{
var log = GetLog(InfoLevel);
if (log.IsInfoEnabled)
{
log.Info(message);
}
}
#endregion
#region Info 级别的日志
public static void Info(string message,Exception ex)
{
var log = GetLog(InfoLevel);
if (log.IsInfoEnabled)
{
log.Info(message,ex);
}
}
#endregion #region Debug 级别的日志
public static void Debug(string message)
{
var log = GetLog(DebugLevel);
if (log.IsDebugEnabled)
{
log.Debug(message);
}
}
#endregion
#region Debug 级别的日志
public static void Debug(string message,Exception ex)
{
var log = GetLog(DebugLevel);
if (log.IsDebugEnabled)
{
log.Debug(message,ex);
}
}
#endregion #region Error 级别的日志
public static void Error(string message)
{
var log = GetLog(ErrorLevel);
if (log.IsErrorEnabled)
{
log.Error(message);
}
}
#endregion
#region Error 级别的日志
public static void Error(string message,Exception ex)
{
var log = GetLog(ErrorLevel);
if (log.IsErrorEnabled)
{
log.Error(message,ex);
}
}
#endregion #region Fatal 级别的日志
public static void Fatal(string message)
{
var log = GetLog(FatalLevel);
if (log.IsFatalEnabled)
{
log.Fatal(message);
}
}
#endregion
#region Fatal 级别的日志
public static void Fatal(string message,Exception ex)
{
var log = GetLog(FatalLevel);
if (log.IsFatalEnabled)
{
log.Fatal(message,ex);
}
}
#endregion #region Warn 级别的日志
public static void Warning(string message)
{
var log = GetLog(WarningLevel);
if (log.IsWarnEnabled)
{
log.Warn(message);
}
}
#endregion
#region Warn 级别的日志
public static void Waring(string message,Exception ex)
{
var log = GetLog(WarningLevel);
if (log.IsWarnEnabled)
{
log.Warn(message,ex);
}
}
#endregion
}
三、在该类库的AssemblyInfo.cs文件末尾添加
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", ConfigFileExtension = "config", Watch = true)]
四、创建log4net.config
在调用LogHelper的项目中,创建一个log4net.config,我这里使用的配置内容如下;
<?xml version="1.0" encoding="utf-8"?>
<configuration> <configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
</configSections>
<log4net>
<root>
<!--控制级别由低到高:ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF-->
<!--比如定义级别为INFO,则INFO级别向下的级别,比如DEBUG日志将不会被记录-->
<!--如果没有定义LEVEL的值,则缺省为DEBUG-->
<level value="ALL"/>
</root>
<appender name="TestInfo" type="log4net.Appender.RollingFileAppender" >
<file value="log/Info/"/>
<appendToFile value="true"/>
<rollingStyle value="Composite" />
<maxSizeRollBackups value="-1" />
<maximumFileSize value="1MB" />
<staticLogFileName value="false" />
<DatePattern value="yyyy-MM-dd".txt""/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date %-5level - %message%newline" />
</layout>
</appender>
<appender name="TestError" type="log4net.Appender.RollingFileAppender">
<file value="log/Error/" />
<appendToFile value="true" />
<rollingStyle value="Composite" />
<maxSizeRollBackups value="-1" />
<maximumFileSize value="1MB" />
<staticLogFileName value="false" />
<DatePattern value="yyyy-MM-dd".txt""/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date %-5level - %message%newline" />
</layout>
</appender>
<appender name="TestDebug" type="log4net.Appender.RollingFileAppender">
<file value="log/Debug/" />
<appendToFile value="true" />
<rollingStyle value="Composite" />
<maxSizeRollBackups value="-1" />
<maximumFileSize value="1MB" />
<staticLogFileName value="false" />
<DatePattern value="yyyy-MM-dd".txt""/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date %-5level - %message%newline" />
</layout>
</appender> <logger name="Info">
<level value="ALL"/>
<appender-ref ref="Info" />
<appender-ref ref="TestInfo" />
</logger>
<logger name="Error">
<level value="ALL"/>
<appender-ref ref="Error" />
<appender-ref ref="TestError" />
</logger>
<logger name="Debug">
<level value="ALL"/>
<appender-ref ref="Debug" />
<appender-ref ref="TestDebug" />
</logger>
</log4net>
</configuration>
关于参数的详细配置,我就不做介绍了,可参考上文提到的博客中有详细介绍(注意,我在loghelper中虽然写了Warn和Fatal级别的日志,但在此配置中没有对这两个级别的日志做配置,故,项目不会产生这两个级别的日志)
修改log4net.config文件的属性为"始终复制"

五、在需要使用Log4Net的项目中添加该类库的引用(本系统就是Commons.dll)
在需要打印log的地方使用。修改
LogHelper.Info("产生LOG");//产生一条Info级别的Log信息
运行项目会在该项目目录下产生log/Debug/当前日期.txt、log/Error/当前日期.txt、log/Info/当前日期.txt.
在本文中红色标注的地方是可能出错的地方,如有异常一定要先检查这些
Log4Net五部曲的更多相关文章
- MVC4下配置log4net 五部曲
第一步:把log4net.dll 编译成Framework 4.0 第二步:找到项目的Properties下的AssemblyInfo.在最下面添加:[assembly: log4net.Config ...
- python回归分析五部曲
Python回归分析五部曲(一)—简单线性回归 https://blog.csdn.net/jacky_zhuyuanlu/article/details/78878405?ref=myread Py ...
- git提交代码五部曲
From: https://jingyan.baidu.com/article/359911f5a4fe4b57fe03060d.html 正常使用git时,提交代码五部曲. 工具/原料 电脑 已 ...
- 基于Linux平台的Lotus Domino 8系统部署五部曲(全视频展示)
基于Linux平台的Lotus Domino 8系统部署五部曲(全视频展示),学习就像看电影 第一部:安装部署 第二部:配置Domino 第三部:Notes8客户端配置 第四部:为Domino系统加装 ...
- Python回归分析五部曲(二)—多重线性回归
基础铺垫 多重线性回归(Multiple Linear Regression) 研究一个因变量与多个自变量间线性关系的方法 在实际工作中,因变量的变化往往受几个重要因素的影响,此时就需要用2个或2个以 ...
- Python回归分析五部曲(一)—简单线性回归
回归最初是遗传学中的一个名词,是由英国生物学家兼统计学家高尔顿首先提出来的,他在研究人类身高的时候发现:高个子回归人类的平均身高,而矮个子则从另一方向回归人类的平均身高: 回归分析整体逻辑 回归分析( ...
- Python回归分析五部曲(三)—一元非线性回归
(一)基础铺垫 一元非线性回归分析(Univariate Nonlinear Regression) 在回归分析中,只包括一个自变量和一个因变量,且二者的关系可用一条曲线近似表示,则称为一元非线性回归 ...
- iOS 之美:iOS Delegate 使用五步曲
在iOS 开发中, 搞清楚Delegate 是需要花些时间的. Delegate 本来是软件架构设计的一种理念.对于像手机这样一个有限的设备,我们需要充分考虑到:内存要尽量省着用: 视图之间的关系要清 ...
- git使用和理解之一(不含分支)
0.前言 Workspace:工作区 Index / Stage:暂存区 Repository:仓库区(或本地仓库) Remote:远程仓库 工作区和暂存区: 我们写代码的地方就是工作区,代码写完后, ...
随机推荐
- js闭包面试题目
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- SQLite常用函数及语句
SQLite3.0使用的是C的函数接口,常用函数如下: sqlite3_open() //打开数据库 sqlite3_close() //关闭数据库 sqlite3_exec() //执行sql语句, ...
- 兼容ie7以上的 placeholder属性
最近项目踩过的坑,不考虑ie的可以拐弯绕路走了. css3的新属性 占位符 placeholder用着多舒服 . 偏偏万恶的ie不支持,网上有几种方法是用焦点事件代替的,不过会失去原有的特性.一旦获取 ...
- 【Unity3D】Unity3D开发《我的世界》之六、创建地形(视频 + 源码)
转载请注明出处:http://www.cnblogs.com/shamoyuu/p/unity_minecraft_06.html 一.引入LibNoise 虽然Unity3D里也有一个Mathf.P ...
- (28000): Access denied for user 'root'@'127.0.0.1' (using password: YES)
在一台测试服务器测试Python脚本时,执行Python脚本时报如下错误: 主要错误信息为"operation the sql fail!1045 (28000): Access den ...
- 笔记+R︱信用风险建模中神经网络激活函数与感知器简述
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 本笔记源于CDA-DSC课程,由常国珍老师主讲 ...
- Extjs 4.0 Window
1.JSON代码 Ext.MyWindow=Ext.extend(Ext.Window ,{ xtype:"window", title:"我的窗口", wid ...
- JavaScript解决select下拉框中的内容太长显示不全的问题
JavaScript解决select下拉框中的内容太长显示不全的问题 1.说明 有些情况下,select下拉框的内容过长,导致部分看不见: 现在通过鼠标事件,让下拉框中的内容显示完全 2.实现源码 & ...
- js、css动态压缩页面代码
1.js.css动态压缩页面代码 <%@ Page Language="C#" AutoEventWireup="true" CodeFile=" ...
- vs不支持通过afxgetmainwnd()获取窗口句柄(转)
问题: 在vc6中这样代码顺利通过,可执行 ::SetDlgItemText(AfxGetMainWnd()-> m_hWnd,IDC_TIME,strTime); (这是在对话框程序中,代码在 ...