zoukankan      html  css  js  c++  java
  • 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秒就会执行一次,并且是整时间执行,然后同时记录的日志也显示在了窗口中。(当然日志也会在本地的文件中记录一份)

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

  • 相关阅读:
    ajax chrome load
    不一样的自拍
    jQuery点击空白关闭弹出层
    笔记整理
    带三角缺口的边框
    连续input在同一行对齐问题
    用Windows PowerShell 控制管理 Microsoft Office 365
    Qt and C++ Reflection,利用Qt简化C++的反射实现
    滴滴打车推出的“专车服务”后的见闻以及思考
    Exchange的AutoDiscover服务
  • 原文地址:https://www.cnblogs.com/yinq/p/6047797.html
Copyright © 2011-2022 走看看