玩转Log4Net
下载Log4Net

下载地址:http://logging.apache.org/log4net/download_log4net.cgi

把下载的  log4net-1.2.11-bin-newkey解压后,如下图所示:

双击bin文件夹

双击net文件夹,选择针对.NET FramerWork的不同版本

找到相应版本的log4net.dll

创建LogHelper类库 {生成dll便于多个项目引用}

 
{这里实现 错误日志和记录日志两个功能}
 using log4net;//引用上面的log4net.dll
 using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace LogHelper
{
    public class Log : ApplicationException//自己定义的类log,继承ApplicationException,来实现自己定义的功能
    {
        private static ILog ErrorLog;//错误日志
        private static ILog RecordLog;//记录日志
        static Log()//静态构造函数的好处是只在使用它的程序中,在第一次new的时候在这里初始化信息;不然每次new就需要初始化一次
        {
            string configFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "log4net.config");//在需要使用log4net功能的项目中,根目录下配置log4net.config{新建项配置文件},引用这个类;就能够实现日志功能
            if (!File.Exists(configFile))
            {
                throw new System.Exception("log4net Config File Not Found");
            }
            log4net.Config.XmlConfigurator.ConfigureAndWatch(new FileInfo(configFile));
            ErrorLog = log4net.LogManager.GetLogger("ErrorLog");
            RecordLog = log4net.LogManager.GetLogger("RecordLog");
        }//
 
        public static void WriteError(string error)
        {
            if (ErrorLog.IsErrorEnabled)
            {
                ErrorLog.Error(error);
            }
        }
        public static void WriteRecord(string record)
        {
            if (RecordLog.IsInfoEnabled)
            {
                RecordLog.Info(record);
            }
        }
        //其他功能...
 
    }
}

模拟项目引用 logherlper类库

 protected void Page_Load(object sender, EventArgs e)//aspx页面
        {
//引用 LogHelper.dll
            try
            {
                int a = 0;
                int c = 10 / a;
            }
            catch (Exception ex)
            {
                Log.WriteError(ex.Message);//异常情况下记录错误日志
            }
            Log.WriteRecord("模拟记录数据");
     
            Response.Write(1111);
        }

在aspx页面所在的项目中配置Log4net

