.NET 定时执行写日志任务解决方案(Timer & Quartz.Net)

共有两种方法:

一。使用Timer

Global.asax.cs代码: Quartz是一个Java开源的作业调度框架。官方网站:http://www.opensymphony.com/quartz/

IBM网站上有一篇简单易懂的文章:http://www.ibm.com/developerworks/cn/java/j-quartz/

Quartz.net是从java版本移植到.net版本的。官方网站:http://quartznet.sourceforge.net/

引入命名空间:  System.IO;

protected void Application_Start(object sender, EventArgs e)
{                    
            System.Timers.Timer myTimer = new System.Timers.Timer(10000);
            myTimer.Elapsed += new System.Timers.ElapsedEventHandler(OnTimedEvent);
            myTimer.Interval = 10000;
            myTimer.Enabled = true;

  }

private static void OnTimedEvent(object source, System.Timers.ElapsedEventArgs e)
        {
               
            //指定日志文件的目录 
           string fileLogPath = AppDomain.CurrentDomain.BaseDirectory;
           string fileLogName = "LogProjectTest_" + DateTime.Now.ToLongDateString() + "_log.txt";
            /定义文件信息对象 
            FileInfo finfo = new FileInfo(fileLogPath + fileLogName);

            //创建只写文件流 
            using (FileStream fs = finfo.OpenWrite())
           {
               //根据上面创建的文件流创建写数据流 
                StreamWriter strwriter = new StreamWriter(fs);
                //设置写数据流的起始位置为文件流的末尾 
               strwriter.BaseStream.Seek(0, SeekOrigin.End);
               //写入错误发生时间 
                strwriter.WriteLine("发生时间: " + DateTime.Now.ToString());
              //写入日志内容并换行 
                strwriter.WriteLine("错误内容: " + message); 
                strwriter.WriteLine("错误内容: ");
               //写入间隔符 
                strwriter.WriteLine("---------------------------------------------");
                strwriter.WriteLine();
                //清空缓冲区内容,并把缓冲区内容写入基础流 
               strwriter.Flush();
                //关闭写数据流 
                strwriter.Close();
                fs.Close();
           }
        }

二,使用Quartz.Net

具体代码如下:

1.在项目添加引用:

  Quartz.dll

  Common.Logging.dll

2.创建一个普通类,实现Quartz.IJob接口

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Quartz;
using System.IO;
namespace EMailShechelTest
{
    public class WriteLogJob:IJob
    {
        public void Execute(JobExecutionContext context)
        {
         
            string fileLogPath = AppDomain.CurrentDomain.BaseDirectory;
            string fileLogName = "LogProject_" + DateTime.Now.ToLongDateString() + "_log.txt";
      
            FileInfo finfo = new FileInfo(fileLogPath + fileLogName);

            //创建只写文件流 
            using (FileStream fs = finfo.OpenWrite())
            {
                //根据上面创建的文件流创建写数据流 
                StreamWriter strwriter = new StreamWriter(fs);
                //设置写数据流的起始位置为文件流的末尾 
                strwriter.BaseStream.Seek(0, SeekOrigin.End);
                //写入错误发生时间 
                strwriter.WriteLine("发生时间: " + DateTime.Now.ToString());
                //写入日志内容并换行 
                //strwriter.WriteLine("错误内容: " + message); 
                strwriter.WriteLine("错误内容: ");
                //写入间隔符 
                strwriter.WriteLine("---------------------------------------------");
                strwriter.WriteLine();
                //清空缓冲区内容,并把缓冲区内容写入基础流 
                strwriter.Flush();
                //关闭写数据流 
                strwriter.Close();
                fs.Close();
            }
        }

    }
}

3.定义一个执行任务调度的类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Quartz;
using Quartz.Impl;
namespace EMailShechelTest
{
    public   class WriteLogScheduler
    {
        static ISchedulerFactory _sf = new StdSchedulerFactory();
        static IScheduler _sched = _sf.GetScheduler();
       
        static WriteLogScheduler _instance=null;
        static object lockObj=new object ();

        public static WriteLogScheduler Instance
        {
            get
            {               
                if (_instance == null)
                {
                    lock (lockObj)
                    {
                        if (_instance == null)
                        {                         
                            _instance = new WriteLogScheduler();
                        }
                    }
                }
                return _instance;
            }
        }

        public void Start()
        {
            JobDetail job = new JobDetail("WriteLog", "Log", typeof(WriteLogJob));
            DateTime start = TriggerUtils.GetNextGivenSecondDate(null, 5);

            TimeSpan interval = TimeSpan.FromSeconds(10);
            Trigger trigger = new SimpleTrigger("WriteLog", "Log", "WriteLog", "Log", start, null, 10, interval);


            _sched.AddJob(job, true);
            DateTime dt = _sched.ScheduleJob(trigger);
            _sched.Start();
        }
        public void Stop()
        {
            _sched.Shutdown(true);
        }

    }
}

4.在Global.asax.cs代码

protected void Application_Start(object sender, EventArgs e)
        {        

            WriteLogScheduler.Instance.Start();
        }

protected void Application_End(object sender, EventArgs e)
        {          
            WriteLogScheduler.Instance.Stop();
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值