Log4Net
配置:
在app.config或者web.config文件中加入以下配置节
<configuration>
<configSections>
<section
name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<log4net>
<root>
<level value="ALL" />
<appender-ref ref="RollingLogFileAppender" />
</root>
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender" >
<param name="File" value="log-data\rollinglog" />
<param name="AppendToFile" value="true" />
<param name="MaxSizeRollBackups" value="10"/>
<param name="StaticLogFileName" value="false"/>
<param name="DatePattern" value="yyyyMMdd".log"" />
<param name="RollingStyle" value="Date"/>
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %-5p %c [%x] <%X{auth}>%n - %m%n" />
</layout>
</appender>
</log4net>
</configuration>
在AssemblyInfo.cs文件中加入以下代码行:否则日志无法输出
[assembly: log4net.Config.DOMConfigurator(ConfigFileExtension = "config", Watch = true)]
或者初始化的时候手工加载:
string assemblyFilePath = Assembly.GetExecutingAssembly().Location;
string assemblyDirPath = Path.GetDirectoryName(assemblyFilePath);
FileInfo file = new FileInfo(Path.Combine(assemblyDirPath,"App.config"));
DOMConfigurator.ConfigureAndWatch(file);
QuartZ.Net
资料:
官网:http://quartznet.sourceforge.net
博客:http://www.cnblogs.com/shanyou/category/102991.html
几个重要的对象:
1、作业调度器接口 IScheduler:这个接口负责启动一个作业和关闭一个作业,在启动和关闭作业之前,它还需要接受两个东西,一个是触发器(Trigger),一个是工作任务(JobDetail),要得到一个这样的接口的实例,我们还需要一个作业调度器工厂(ISchedulerFactory)。
2、作业调度器工厂接口 ISchedulerFactory:从命名来看,很明显是个工厂,专门产出IScheduler接口。
3、工作任务 JobDetail:它定义了你要定时去做什么工作,初始化一个该类的对象,我们要指定工作名(name),工作的组名(group),还有就是一个实现了IJob接口的类的类型(Type),就是说JobD定义的是做什么。
4、触发器 Trigger:据说Quartz.NET的触发器有很多,但是一般我们使用的是两种(都是继承了Trigger类的子类),一个是CronTrigger、另外一个是SimpleTrigger,我们要指定触发器名(name),触发器的的职责是定义工作任务的触发规则,也就是说Trigger定义的是啥时候做。
5、工作接口 IJob:我们需要把定时要做的事情(业务逻辑,例如去写一下数据库,写一下文件之类的)包装在一个类里面,这个类有一个特点,就是继承IJob这个接口,实现该接口的唯一方法Execute(JobExecutionContext context),在这个方法中将尽情地用代码实现我们的业务,所以可以说这个接口定义的是如何做。
代码手工定义任务:
任务定义:
public class SimpleJob:IJob
{
private static ILog log = LogManager.GetLogger(typeof(SimpleJob));
#region IJob Members
void IJob.Execute(JobExecutionContext context)
{
try
{
string jobName = context.JobDetail.FullName;
log.Info("Executing job: " + jobName + " executing at " + DateTime.Now.ToString());
}
catch (Exception e)
{
log.Info("--- Error in job!");
JobExecutionException e2 = new JobExecutionException(e);
// this job will refire immediately
e2.RefireImmediately = true;
throw e2;
}
}
#endregion
}
任务调度:
//初始化调度器
ISchedulerFactory sf = new StdSchedulerFactory();
IScheduler sched = sf.GetScheduler();
//初始化工作任务
JobDetail job = new JobDetail("myjob", "group", typeof(SimpleJob));
//触发器
Trigger trigger = TriggerUtils.MakeSecondlyTrigger(5);
trigger.Name = "mytrigger";
DateTime ft = sched.ScheduleJob(job, trigger);
//启动
sched.Start();
//停止
sched.Shutdown(true);
通过配置文件定义任务:
主配置文件:App.config
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
<section name="quartz" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<sectionGroup name="common">
<section name="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging" />
</sectionGroup>
</configSections>
<log4net>
<root>
<level value="ALL" />
<appender-ref ref="RollingLogFileAppender" />
</root>
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender" >
<param name="File" value="log-data\rollinglog" />
<param name="AppendToFile" value="true" />
<param name="MaxSizeRollBackups" value="10"/>
<param name="StaticLogFileName" value="false"/>
<param name="DatePattern" value="yyyyMMdd".log"" />
<param name="RollingStyle" value="Date"/>
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %-5p %c [%x] <%X{auth}>%n - %m%n" />
</layout>
</appender>
</log4net>
<common>
<logging>
<factoryAdapter type="Common.Logging.Simple.ConsoleOutLoggerFactoryAdapter, Common.Logging">
<arg key="showLogName" value="true"/>
<arg key="showDataTime" value="true"/>
<arg key="level" value="DEBUG"/>
<arg key="dateTimeFormat" value="HH:mm:ss:fff"/>
</factoryAdapter>
</logging>
</common>
<quartz>
<add key="quartz.scheduler.instanceName" value="ExampleDefaultQuartzScheduler"/>
<add key="quartz.threadPool.type" value="Quartz.Simpl.SimpleThreadPool, Quartz"/>
<add key="quartz.threadPool.threadCount" value="10"/>
<add key="quartz.threadPool.threadPriority" value="2"/>
<add key="quartz.jobStore.misfireThreshold" value="60000"/>
<add key="quartz.jobStore.type" value="Quartz.Simpl.RAMJobStore, Quartz"/>
</quartz>
</configuration>
任务、定时器配置文件:
quartz_jobs.xml
<quartz xmlns="http://quartznet.sourceforge.net/JobSchedulingData"
xmlns
si="http://www.w3.org/2001/XMLSchema-instance"
version="1.0"
overwrite-existing-jobs="true">
<calendar type="Quartz.Impl.Calendar.AnnualCalendar, Quartz" replace="false">
<name>cal1</name>
<description>description0</description>
<base-calendar type="Quartz.Impl.Calendar.WeeklyCalendar, Quartz" replace="false">
<name>name1</name>
<description>description1</description>
</base-calendar>
</calendar>
<calendar type="Quartz.Impl.Calendar.AnnualCalendar, Quartz" replace="false">
<name>cal2</name>
<description>description0</description>
<base-calendar type="Quartz.Impl.Calendar.WeeklyCalendar, Quartz" replace="false">
<name>name1</name>
<description>description1</description>
</base-calendar>
</calendar>
<job>
<job-detail>
<name>jobName1</name>
<group>jobGroup1</group>
<description>jobDesciption1</description>
<job-type>CommonlogDemo.SimpleJob, CommonlogDemo</job-type>
<volatile>false</volatile>
<durable>true</durable>
<recover>false</recover>
<job-data-map>
<entry>
<key>key0</key>
<value>value0</value>
</entry>
<entry>
<key>key1</key>
<value>value1</value>
</entry>
<entry>
<key>key2</key>
<value>value2</value>
</entry>
</job-data-map>
</job-detail>
<trigger>
<simple>
<name>simpleName</name>
<group>simpleGroup</group>
<description>SimpleTriggerDescription</description>
<misfire-instruction>SmartPolicy</misfire-instruction>
<calendar-name>cal1</calendar-name>
<volatile>false</volatile>
<job-name>jobName1</job-name>
<job-group>jobGroup1</job-group>
<start-time>1982-06-28T18:15:00.0Z</start-time>
<end-time>2015-05-04T18:13:51.0Z</end-time>
<repeat-count>100</repeat-count>//调度次数
<repeat-interval>3000</repeat-interval>//3秒
</simple>
</trigger>
<trigger>
<cron>
<name>cronName</name>
<group>cronGroup</group>
<job-name>jobName1</job-name>
<job-group>jobGroup1</job-group>
<start-time>1982-06-28T18:15:00+02:00</start-time>
<cron-expression>0/10 * * * * ?</cron-expression>//每10秒钟
</cron>
</trigger>
</job>
</quartz>
配置:
在app.config或者web.config文件中加入以下配置节
<configuration>
<configSections>
<section
name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<log4net>
<root>
<level value="ALL" />
<appender-ref ref="RollingLogFileAppender" />
</root>
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender" >
<param name="File" value="log-data\rollinglog" />
<param name="AppendToFile" value="true" />
<param name="MaxSizeRollBackups" value="10"/>
<param name="StaticLogFileName" value="false"/>
<param name="DatePattern" value="yyyyMMdd".log"" />
<param name="RollingStyle" value="Date"/>
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %-5p %c [%x] <%X{auth}>%n - %m%n" />
</layout>
</appender>
</log4net>
</configuration>
在AssemblyInfo.cs文件中加入以下代码行:否则日志无法输出
[assembly: log4net.Config.DOMConfigurator(ConfigFileExtension = "config", Watch = true)]
或者初始化的时候手工加载:
string assemblyFilePath = Assembly.GetExecutingAssembly().Location;
string assemblyDirPath = Path.GetDirectoryName(assemblyFilePath);
FileInfo file = new FileInfo(Path.Combine(assemblyDirPath,"App.config"));
DOMConfigurator.ConfigureAndWatch(file);
QuartZ.Net
资料:
官网:http://quartznet.sourceforge.net
博客:http://www.cnblogs.com/shanyou/category/102991.html
几个重要的对象:
1、作业调度器接口 IScheduler:这个接口负责启动一个作业和关闭一个作业,在启动和关闭作业之前,它还需要接受两个东西,一个是触发器(Trigger),一个是工作任务(JobDetail),要得到一个这样的接口的实例,我们还需要一个作业调度器工厂(ISchedulerFactory)。
2、作业调度器工厂接口 ISchedulerFactory:从命名来看,很明显是个工厂,专门产出IScheduler接口。
3、工作任务 JobDetail:它定义了你要定时去做什么工作,初始化一个该类的对象,我们要指定工作名(name),工作的组名(group),还有就是一个实现了IJob接口的类的类型(Type),就是说JobD定义的是做什么。
4、触发器 Trigger:据说Quartz.NET的触发器有很多,但是一般我们使用的是两种(都是继承了Trigger类的子类),一个是CronTrigger、另外一个是SimpleTrigger,我们要指定触发器名(name),触发器的的职责是定义工作任务的触发规则,也就是说Trigger定义的是啥时候做。
5、工作接口 IJob:我们需要把定时要做的事情(业务逻辑,例如去写一下数据库,写一下文件之类的)包装在一个类里面,这个类有一个特点,就是继承IJob这个接口,实现该接口的唯一方法Execute(JobExecutionContext context),在这个方法中将尽情地用代码实现我们的业务,所以可以说这个接口定义的是如何做。
代码手工定义任务:
任务定义:
public class SimpleJob:IJob
{
private static ILog log = LogManager.GetLogger(typeof(SimpleJob));
#region IJob Members
void IJob.Execute(JobExecutionContext context)
{
try
{
string jobName = context.JobDetail.FullName;
log.Info("Executing job: " + jobName + " executing at " + DateTime.Now.ToString());
}
catch (Exception e)
{
log.Info("--- Error in job!");
JobExecutionException e2 = new JobExecutionException(e);
// this job will refire immediately
e2.RefireImmediately = true;
throw e2;
}
}
#endregion
}
任务调度:
//初始化调度器
ISchedulerFactory sf = new StdSchedulerFactory();
IScheduler sched = sf.GetScheduler();
//初始化工作任务
JobDetail job = new JobDetail("myjob", "group", typeof(SimpleJob));
//触发器
Trigger trigger = TriggerUtils.MakeSecondlyTrigger(5);
trigger.Name = "mytrigger";
DateTime ft = sched.ScheduleJob(job, trigger);
//启动
sched.Start();
//停止
sched.Shutdown(true);
通过配置文件定义任务:
主配置文件:App.config
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
<section name="quartz" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<sectionGroup name="common">
<section name="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging" />
</sectionGroup>
</configSections>
<log4net>
<root>
<level value="ALL" />
<appender-ref ref="RollingLogFileAppender" />
</root>
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender" >
<param name="File" value="log-data\rollinglog" />
<param name="AppendToFile" value="true" />
<param name="MaxSizeRollBackups" value="10"/>
<param name="StaticLogFileName" value="false"/>
<param name="DatePattern" value="yyyyMMdd".log"" />
<param name="RollingStyle" value="Date"/>
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %-5p %c [%x] <%X{auth}>%n - %m%n" />
</layout>
</appender>
</log4net>
<common>
<logging>
<factoryAdapter type="Common.Logging.Simple.ConsoleOutLoggerFactoryAdapter, Common.Logging">
<arg key="showLogName" value="true"/>
<arg key="showDataTime" value="true"/>
<arg key="level" value="DEBUG"/>
<arg key="dateTimeFormat" value="HH:mm:ss:fff"/>
</factoryAdapter>
</logging>
</common>
<quartz>
<add key="quartz.scheduler.instanceName" value="ExampleDefaultQuartzScheduler"/>
<add key="quartz.threadPool.type" value="Quartz.Simpl.SimpleThreadPool, Quartz"/>
<add key="quartz.threadPool.threadCount" value="10"/>
<add key="quartz.threadPool.threadPriority" value="2"/>
<add key="quartz.jobStore.misfireThreshold" value="60000"/>
<add key="quartz.jobStore.type" value="Quartz.Simpl.RAMJobStore, Quartz"/>
</quartz>
</configuration>
任务、定时器配置文件:
quartz_jobs.xml
<quartz xmlns="http://quartznet.sourceforge.net/JobSchedulingData"
xmlns

