c# 控制台程序定时运行,并记录日志。
组件Quartz + log4net
Quartz定时运行程序,log4net记录日志。
首先建立控制台程序“QuartzTest”
安装Quartz、log4net这两个组件。如下图流程
安装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".log""/> <!--日志根据日期滚动--> <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>
为了方便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); } } }
现在所有的准备工作都做完啦。
然后添加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程序执行"); } } }
项目结构应该是这样子的
最后在控制台程序的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(); } } }
全都完毕以后就可以执行了,执行时候如下图,可以看到 每隔10秒就会执行一次,并且是整时间执行,然后同时记录的日志也显示在了窗口中。(当然日志也会在本地的文件中记录一份)
打开程序的根目录就能发现记录日志的文件夹与文件。