本文主要讲述如何构建封装一个日志工具类,以及在该过程中遇到的问题,

关于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&quot;.txt&quot;"/>
<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&quot;.txt&quot;"/>
<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&quot;.txt&quot;"/>
<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五部曲的更多相关文章

  1. MVC4下配置log4net 五部曲

    第一步:把log4net.dll 编译成Framework 4.0 第二步:找到项目的Properties下的AssemblyInfo.在最下面添加:[assembly: log4net.Config ...

  2. python回归分析五部曲

    Python回归分析五部曲(一)—简单线性回归 https://blog.csdn.net/jacky_zhuyuanlu/article/details/78878405?ref=myread Py ...

  3. git提交代码五部曲

    From: https://jingyan.baidu.com/article/359911f5a4fe4b57fe03060d.html 正常使用git时,提交代码五部曲. 工具/原料   电脑 已 ...

  4. 基于Linux平台的Lotus Domino 8系统部署五部曲(全视频展示)

    基于Linux平台的Lotus Domino 8系统部署五部曲(全视频展示),学习就像看电影 第一部:安装部署 第二部:配置Domino 第三部:Notes8客户端配置 第四部:为Domino系统加装 ...

  5. Python回归分析五部曲(二)—多重线性回归

    基础铺垫 多重线性回归(Multiple Linear Regression) 研究一个因变量与多个自变量间线性关系的方法 在实际工作中,因变量的变化往往受几个重要因素的影响,此时就需要用2个或2个以 ...

  6. Python回归分析五部曲(一)—简单线性回归

    回归最初是遗传学中的一个名词,是由英国生物学家兼统计学家高尔顿首先提出来的,他在研究人类身高的时候发现:高个子回归人类的平均身高,而矮个子则从另一方向回归人类的平均身高: 回归分析整体逻辑 回归分析( ...

  7. Python回归分析五部曲(三)—一元非线性回归

    (一)基础铺垫 一元非线性回归分析(Univariate Nonlinear Regression) 在回归分析中,只包括一个自变量和一个因变量,且二者的关系可用一条曲线近似表示,则称为一元非线性回归 ...

  8. iOS 之美:iOS Delegate 使用五步曲

    在iOS 开发中, 搞清楚Delegate 是需要花些时间的. Delegate 本来是软件架构设计的一种理念.对于像手机这样一个有限的设备,我们需要充分考虑到:内存要尽量省着用: 视图之间的关系要清 ...

  9. git使用和理解之一(不含分支)

    0.前言 Workspace:工作区 Index / Stage:暂存区 Repository:仓库区(或本地仓库) Remote:远程仓库 工作区和暂存区: 我们写代码的地方就是工作区,代码写完后, ...

随机推荐

  1. 概括一下nodejs

    Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境. Node.js是事件驱动,非阻塞I/O的.所以它再处理高并发,I/O密集的场景下性能优势明显,如web. 对比 ...

  2. HDU - 1907 John 反Nimm博弈

    思路: 注意与Nimm博弈的区别,谁拿完谁输! 先手必胜的条件: 1.  每一个小游戏都只剩一个石子了,且SG = 0. 2. 至少有一堆石子数大于1,且SG不等于0 证明:1. 你和对手都只有一种选 ...

  3. keepalived双机热备nginx

    nginx目前是我最常用的反向代理服务,线上环境为了能更好的应对突发情况,一般会使用keepalived双机热备nginx或者使用docker跑nginx集群,keepalived是比较传统的方式,虽 ...

  4. duilib界面库学习(仿PC微信界面,有服务器,有数据库,可以网络通信)

    客户端代码:https://github.com/TTGuoying/duilib_ChatClient 服务器代码:https://github.com/TTGuoying/duilib_ChatS ...

  5. SpringMVC的数据转换,格式化和数据校验

          在SpringMVC中,根据请求方法签名不同,将请求消息中的消息以一定的方式转换并绑定到请求方法的参数中,在请求信息到达真正调用处理方法的这一段时间内,SpringMVC还会完成很多其他的 ...

  6. WIN7下PS/2等键盘失灵无法使用的解决办法

    WIN7下PS/2等键盘失灵无法使用的解决办法 装了win7,无意中一天开机,发现键盘不能用了.开始以为键盘坏了,重启看机,一看能进bios,各键正常.然后再重启,进系统,看设备管理器,发现键盘为黄色 ...

  7. 在U-boot中添加以太网驱动

    当定义CONFIG_CMD_NET和CONFIG_CMD_PING,编译之后执行ping命令,告警没有找到以太网. 因此,需要打开U-boot的网络功能, u-boot-sunxi-sunxi中没有找 ...

  8. 一个URL的组成

    URL的组成 URL由三部分组成:协议类型,主机名和路径及文件名.通过URL可以指定的主要有以下几种:http.ftp.gopher.telnet.file等.   URL的组成 URL的组成 协议 ...

  9. zTree实现删除树节点

    zTree实现删除树节点 1.实现源码 <!DOCTYPE html> <html> <head> <title>zTree实现基本树</titl ...

  10. ORA-00900: invalid SQL statement

    1.错误描述 SQL> startup;        startup        ORA-00900: invalid SQL statement 2.错误原因 3.解决办法