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:远程仓库 工作区和暂存区: 我们写代码的地方就是工作区,代码写完后, ...
随机推荐
- DAY1--JAVA
学习路线 2017-1-27打卡学习,先学习第一部分Java基础. 面向对象 面向对象---它是从现实世界中客观存在的事物(即对象)出发,并在系统构造中尽可能的运用人类自然的思维方式,来构建软件系统. ...
- 1 Python数据类型--
常见的Python数据类型: (1)数值类型:就是平时处理的数字(整数.浮点数) (2)序列类型:有一系列的对象并排或者排列的情况.如字符串(str),列表(list),元组(tuple)等 (3)集 ...
- 阿里云ECS重置磁盘到SSH登录
1.登录阿里云(www.aliyun.com) -- > 控制台: 2.点击左边的"云服务器ECS": 3.点击上面"第二步",进入页面之后,点击&quo ...
- 使用org.apache.commons.logging打日志注意事项
使用方法:例如,protected final Log logger = LogFactory.getLog(getClass());if (logger.isDebugEnabled()) { lo ...
- Codeforces348C - Subset Sums
Portal Description 给出长度为\(n(n\leq10^5)\)的序列\(\{a_n\}\)以及\(m(m\leq10^5)\)个下标集合\(\{S_m\}(\sum|S_i|\leq ...
- AGC010 - C: Cleaning
原题链接 题意简述 给出一棵个节点的树,每个点有点权.每次可以选择两个叶节点并将连接它们的路径上的节点的点权-1(包括叶节点).求能否将所有节点的点权都变为0. 分析 先考虑最简单的情况.在这种情况下 ...
- 《Java编程思想》读书笔记
前言 这个月一直没更新,就是一直在读这本<Java编程思想>,这本书可以在Java业界被传神的一本书,无论谁谈起这本书都说好,不管这个人是否真的读过这本书,都说啊,这本书很好.然后再看这边 ...
- Linux shell的问题
1.uptime命令可以查看当前系统的启动时间: w命令显示当前登录者top命令显示当前任务ps命令显示所有进程信息 uptime命令可以查看系统启动时间 2.使用shell时,默认的环境变量放在 ...
- 64位Kali无法顺利执行pwn1问题的解决方案
问题描述 环境:VMware Fusion + kali-linux-2018.1-amd64.iso 问题:在Terminal利用./pwn1执行pwn1会出现 bash: ./pwn1:没 ...
- RTlinux3.2安装
( 1 ).前言 2003 年以后, fmslabs 的 RTLinux Free 版本为 3.2Pre ,和以前的 RTLinux 3.1 比较,不再需要必须从 2.4.4 的内核上安装. RTLi ...