新建项---web配置文件----命名为 log4net.config{需要和LOghelper中的名字对应}-----配置如下

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  
  <!--【Log4Net配置开始】-->
  
  <configSections>
    
    <!--【这句话直接粘即可】-->
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
  </configSections>
 
  <log4net debug="true">
    <!--【debug="true"便于调试;在正式发布的情况下为了安全起见,需要改为false!!!】-->
    
    <appender name="ErrorLogFile" type="log4net.Appender.RollingFileAppender">
      <!--<file value="applicationLog.log" />   -->
      <file type="log4net.Util.PatternString"  value="E:\Codes\Log4NetDemo\Log4NetDemo\%date{yyyy}\%date{MM}\error_log%date{yyyy-MM-dd}.log" />
      <!--
      【ErrorLogFile是为此appender节点起的名字,下面的Logger节点需要用到这个name;】
      
      【file可以指定具体的路径 eg : d:\\test.log。不指定的话log被生成在项目的bin/Debug 或者 bin/Release目录下 (web的项目 默认生成在根目录下);applicationLog.log就是生成的日志文件的名称】
      
      【File在实际开发的情况下,日志可能比较多,就需要分类文件夹来进行管理,使用type属性,value指定中使用%date{}的方式就可以指定自动创建文件夹和文件,存在的话不会再创建】
      -->
      <appendToFile value="true" />
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="10" />
      <!--【备份log文件的个数最多10个】-->
      
      <maximumFileSize value="2MB" />
      <!--【每个log文件最大是2M,如果超过2M将重新创建一个新的log文件,并将原来的log文件备份。】-->
      
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.PatternLayout">
        
        <conversionPattern value="[%date]  %thread -- %-5level -- %logger [%M] -- %message%newline" />
        <!--指定log的格式【conversionPattern这里同样是通过%组合log4定义的特殊意义的标记来组合,日志要呈现的结果;这样的格式就很好,一般就这个不用动就行】-->
 
      </layout>
    </appender>
 
 
    <!--【如果是想实现功能的分类处理,比如 错误的error一类 记录的record一类;多个功能配置只需要再罗列appender和对应的logger节点即可】如之 罗列的appender节点-->
    
    <appender name="RecordLogFile" type="log4net.Appender.RollingFileAppender">
      <file type="log4net.Util.PatternString"  value="E:\Codes\Log4NetDemo\Log4NetDemo\%date{yyyy}\%date{MM}\record_log%date{yyyy-MM-dd}.log" />
     
      <appendToFile value="true" />
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="10" />
      <maximumFileSize value="2MB" />
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="[%date]  %thread -- %-5level -- %logger [%M] -- %message%newline" />
       
      </layout>
    </appender>
    <!--【如果是想实现功能的分类处理,比如 错误的error一类 记录的record一类;多个功能配置只需要再罗列appender和对应的logger节点即可】-->
 
    
    <!--【logger的name,在c#代码中getlogger(name)来获取配置的对象】-->
    <logger name="ErrorLog">
      <level value="1"/>
      <!--【ref指向关联的appender的name】-->
      <appender-ref ref="ErrorLogFile"/>
    </logger>
    <!--【如果是想实现功能的分类处理,比如 错误的error一类 记录的record一类;多个功能配置只需要再罗列appender和对应的logger节点即可】如之 罗列的logger节点-->
    <logger name="RecordLog">
      <level value="2"/>
      <!--【ref指向关联的appender的name】-->
      <appender-ref ref="RecordLogFile"/>
    </logger>
    <!--【如果是想实现功能的分类处理,比如 错误的error一类 记录的record一类;多个功能配置只需要再罗列appender和对应的logger节点即可】如之 罗列的logger节点-->
    
  </log4net>
</configuration>

=========》ok

global页面访问(全局)异常处理

新建项---全局异常信息类---
Global.asax.cs 
只能出现一个
只能出现在根目录下
只能是默认的Global名字 

里面有很多事件,程序第一次运行执行的事件,session开始时执行的事件,页面访问异常执行的事件。。。
其中  protected void Application_Error(object sender, EventArgs e)是异常触发的事件

可以这样处理获取全局异常
 
   // 在出现未处理的错误时运行的代码 
            Exception ex = Server.GetLastError().GetBaseException();
            StringBuilder str = new StringBuilder();
            str.Append("\r\n" + DateTime.Now.ToString("yyyy.MM.dd HH:mm:ss"));
            str.Append("\r\n.客户信息:");
            string ip = "";
            if (Request.ServerVariables.Get("HTTP_X_FORWARDED_FOR") != null)
            {
                ip = Request.ServerVariables.Get("HTTP_X_FORWARDED_FOR").ToString().Trim();
            }
            else
            {
                ip = Request.ServerVariables.Get("Remote_Addr").ToString().Trim();
            }
            str.Append("\r\n\tIp:" + ip);
            str.Append("\r\n\t浏览器:" + Request.Browser.Browser.ToString());
            str.Append("\r\n\t浏览器版本:" + Request.Browser.MajorVersion.ToString());
            str.Append("\r\n\t操作系统:" + Request.Browser.Platform.ToString());
            str.Append("\r\n.错误信息:");
            str.Append("\r\n\t页面:" + Request.Url.ToString());
            str.Append("\r\n\t错误信息:" + ex.Message);
            str.Append("\r\n\t错误源:" + ex.Source);
            str.Append("\r\n\t异常方法:" + ex.TargetSite);
            str.Append("\r\n\t堆栈信息:" + ex.StackTrace);
            str.Append("\r\n--------------------------------");
 
            Log.WriteError(ip + str.ToString());
            Response.Redirect("error.html");//跳转到指定的页面;1友好2信息安全
