Quartz+log4net实现控制台程序定时运行,并且记录日志

c# 控制台程序定时运行,并记录日志。

组件Quartz + log4net

Quartz定时运行程序log4net记录日志

首先建立控制台程序“QuartzTest”

安装Quartzlog4net这两个组件。如下图流程

安装Quartz

安装log4net

安装完毕后引用里多了如下

然后在项目中添加log4net.config

并将log4net.config属性中的“复制到输出目录”设置为“始终复制

log4net.config中的XML文本如下

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  </configSections>

  <log4net>
    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
      <!--日志路径-->
      <param name= "File" value= "Logs\"/>
      <!--是否是向文件中追加日志-->
      <param name= "AppendToFile" value= "true"/>
      <!--log保留天数-->
      <param name= "MaxSizeRollBackups" value= "10"/>
      <!--日志文件名是否是固定不变的-->
      <param name= "StaticLogFileName" value= "false"/>
      <!--日志文件名格式为:2008-08-31.log-->
      <param name= "DatePattern" value= "yyyy-MM-dd&quot;.log&quot;"/>
      <!--日志根据日期滚动-->
      <param name= "RollingStyle" value= "Date"/>
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n %loggername" />
      </layout>
    </appender>

    <!-- 控制台前台显示日志 -->
    <appender name="ColoredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender">
      <mapping>
        <level value="ERROR" />
        <foreColor value="Red, HighIntensity" />
      </mapping>
      <mapping>
        <level value="Info" />
        <foreColor value="Green" />
      </mapping>
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%n%date{HH:mm:ss,fff} [%-5level] %m" />
      </layout>

      <filter type="log4net.Filter.LevelRangeFilter">
        <param name="LevelMin" value="Info" />
        <param name="LevelMax" value="Fatal" />
      </filter>
    </appender>

    <root>
      <!--(高) OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL (低) -->
      <level value="all" />
      <appender-ref ref="ColoredConsoleAppender"/>
      <appender-ref ref="RollingLogFileAppender"/>
    </root>
  </log4net>
</configuration>
View Code

为了方便log4net的使用,我添加了类LoggerManager,代码如下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using log4net;
using System.IO;

namespace QuartzTest
{
    public class LoggerManager
    {
        private ILog _logger = LogManager.GetLogger(typeof(Job));
        public LoggerManager()
        {
            log4net.Config.XmlConfigurator.ConfigureAndWatch(new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "log4net.config"));
        }

        public void Write(string message)
        {
            _logger.InfoFormat(message);
        }
    }
}
View Code

现在所有的准备工作都做完啦。

然后添加Job类(也就是定时执行的程序)继承与IJob 代码如下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Quartz;
using log4net;

namespace QuartzTest
{
    public class Job : IJob
    {
        private readonly ILog _logger = LogManager.GetLogger(typeof(Job));
        /// <summary>
        /// 每到设定好的时间都会自动执行此程序
        /// </summary>
        public void Execute(IJobExecutionContext context)
        {
            _logger.InfoFormat("Job程序执行");
        }

    }
}
View Code

项目结构应该是这样子的

 

最后在控制台程序的Program中的main函数下配置Quartz,通过其定时执行Job

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Quartz;
using log4net;
using Quartz.Impl;

namespace QuartzTest
{
    class Program
    {
        static void Main(string[] args)
        {
            LoggerManager log = new LoggerManager();
            log.Write("监测程序正在运行,每到设定好的时间就会自动执行“Job程序”");

            //实例化Quartz调度器工厂
            ISchedulerFactory sf = new StdSchedulerFactory();
            //通过工厂获取调度器
            IScheduler sched = sf.GetScheduler();
            //配置作业
            IJobDetail job = new JobDetailImpl("AutoExecute", "group_AutoExecute", typeof(Job));

            //配置触发器,使用简单触发器,间隔10秒触发一次,无限次触发

            ITrigger t = TriggerBuilder.Create()
                        .WithIdentity("AutoExecute_JobTrigger1").ForJob(job)
                        .WithDailyTimeIntervalSchedule(p =>
                            p.StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(0, 0))
                            .EndingDailyAt(TimeOfDay.HourAndMinuteOfDay(23, 59))
                            .WithIntervalInSeconds(10).OnEveryDay()
                            ).Build();

            //触发器和作业绑定
            sched.ScheduleJob(job, t);
            sched.Start();
        }
    }
}
View Code

全都完毕以后就可以执行了,执行时候如下图,可以看到 每隔10秒就会执行一次,并且是整时间执行,然后同时记录的日志也显示在了窗口中。(当然日志也会在本地的文件中记录一份)

打开程序的根目录就能发现记录日志的文件夹与文件。

 

 

posted @ 2016-11-09 17:22  小尹同学  阅读(6025)  评论(1编辑  收藏  举报