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秒就會執行一次,並且是整時間執行,然后同時記錄的日志也顯示在了窗口中。(當然日志也會在本地的文件中記錄一份)
打開程序的根目錄就能發現記錄日志的文件夾與文件。