2

简单的 Ncron 服务:

class Program
{
    static void Main(string[] args)
    {
        var schedService = new SchedulingService();
        schedService.At("* * * * *").Run<MyTask>(); // run every minute
        schedService.Start();

        Console.ReadLine();
    }
}

public class MyTask : NCron.ICronJob
{
    public void Execute()
    {
        Console.WriteLine("executing");
    }

    public void Initialize(NCron.CronContext context)
    {
    }

    public void Dispose()
    {
    }
}

在到达第一分钟但在执行 MyTask 之前,NCron 似乎想要写入 Windows 事件日志,但失败并显示

Unhandled Exception: System.Security.SecurityException: The source was not found, but some or all event logs could not be searched.  To create the source, you need permission to read all event logs to make sure that the new source name is unique.  Inaccessible logs: Security.
   at System.Diagnostics.EventLogInternal.FindSourceRegistration(String source, String machineName, Boolean readOnly, Boolean wantToCreate)
   at System.Diagnostics.EventLogInternal.SourceExists(String source, String machineName, Boolean wantToCreate)
   at System.Diagnostics.EventLogInternal.VerifyAndCreateSource(String sourceName, String currentMachineName)
   at System.Diagnostics.EventLogInternal.WriteEntry(String message, EventLogEntryType type, Int32 eventID, Int16 category, Byte[] rawData)
   at System.Diagnostics.EventLog.WriteEntry(String message, EventLogEntryType type)
   at NCron.ExceptionHelper.LogUnhandledException(Object exception)
   at NCron.Service.SchedulingService.WaitCallbackHandler(Object data)
   at System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(Object state)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
   at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
   at System.Threading.ThreadPoolWorkQueue.Dispatch()
   at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()`

NCron 写入事件日志的内容和原因是什么?这是默认行为,所以我想任何使用 NCron 的人都必须处理过这个问题,但我找不到任何关于这个问题的文档或问题/答案。我尝试了设置schedService.LogFactory = null;,这并没有改变任何东西。

缺少创建自定义日志工厂(我不想这样做),或摆弄注册表(我真的不想这样做,有时不能在生产机器上),我该如何解决这个问题?

4

1 回答 1

1

如果您不想写入事件日志,则需要提供备用记录器和工厂。如https://code.google.com/p/ncron/wiki/Logging页面底部所述,有一个可用的 log4net 实现,其最新版本似乎位于https://github.com/ schourode/ncron/tree/master/src/Ncron.Integration.log4net。如果您不想使用 log4net,编写替代实现将非常简单。

如果您愿意允许 NCron 写入事件日志,您可以通过在运行服务之前在管理员帐户下创建目标事件日志来避免运行时 SecurityException。这通常可以通过在安装程序中创建事件日志(假设您有)来完成,例如使用EventLogInstaller

于 2013-02-01T17:10:27.863 回答