注:在调试的时候,可能全局异常不起作用,还是报异常,把之部署在iis上就好了 

如 上面的页面 

  Response.Write(1111);前面写上   Int a2 = 0; int   c2 = 9/a2;  访问这个aspx时就会跳转到error.html 并会走application_error记录下日志

========

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Quartz;
using Quartz.Impl;
using Quartz.Xml;
using Quartz.Simpl;
using log4net;
using System.IO;
 
namespace Log42Quartz
{
    class Program
    {
        static void Main(string[] args)
        {
            /*
            //纯代码版本
            //==========================================================
            ISchedulerFactory schedFact = new StdSchedulerFactory();
            IScheduler sched = schedFact.GetScheduler();
            sched.Start();
            IJobDetail job = JobBuilder.Create<MyJob1>()
               // .WithIdentity("myJob", "group1")
                                     .Build();
            //DateTimeOffset startTime = DateBuilder.NextGivenSecondDate(DateTime.Now.AddSeconds(1), 2);
            //DateTimeOffset endTime = DateBuilder.NextGivenSecondDate(DateTime.Now.AddHours(2), 3);
 
            ITrigger trigger = TriggerBuilder.Create()
                //.StartAt(startTime).EndAt(endTime) 
                                         .StartNow()
                .WithIdentity("myTriger", "group1")
                //.WithSimpleSchedule(x => x.WithIntervalInSeconds(10)
                //.RepeatForever())//适合 【每隔】 多少时间
                                         .WithCronSchedule("/3 * * * * ?")//适合 【具体时间】 如 2015年9月每周3的12点;也可以/设置每隔多长时间
                                         .Build();
            //异常  Support for specifying both a day-of-week AND a day-of-month parameter is not implemented.
            //当日和星期都是 * 和 都是 ?时,会报此错
            sched.ScheduleJob(job, trigger);
         
           
            //【多个任务继续添加,IJobDetail和ITrigger即可~】
 
 
            IJobDetail job2 = JobBuilder.Create<MyJob2>().Build();
            ITrigger trigger2 = TriggerBuilder.Create().StartNow().WithCronSchedule("/3 * * * * ?").Build();
            sched.ScheduleJob(job2, trigger2);
            //==========================================================
             * */
 
 
            //配置文件版本==================================================================
            XMLSchedulingDataProcessor processor = new XMLSchedulingDataProcessor(new SimpleTypeLoadHelper());
            ISchedulerFactory sf = new StdSchedulerFactory();
            IScheduler scheduler = sf.GetScheduler();
            string path = System.AppDomain.CurrentDomain.BaseDirectory;
 
 
            processor.ProcessFileAndScheduleJobs(path + "\\quar.xml", scheduler);
 
            Log4Help.WriteRecord("开始执行");
            scheduler.Start();
 
 
 
 
 
        }
    }
 
 
    /// <summary>
    /// 模拟任务1
    /// </summary>
    public class MyJob1 : IJob
    {
        static int count = 0;
        public void Execute(IJobExecutionContext context)
        {
            count++;
            Console.WriteLine("任务1执行--" + count);
        }
    }
 
 
    /// <summary>
    /// 模拟任务2
    /// </summary>
    public class MyJob2 : IJob
    {
        static int count = 0;
        public void Execute(IJobExecutionContext context)
        {
            count++;
            Console.WriteLine("任务2执行--" + count);
        }
    }
 
    public class Log4Help
    {
        private static ILog ErrorLog;//错误日志
        private static ILog RecordLog;//记录日志
        static Log4Help()//静态构造函数的好处是只在使用它的程序中,在第一次new的时候在这里初始化信息;不然每次new就需要初始化一次
        {
            string configFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "log4net.config");//在需要使用log4net功能的项目中,根目录下配置log4net.config{新建项配置文件},引用这个类;就能够实现日志功能
            if (!File.Exists(configFile))
            {
                throw new System.Exception("log4net Config File Not Found");
            }
            log4net.Config.XmlConfigurator.ConfigureAndWatch(new FileInfo(configFile));
            ErrorLog = log4net.LogManager.GetLogger("ErrorLog");
            RecordLog = log4net.LogManager.GetLogger("RecordLog");
        }//
 
