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

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

  • 相关阅读:
    什么样的代码称得上是好代码?
    九年程序人生 总结分享
    Docker入门 第一课 --.Net Core 使用Docker全程记录
    阿里云 Windows Server 2012 r2 部署asp.net mvc网站 平坑之旅
    Visual studio 2015 Community 安装过程中遇到问题的终极解决
    Activiti6.0 spring5 工作流引擎 java SSM流程审批 项目框架
    java 进销存 库存管理 销售报表 商户管理 springmvc SSM crm 项目
    Leetcode名企之路
    24. 两两交换链表中的节点
    21. 合并两个有序链表
  • 原文地址:https://www.cnblogs.com/yinq/p/6047797.html
Copyright © 2011-2022 走看看