version="1.0"
overwrite-existing-jobs="true">
<calendar type="Quartz.Impl.Calendar.AnnualCalendar, Quartz" replace="false">
<name>cal1</name>
<description>description0</description>
<base-calendar type="Quartz.Impl.Calendar.WeeklyCalendar, Quartz" replace="false">
<name>name1</name>
<description>description1</description>
</base-calendar>
</calendar>
<calendar type="Quartz.Impl.Calendar.AnnualCalendar, Quartz" replace="false">
<name>cal2</name>
<description>description0</description>
<base-calendar type="Quartz.Impl.Calendar.WeeklyCalendar, Quartz" replace="false">
<name>name1</name>
<description>description1</description>
</base-calendar>
</calendar>
<job>
<job-detail>
<name>jobName1</name>
<group>jobGroup1</group>
<description>jobDesciption1</description>
<job-type>CommonlogDemo.SimpleJob, CommonlogDemo</job-type>
<volatile>false</volatile>
<durable>true</durable>
<recover>false</recover>
<job-data-map>
<entry>
<key>key0</key>
<value>value0</value>
</entry>
<entry>
<key>key1</key>
<value>value1</value>
</entry>
<entry>
<key>key2</key>
<value>value2</value>
</entry>
</job-data-map>
</job-detail>
<trigger>
<simple>
<name>simpleName</name>
<group>simpleGroup</group>
<description>SimpleTriggerDescription</description>
<misfire-instruction>SmartPolicy</misfire-instruction>
<calendar-name>cal1</calendar-name>
<volatile>false</volatile>
<job-name>jobName1</job-name>
<job-group>jobGroup1</job-group>
<start-time>1982-06-28T18:15:00.0Z</start-time>
<end-time>2015-05-04T18:13:51.0Z</end-time>
<repeat-count>100</repeat-count>//调度次数
<repeat-interval>3000</repeat-interval>//3秒
</simple>
</trigger>
<trigger>
<cron>
<name>cronName</name>
<group>cronGroup</group>
<job-name>jobName1</job-name>
<job-group>jobGroup1</job-group>
<start-time>1982-06-28T18:15:00+02:00</start-time>
<cron-expression>0/10 * * * * ?</cron-expression>//每10秒钟
</cron>
</trigger>
</job>
</quartz>