using log4net;
using log4net.Appender;
using log4net.Config;
using log4net.Core;
using log4net.Layout;
using System;
using System.IO;
using System.Web; namespace Utility
{
/// <summary>
/// 简单封装log4net基本功能
/// 1 无论log4net.config文件是否存在,都可以正常使用log4net.dll记录日志
/// 2 支持两种类型的logger:SystemLogger和DatabaseLogger,还可以添加更多的logger对象
/// </summary>
public class Logger
{
private static readonly Type declaringType = typeof(Logger); protected static ILog SystemLog
{
get;
private set;
} protected static ILog DatabaseLog
{
get;
private set;
} static Logger()
{
const string fileName = "log4net.config";
string basePath = HttpContext.Current != null
? AppDomain.CurrentDomain.SetupInformation.PrivateBinPath
: AppDomain.CurrentDomain.BaseDirectory;
string filePath = Path.Combine(basePath, fileName); if (File.Exists(filePath))
{
XmlConfigurator.ConfigureAndWatch(new FileInfo(filePath));
}
else
{
//默认设置(log4net 按装饰器模式实现,支持:ConsoleLog、FileLog、EventLog等不同方式)
RollingFileAppender appender = new RollingFileAppender
{
Name = "root",
File = "logs\\log.txt",
AppendToFile = true,
RollingStyle = RollingFileAppender.RollingMode.Composite, //日期发生变化或日志文件大小超过10M,自动生成新的日志文件
DatePattern = "yyyyMMdd\".txt\"", //如果日期发了变化,自动保存历史日志文件,并生成新的日志文件
MaxSizeRollBackups = , //保留几个历史日志文件
Layout = new PatternLayout("[%d{yyyy-MM-dd HH:mm:ss.fff}] [%t] %-5level %logger property:[%property{NDC}] - %message%newline") //%m表示日志内容
}; BasicConfigurator.Configure(appender);
appender.ActivateOptions();
} //为log4net添加不同类型的参数logger,用于配置选择哪种方式输出日志
SystemLog = LogManager.GetLogger("SystemLogger"); //返回或新建一个命名的logger对象
DatabaseLog = LogManager.GetLogger("DatabaseLogger");
} private static void WriteLog(ILog log, Level level, Exception exception, string message)
{
log.Logger.Log(declaringType, level, message, exception);
} #region 装饰器>>系统日志 public static void Debug(string message, Exception exception = null)
{
WriteLog(SystemLog, Level.Debug, exception, message);
} public static void Info(string message, Exception exception = null)
{
WriteLog(SystemLog, Level.Info, exception, message);
} public static void Warn(string message, Exception exception = null)
{
WriteLog(SystemLog, Level.Warn, exception, message);
} public static void Error(string message, Exception exception = null)
{
WriteLog(SystemLog, Level.Error, exception, message);
} public static void Fatal(string message, Exception exception = null)
{
WriteLog(SystemLog, Level.Fatal, exception, message);
} #endregion #region 装饰器>>数据库日志 public static void DatabaseInfo(string message, Exception exception = null)
{
WriteLog(DatabaseLog, Level.Info, exception, message);
} public static void DatabaseWarn(string message, Exception exception = null)
{
WriteLog(DatabaseLog, Level.Warn, exception, message);
} public static void DatabaseError(string message, Exception exception = null)
{
WriteLog(DatabaseLog, Level.Error, exception, message);
} #endregion
}
}