        public static void WriteError(string error)
        {
            if (ErrorLog.IsErrorEnabled)
            {
                ErrorLog.Error(error);
            }
        }
        public static void WriteRecord(string record)
        {
            if (RecordLog.IsInfoEnabled)
            {
                RecordLog.Info(record);
            }
        }
        //其他功能...
 
    }
}

配置文件

<?xml version="1.0" encoding="utf-8" ?>
 
<processing-directives>
<overwrite-existing-data>true</overwrite-existing-data>
</processing-directives>
 
<schedule>
 
<job>
<name>MyJob1</name>
<group>sampleGroup</group>
<description>Sample job for Quartz Server</description>
<job-type>Log42Quartz.MyJob1,Log42Quartz</job-type>
 
<!--MyTest.sampleJob    [width namespace classname] ,-->  
<durable>true</durable>
<recover>false</recover>
</job>
<job>
<name>MyJob2</name>
<group>sampleGroup</group>
<description>Sample job for Quartz Server</description>
<job-type>Log42Quartz.MyJob2,Log42Quartz</job-type>
 
<!--MyTest.sampleJob    [width namespace classname] ,  -->
<durable>true</durable>
<recover>false</recover>
</job>
 
<trigger>
<!--<simple>
<name>sampleSimpleTrigger</name>
<group>sampleSimpleGroup</group>
<description>Simple trigger to simply fire sample job</description>
<job-name>sampleJob</job-name>
<job-group>sampleGroup</job-group>
<misfire-instruction>SmartPolicy</misfire-instruction>
<repeat-count>-1</repeat-count>
<repeat-interval>1000</repeat-interval>
<cron-expression>2 * * * * ?</cron-expression>
 
</simple>-->
 
 
<cron>
<name>sampleSimpleTrigger</name>
<group>sampleSimpleGroup</group>
<description>Simple trigger to simply fire sample job</description>
<job-name>MyJob1</job-name>
<job-group>sampleGroup</job-group>
<misfire-instruction>SmartPolicy</misfire-instruction>
<cron-expression>0/2 * * * * ?</cron-expression>
</cron>
 
</trigger>
 
 
<!--more-->
 
<trigger>
<cron>
<name>sampleSimpleTrigger2</name>
<!--多个任务时,触发器名字不能重复-->
<group>sampleSimpleGroup</group>
<!--可以重复-->
<description>Simple trigger to simply fire sample job</description>
<!--可填写可不填-->
<job-name>MyJob2</job-name>
<!--和要执行的任务的name保持一致-->
<job-group>sampleGroup</job-group>
<!--可以重复-->
<misfire-instruction>SmartPolicy</misfire-instruction>
<cron-expression>0/3 * * * * ?</cron-expression>
</cron>
</trigger>
 
 
</schedule>
 
</job-scheduling-data>

