通过log4net的Quartz.net调度程序日志未出现在正确的记录器文件中

问题描述 投票:0回答:1

我正在使用Windows服务,该服务有五个不同的作业,它们同时运行,因为有一个调度程序,该调度程序使用Quarts.Net和TopShelf库在特定的时间间隔内调度这些作业。问题在于记录每个作业,log4Net库用于将每个作业记录到一个单独的文件中,并且app.config文件中的每个记录器都有正确的配置,但是在运行时仍未在正确的日志文件上进行记录,当所有作业同时运行时。以下是这些作业的代码示例:

factory = new StdSchedulerFactory();
scheduler = factory.GetScheduler();

scheduler.JobFactory = new JobFactory() { AppLogger = LogManager.GetLogger("Job1") };
 scheduler.ListenerManager.AddJobListener(new JobListener() { Name = "Job1Listener" });

IJobDetail jobDetails = JobBuilder.Create<ServiceJob1>().SetJobData(map).Build();

ITrigger trigger = TriggerBuilder.Create()
                                .WithSimpleSchedule(x =>
                                                        x.WithIntervalInSeconds(interval)
                                                        .RepeatForever().WithMisfireHandlingInstructionIgnoreMisfires()
                                                    )
                                .StartNow()
                                .WithIdentity("Job1TriggerGroup")
                                .Build();

scheduler.ScheduleJob(jobDetails, trigger);
scheduler.Start();

下面是“ ServiceJob1”类代码:

public class ServiceJob1 : IloggerEnabledJob
{
   public ILog AppLogger { get; set; }

   public void Execute(IJobExecutionContext context)
        {
            try
            {
                // do something
            }
            catch (Exception ex)
            {
                Logger.Log(AppLogger, Logger.LogType.Error, "Exception : " + ex);
            }
        }
}

App.config:

    <log4net>
        <root>
          <level value="INFO"/>
          <appender-ref ref="Job1FileAppender"/>
          <appender-ref ref="Job2FileAppender"/>
         </root>

     <appender name="Job1FileAppender" type="log4net.Appender.RollingFileAppender">
          <file type="log4net.Util.PatternString">
            <conversionPattern value="\Logs\Job1\Job1_Log_%date{yyyy.MM.dd.HH.mm.ss}-%processid.txt"/>
          </file>
          <filter type="log4net.Filter.LoggerMatchFilter">
            <loggerToMatch value="Job1"/>
          </filter>
          <filter type="log4net.Filter.DenyAllFilter"/>
          <appendToFile value="true"/>
          <rollingStyle value="Size"/>
          <maxSizeRollBackups value="10"/>
          <maximumFileSize value="25MB"/>
          <staticLogFileName value="true"/>
          <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline"/>
          </layout>
        </appender>
    <appender name="Job2FileAppender" type="log4net.Appender.RollingFileAppender">
              <file type="log4net.Util.PatternString">
                <conversionPattern value="\Logs\Job2\Job2_Log_%date{yyyy.MM.dd.HH.mm.ss}-%processid.txt"/>
              </file>
              <filter type="log4net.Filter.LoggerMatchFilter">
                <loggerToMatch value="Job2"/>
              </filter>
              <filter type="log4net.Filter.DenyAllFilter"/>
              <appendToFile value="true"/>
              <rollingStyle value="Size"/>
              <maxSizeRollBackups value="10"/>
              <maximumFileSize value="25MB"/>
              <staticLogFileName value="true"/>
              <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline"/>
              </layout>
            </appender>

<logger name="Job1" additivity="true">
      <level value="ALL" />
      <appender-ref ref="Job1FileAppender" />
    </logger>
    <logger name="Job2" additivity="true">
      <level value="ALL" />
      <appender-ref ref="Job2FileAppender" />
    </logger>
    </log4net>

即使所有五个作业同时运行,我也需要将Job1和Job2记录到各自的日志文件中。任何帮助/建议,将不胜感激!

c# logging log4net quartz.net rollingfileappender
1个回答
0
投票

从您的代码看来,您每次可能都从LogManager.GetLogger("Job1")传递相同的JobFactory

© www.soinside.com 2019 - 2024. All rights reserved.