log4net 简易封装的更多相关文章

  1. 面localStorage用作数据缓存的简易封装

    面localStorage用作数据缓存的简易封装 最近做了一些前端控件的封装,需要用到数据本地存储,开始采用cookie,发现很容易就超过了cookie的容量限制,于是改用localStorage,但 ...

  2. log4net使用封装,无缝切换 dotnet 和 dotnetcore

    log4net使用封装,无缝切换 dotnet 和 dotnetcore Intro 自己有几个自己的小项目,有许多公用的方法/扩展/工具类等等,于是封装了一些常用的工具类/扩展方法 WeihanLi ...

  3. UITextField的简易封装

    UITextField的简易封装 效果 源码 https://github.com/YouXianMing/UI-Component-Collection 中的 UITextFieldView // ...

  4. AVAudioPlayer简易封装

    AVAudioPlayer简易封装 [说明] AVAudioPlayer简易封装,仅仅支持播放,暂停,停止,暂停时候带有渐隐效果,自己用,没有参考价值. [源码] https://github.com ...

  5. 对xlslib库与libxls库的简易封装

    一.简介 xlslib库是用来创建excel文件.libxls是用来读取excel文件的,在使用C++或者QT语言来设计对excel文件的读取.都需要事先下载这两个库编译成功后再进行程序设计的.之所以 ...

  6. node.js + mssql 简易封装操作

    时间吧,总是这么凑巧,在我学习[node.js]还没几天,我的 Microsoft SQL Server Management Studio 18 就歇菜了,至于怎么歇菜的吧....它可能的意思就是想 ...

  7. 基于Vue简易封装的快速构建Echarts组件 -- fx67llQuickEcharts

    fx67llQuickEcharts A tool to help you use Echarts quickly! npm 组件说明 这本来是一个测试如何发布Vue组件至npm库的测试项目 做完之后 ...

  8. jQuery版AJAX简易封装

    开发过程中,AJAX的应用应该说非常频繁,当然,jQuery的AJAX函数已经非常好用,但是小编还是稍微整理下,方便不同需求下,可以简化输入参数,下面是实例代码: $(function(){ /** ...

  9. 页面localStorage用作数据缓存的简易封装

    最近做了一些前端控件的封装,需要用到数据本地存储,开始采用cookie,发现很容易就超过了cookie的容量限制,于是改用localStorage,但localStorage过于简单,没有任何管理和限 ...

随机推荐

  1. Codeforces698C. LRU

    n<=20种东西,有个大小k<=n的箱子,每次会以固定的概率从所有东西里选一种,若箱子里有空位且这种东西没出现过就丢进去,若箱子满了且这种东西没出现过就把最早访问过的一个丢掉,(只要在每次 ...

  2. Access restriction: The type 'JPEGImageWriter' is not API

    报错: Access restriction: The type 'JPEGImageWriter' is not API due to restriction on required library ...

  3. android账号与同步之账号管理

    在android提供的sdk中,samples文件夹下有一个叫SampleSyncAdapter的演示样例,它是一个账号与同步的实例,比方Google原始的android手机能够使用Google账号进 ...

  4. 本地调用jni之VC++无法导入问题

    事实上非常easy,无法导入头文件就自己新建呗 1. 首先编写java代码 class Vrv { public native void printVersion(); static { System ...

  5. 使用heartbeat+monit实现主备双热备份系统

    一.使用背景 项目须要实现主备双热自己主动切换的功能,保证系统7*24小时不间断执行.现已有两台双网卡的IBM的server,为了不再添加成本採购独立外部存储设备和双机热备软件.採用了linux下开源 ...

  6. HDU 1047 Integer Inquiry 大数相加 string解法

    本题就是大数相加,题目都不用看了. 只是注意的就是HDU的肯爹输出,好几次presentation error了. 还有个特殊情况,就是会有空数据的输入case. #include <stdio ...

  7. 对“使用MyEclipse,写的jsp代码因有汉字而无法保存”问题的解决

    使用MyEclipse编辑jsp时.有时会出现"使用MyEclipse,写的jsp代码因有汉字而无法保存"的现象,怎样解决呢? Window-->Preferences--& ...

  8. spark hadoop 对比 Resilient Distributed Datasets

    hadoop 迭代消耗大 每次迭代启动一个完整的MapReduce作业 spark 首要目标就是避免运算时 过多的网络和磁盘IO开销 Resilient Distributed Datasets ht ...

  9. Ubuntu利用TCP协议来获取server时间

    Linux利用TCP协议来获取server时间 这里使用Unix网络编程里面的一个小程序,该client建立一个到server的TCP连接,然后读取由server以直观可读格式简单地送回的当前时间和日 ...

  10. luogu P4719 【模板】动态dp

    noip怎么考这种东西啊...看错题场上爆零凉了 首先我们先进行树链剖分,那么问题可以转换成重链的答案+其他子节点的答案 而每次修改相当于改一段重链的答案,改一次其他子节点的答案交替进行 这样只有一个 ...