(转)Log4net 配置类库
原文地址:http://blog.csdn.net/pfe_nova/article/details/20072137
1.单文件日志
对于单文件的日志,封装代码如下:
public enum LogMessageType
{
Debug,
Info,
Warn,
Error,
Fatal
}
public sealed class LogProvider
{
private static readonly ILog provider = GetLogger();
static LogProvider() { }
private LogProvider() { } public static void Write(string msg, LogMessageType msgType, Exception ex = null)
{
WriteLog(msg, msgType, ex);
}
public static void InitConfig()
{
XmlConfigurator.Configure();
}
public static void ShutDown()
{
LogManager.Shutdown();
} private static ILog GetLogger()
{
InitConfig();
return LogManager.GetLogger("DefaultLogger");
}
private static void WriteLog(string msg, LogMessageType msgType, Exception ex)
{
if (provider != null)
{
switch (msgType)
{
case LogMessageType.Debug:
provider.Debug(msg, ex);
break;
case LogMessageType.Info:
provider.Info(msg, ex);
break;
case LogMessageType.Warn:
provider.Warn(msg, ex);
break;
case LogMessageType.Error:
provider.Error(msg, ex);
break;
case LogMessageType.Fatal:
provider.Fatal(msg, ex);
break;
}
}
}
}
这样所有要记日志的地方只需要LogProvider.Write("this is Log", LogMessageType.Error);一行代码即可,Log4net初始化工作封装在初始化器中,在第一次调用Log4net时进行自动初始化。LogProvider类开放出三个静态方法:Write、InitConfig、ShutDown,后两者用于在程序中手动控制Log4net的开启和关闭;Write方法采用默认参数,达到重载的效果。配置文件如下:
<?xml version="1.0"?>
<configuration>
<configSections>
<section name="log4net"
type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
</configSections>
<log4net>
<logger name="DefaultLogger">
<level value="ALL"/>
<appender-ref ref="txtLogger" />
</logger>
<appender name="txtLogger"
type="log4net.Appender.RollingFileAppender,log4net" >
<File value="Log\Log.txt" />
<datePattern value="(yyyyMMdd)"/>
<appendToFile value="true"/>
<RollingStyle value="Composite"/>
<MaxSizeRollBackups value=""/>
<maximumFileSize value="1MB"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%t]%-5p %c - %m%n"/>
</layout>
</appender>
</log4net>
<startup/>
</configuration>
唯一要注意的就是<logger name="DefaultLogger">这个用来关联,帮助类中要和配置文件中一致,其他的参数说明参照这以前写的log4net的配置详解。
2.分级别记录日志
重构代码时我想起我们原来的日志框架有个功能是把不同级别的日志分开记录的,例如把奔溃和错误记在一起一个文件中,警告和信息记在一个文件中,查问题时就可以先看重大错误。针对这个需求调查了下,也可以在配置文件中配置的,配置文件如下:
<?xml version="1.0"?>
<configuration>
<configSections>
<section name="log4net"
type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
</configSections>
<log4net>
<logger name="DefaultLogger">
<level value="ALL"/>
<appender-ref ref="InfoLoging" />
<appender-ref ref="ErrorLoging" />
</logger>
<!--DefaultLogger Info Log-->
<appender name="InfoLoging"
type="log4net.Appender.RollingFileAppender,log4net" >
<File value="Log\LogTipMsg.txt" />
<datePattern value="(yyyyMMdd)"/>
<appendToFile value="true"/>
<RollingStyle value="Composite"/>
<MaxSizeRollBackups value=""/>
<maximumFileSize value="1MB"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%t]%-5p %c - %m%n"/>
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<LevelMin value="DEBUG"/>
<LevelMax value="Warn"/>
</filter>
</appender>
<!--DefaultLogger Error Log-->
<appender name="ErrorLoging"
type="log4net.Appender.RollingFileAppender,log4net" >
<File value="Log\LogErrorMsg.txt" />
<datePattern value="(yyyyMMdd)"/>
<appendToFile value="true"/>
<RollingStyle value="Composite"/>
<MaxSizeRollBackups value=""/>
<maximumFileSize value="1MB"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%t]%-5p %c - %m%n"/>
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<LevelMin value="ERROR" />
</filter>
</appender>
</log4net>
<startup/>
</configuration>
3.按业务逻辑记录日志
另一个情况就是按业务模块记录到不同的文件中,此时同样可以通过配置来获得,配置文件如下:
<?xml version="1.0"?>
<configuration>
<configSections>
<section name="log4net"
type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
</configSections>
<log4net>
<logger name="DefaultLogger">
<level value="ALL"/>
<appender-ref ref="InfoLoging" />
<appender-ref ref="ErrorLoging" />
</logger>
<logger name="OtherCustomerLogger">
<level value="Info"/>
<appender-ref ref="OtherInfoLoging" />
</logger>
<!--DefaultLogger Info Log-->
<appender name="InfoLoging"
type="log4net.Appender.RollingFileAppender,log4net" >
<File value="Log\LogTipMsg.txt" />
<datePattern value="(yyyyMMdd)"/>
<appendToFile value="true"/>
<RollingStyle value="Composite"/>
<MaxSizeRollBackups value=""/>
<maximumFileSize value="1MB"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%t]%-5p %c - %m%n"/>
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<LevelMin value="DEBUG"/>
<LevelMax value="Warn"/>
</filter>
</appender>
<!--DefaultLogger Error Log-->
<appender name="ErrorLoging"
type="log4net.Appender.RollingFileAppender,log4net" >
<File value="Log\LogErrorMsg.txt" />
<datePattern value="(yyyyMMdd)"/>
<appendToFile value="true"/>
<RollingStyle value="Composite"/>
<MaxSizeRollBackups value=""/>
<maximumFileSize value="1MB"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%t]%-5p %c - %m%n"/>
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<LevelMin value="ERROR" />
</filter>
</appender>
<!--OtherCustomerLogger OtherInfo Log-->
<appender name="OtherInfoLoging"
type="log4net.Appender.RollingFileAppender,log4net" >
<File value="Log\LogOtherInfoLoging.txt" />
<datePattern value="(yyyyMMdd)"/>
<appendToFile value="true"/>
<RollingStyle value="Composite"/>
<MaxSizeRollBackups value=""/>
<maximumFileSize value="1MB"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%t]%-5p %c - %m%n"/>
</layout>
</appender>
</log4net>
<startup/>
</configuration>
帮助类调整如下:
public enum LogicType
{
DefaultLogger,
OtherCustomerLogger
}
public enum LogMessageType
{
Debug,
Info,
Warn,
Error,
Fatal
}
public sealed class LogProvider
{
static LogProvider() { }
private LogProvider() { } private static readonly Dictionary<string, ILog> dicLoggers = GetLoggers(); public static void Write(string msg, LogMessageType msgType, Exception ex = null)
{
WriteLog(msg, msgType, ex);
}
public static void Write(string msg,
LogMessageType msgType, LogicType logicType, Exception ex = null)
{
WriteLog(msg, msgType, ex, logicType.ToString());
}
public static void InitConfig()
{
XmlConfigurator.Configure();
}
public static void ShutDown()
{
LogManager.Shutdown();
} static Dictionary<string, ILog> GetLoggers()
{
InitConfig();
ILog[] allLoggers = LogManager.GetCurrentLoggers();
Dictionary<string, ILog> dicLoggers = new Dictionary<string, ILog>();
foreach (var logger in allLoggers)
{
dicLoggers.Add(logger.Logger.Name, logger);
}
return dicLoggers;
}
static void WriteLog(string msg,
LogMessageType msgType, Exception ex, string logicType = "DefaultLogger")
{
if (dicLoggers != null && dicLoggers[logicType] != null)
{
switch (msgType)
{
case LogMessageType.Debug:
dicLoggers[logicType].Debug(msg, ex);
break;
case LogMessageType.Info:
dicLoggers[logicType].Info(msg, ex);
break;
case LogMessageType.Warn:
dicLoggers[logicType].Warn(msg, ex);
break;
case LogMessageType.Error:
dicLoggers[logicType].Error(msg, ex);
break;
case LogMessageType.Fatal:
dicLoggers[logicType].Fatal(msg, ex);
break;
}
}
}
}
增加了LogicType这个枚举,记录特定业务逻辑日志时LogProvider.Write("this is Other Info", LogMessageType.Info, LogicType.OtherCustomerLogger)。实际操作时就是根据业务逻辑扩充这个枚举。
至此,这个版本已经能够直接拿到项目中用了,只需配置即可,不需要额外改动代码。
后记:在封装过程中也遇到了一些问题,例如readonly和静态构造函数的问题,当时对其理解不够彻底,疑惑了一阵,以后有空一并总结出来。虽然是终结版,能够作为项目的稳定版本,但也还有一些不足,例如只想滚动保存6个月的日志,现在就不知道log4net能不能实现(或者说怎么实现,如果让我实现我就只能另外写个线程每天遍历一次,如果有6个月前的日志就将其删掉)。希望能对读者有些帮助,如果有什么错误或想法,还望不吝指教,转载请保留原文链接。
(转)Log4net 配置类库的更多相关文章
- 一、Log4Net配置
Core的配置 一.创建core包含控制和视图的项目以及Log4Net引用 二.创建Log4Net配置文件 右击项目->添加文件 Log4Net.config 2 复制以下代码 以下配置可做 ...
- ASP.NET MVC学习之Log4Net配置(日志记录)
Log4Net配置笔记---- 首先,添加对log4net.dll的引用. 在Web.config文件下的Configuration节点下添加Log4Net的配置信息: <!--Log4Net配 ...
- JWT+Log4net配置与使用
Log4net的优点 log4net是.Net下一个非常优秀的开源日志记录组件.log4net记录日志的功能非常强大.它可以将日志分不同的等级,以不同的格式,输出到不同的媒介.程序运行过 ...
- Common.Logging log4net Common.Logging.Log4Net 配置
1.log4net 单独配置 log4net支持多种格式的日志输出,我这里只配置输出到本地的txt文件这种格式. <log4net> <root> <appender-r ...
- Log4Net 配置StmpAppender
目录 Log4Net 配置StmpAppender 1 1.前言 1 2.详细配置 1 1.StmpAppender配置 1 2.Root 配置 2 3.更多选项 ...
- C# Log4Net配置
Log4Net是用来记录日志的,可以将程序运行过程中的信息输出到一些地方(文件.数据库.EventLog等),日志就是程序的黑匣子,可以通过日志查看系统的运行过程,从而发现系统的问题.日志的作用:将运 ...
- Log4net配置与使用简要说明
log4net详细配置:http://logging.apache.org/log4net/本文描述如有错误,以官网的说明为准;p 一:先来看看log4net中的几个概念: 1. log4net继承机 ...
- MVC Log4Net 配置
1.引用log4net.dll 2.在项目根目录下增加log4.config文件 <?xml version="1.0"?> <configuration> ...
- C# 日志系统 log4net 配置及使用
1.引用Dll 版本是:1.2.10.0,下载Dll 2.Web.config文件配置 <?xml version="1.0" encoding="utf-8&qu ...
随机推荐
- mysql的text的类型注意
不要以为text就只有一种类型! Text也分为四种类型:TINYTEXT.TEXT.MEDIUMTEXT和LONGTEXT 其中 TINYTEXT 256 bytes TEXT 65,535 byt ...
- oracle自动备份
因为一个项目上马,需要设置自动备份,网上搜索了一下,windows平台下基本上是通过系统的任务计划完成的,于是我也写了一下,无非就是exp xxxx.dmp,文件名是用的日期加时间,精确到秒,一小时备 ...
- 【shiro】org.apache.shiro.authc.IncorrectCredentialsException: Submitted credentials for token
org.apache.shiro.authc.IncorrectCredentialsException: Submitted credentials for token [org.apache.sh ...
- android学习笔记42——图形图像处理2——绘图
绘图 android的绘图应该继承View组件,并重写onDraw(Canvas canvas)方法即可. 重写onDraw(Canvas canvas)方法时涉及一个绘图API:Canvas,Can ...
- uboot 环境变量
从bootm 命令讲起 1 找到linux的内核入口 Bootm命令通过读取uImage的头部0×40字节的信息,将uImage定位到正确的地址,同时找到linux的内核入口地址. 这个地方就涉及到u ...
- JavaScript中对于闭包的理解
1.什么是闭包? 闭包,官方对闭包的解释是:一个拥有很多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 闭包的特点: (1).作为一个函数变量的一个引用,当函 ...
- (C/C++) Interview in English - Basic concepts.
Question Key words Anwser A assignment operator abstract class It is a class that has one or more pu ...
- c++ std::sort函数调用经常出现的invalidate operator<错误原因以及解决方法
在c++编程中使用sort函数,自定义一个数据结构并进行排序时新手经常会碰到这种错误. 这是为什么呢?原因在于什么?如何解决? 看下面一个例子: int main(int, char*[]) { st ...
- POJ 1611 The Suspects(并查集,简单)
为什么ACM的题意都这么难懂,就不能说的直白点吗?还能不能好好的一起刷题了? 题意:你需要建一个n的并查集,有m个集合,最后要输出包含0的那个集合的元素的个数. 这是简单并查集应用,所以直接看代码吧! ...
- c++学习-虚函数
#include <iostream> using namespace std; class common{ public: virtual void hello(){cout<&l ...