玩转Log4Net的更多相关文章

  1. ExceptionLess新玩法 — 记日志

    ExceptionLess 之前也有介绍过这个框架,其实网上也有很多的资料,无论是部署还是一些详细的高级玩法都讲的很清楚也很棒,博主也学习了一些他们的博文,因为很多的东西比如本地部署别人已经写了,我再 ...

  2. 使用log4net写自定义日志

    在使用log4net写Web服务器端日志的时候,通常需要一些自定义的参数,比如请求的url,method,以及用户名等等,而log4net中默认的Log接口只提供了很少的参数.    在网上找的其他的 ...

  3. 性能秒杀log4net的NLogger日志组件(附测试代码与NLogger源码)

    NLogger特性: 一:不依赖于第三方插件和支持.net2.0 二:支持多线程高并发 三:读写双缓冲对列 四:自定义日志缓冲大小 五:支持即时触发刷盘机制 六:先按日期再按文件大小滚动Rolling ...

  4. Asp.net MVC + Redis(hash入库+log4net集成)

    博客四元素 既然要写一个博客类的网站,那就应该知道博客的相关信息. 标题 作者 时间 内容 title author time content 因为之前有了解过Redis,所以有点纠结于数据的存储方式 ...

  5. log4net 极简配置

    log4net的配置详解 分类: C#2013-10-01 22:45 5335人阅读 评论(4) 收藏 举报 log4net日志框架         前言:没买到1号回家的票,所以在祖国64岁生日之 ...

  6. 玩转spring boot——快速开始

    开发环境: IED环境:Eclipse JDK版本:1.8 maven版本:3.3.9 一.创建一个spring boot的mcv web应用程序 打开Eclipse,新建Maven项目 选择quic ...

  7. [C#] 软硬结合第二篇——酷我音乐盒的逆天玩法

    1.灵感来源: LZ是纯宅男,一天从早上8:00起一直要呆在电脑旁到晚上12:00左右吧~平时也没人来闲聊几句,刷空间暑假也没啥动态,听音乐吧...~有些确实不好听,于是就不得不打断手头的工作去点击下 ...

  8. [C#] 了解过入口函数 Main() 吗?带你用批处理玩转 Main 函数

    了解过入口函数 Main() 吗?带你用批处理玩转 Main 函数 目录 简介 特点 方法的参数 方法的返回值 与批处理交互的一个示例 简介 我们知道,新建一个控制台应用程序的时候,IDE 会同时创建 ...

  9. 玩转spring boot——开篇

    很久没写博客了,而这一转眼就是7年.这段时间并不是我没学习东西,而是园友们的技术提高的非常快,这反而让我不知道该写些什么.我做程序已经有十几年之久了,可以说是彻彻底底的“程序老炮”,至于技术怎么样?我 ...

随机推荐

  1. linux 第一次获得root权限

    开机进入桌面,ctrl+alt+T打开终端————在此时终端显示的是 用户名@电脑名:-$   表示普通用户   在此处输入:sudo passwd root   此时提示———— [sudo] pa ...

  2. 神奇的CSS3选择器

    话说园子里也混迹多年了,但是基本没写过blog,写点基础的,那就从css3选择器开始吧. Css3选择器 先说下,为什么提倡使用选择器. 使用选择器可以将样式与元素直接绑定起来,在样式表中什么样式与什 ...

  3. Tomcat - 设置 HTTP 摘要认证

    在 Tomcat 中设置 HTTP 摘要认证的示例 在 Tomcat 中设置摘要认证与设置基本认证几乎一样,差别在于配置 web.xml 时,<login-config/> 元素在指定认证 ...

  4. Spring(3.2.3) - Beans(8): 基于 Annotation 的配置

    除了基于 XML 的配置外,Spring 也支持基于 Annotation 的配置.Spring 提供以下介个 Annotation 来标注 Spring Bean: @Component:标注一个普 ...

  5. Git CMD - rm: Remove files from the working tree and from the index

    命令格式 git rm [-f | --force] [-n] [-r] [--cached] [--ignore-unmatch] [--quiet] [--] <file>…​ 命令参 ...

  6. 和阿文一起学H5--设计稿尺寸全攻略

  7. sql常识-like

    LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式. LIKE 操作符 LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式. SQL LIKE 操作符语法 SELECT colum ...

  8. android结束进程、退出application的方法

    1.finish()方法 finish是Activity的类,仅仅针对Activity,当调用finish()时,只是将活动推向后台,并没有立即释放内存,活动的资源并没有被清理:调用finish()方 ...

  9. 直接拿来用,最火的.NET开源项目(beta)

    转自:http://blog.csdn.net/ltylove2007/article/details/18656971 综合类 微软企业库 微软官方出品,是为了协助开发商解决企业级应用开发过程中所面 ...

  10. (转) DockPanel 右键增加关闭,除此之外全部关闭的功能

    在项目中新建一个class文件,代码如下: using System; using System.Collections.Generic; using System.ComponentModel; u ...