NCron默认记录器写入事件日志,抛出SecurityException

时间:2013-02-01 15:47:50

标签: c# .net event-log securityexception ncron

简单的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;,这不会改变任何内容。

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

1 个答案:

答案 0 :(得分: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