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:远程仓库 工作区和暂存区: 我们写代码的地方就是工作区,代码写完后, ...
随机推荐
- 如何解决jQuery easyui中locale文件下easyui-lang-zh_CN中文乱码问题
1.在保存eclipse项目的目录下找到引入easyui-lang-zh_CN.js 2.用记事本打开该js文件,若打开后的中文正常,直接复制,粘贴到项目中的该js文件中,保存 3.若打开后中文出现乱 ...
- Yii2 Restful Api 401
采用Yii2 Restful Api方式为APP提供数据,默认你已经做好了所有的编码和配置工作.采用Postman测试接口: 出现这个画面的一个可能原因是:access_token的写法有误,如果你使 ...
- iOS原生和H5的相互调用
为什么现在越来越多的APP中开始出现H5页面? 1,H5页面开发效率更高,更改更加方便: 2,适当缩小APP安装包的大小: 3,蹭热点更加方便,比如五一,十一,双十一搞活动: 那么为什么说H5无法取代 ...
- Yii如何使用数据库
1.Yii如何使用数据库 Yii通过数据库访问对象(Database Access Objects,简称DAO)来使用数据库的. DAO建立在"PHP数据对象(PDO)之上,并提供一套面向对 ...
- MySQL的BlackHole引擎在主从架构中的作用
MySQL在5.x系列提供了Blackhole引擎–“黑洞”. 其作用正如其名字一样:任何写入到此引擎的数据均会被丢弃掉, 不做实际存储:Select语句的内容永远是空. 和Linux中的 /dev/ ...
- Egret学习笔记 (Egret打飞机-8.敌机和主角飞机发射子弹)
经过前面几章的准备,我们差不多已经具备了一个基本的框架,这一章我们就开始添砖加瓦了. 敌机定时发射一个子弹,子弹的方向是从上到下,但是发射子弹的代码应该放在哪儿呢? 从面向对象编程的思想来说,子弹是敌 ...
- ACdream1032 Component 树形DP
思路:dp[i][j]表示以i为根结点有j个连通节点的最小和, 当进行状态转移时需要利用01背包,节点u下面有多个子节点,每个子节点可以最多可以贡献cnt[v]个节点,cnt[v]表示以v为根结点的树 ...
- webpack入门宝典
前提摘要 本文是经过二天自己学习总结出来的一些心得,本文是在最新版的webpack4x的基础上进行配置的(听说webpack4x比以往改变都很大有些插件可能有问题).如果你以前没怎么接触过Webpac ...
- SQL语句查询时防止SQL语句注入的方法之一
1.传参时有可能出现SQL语句注入 StringBuffer sb = new StringBuffer(); if(StringUtils.isNotBlank(areaCode)) { sb.ap ...
- MySQL显示状态信息
MySQL显示状态信息 1.show status mysql> show status; +-----------------------------------+----------+ | ...