Регистратор по умолчанию NCron пишет в журнал событий, выдает исключение SecurityException
Простой сервис 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 ответ
Если вы не хотите записывать в журнал событий, вам нужно будет предоставить альтернативный регистратор и фабрику. Как упоминалось в нижней части https://code.google.com/p/ncron/wiki/Logging страницы, доступна реализация log4net, последняя версия которой, по-видимому, находится по адресу https://github.com/schourode/ncron/tree/master/src/NCron.Integration.log4net. Если вы не хотите использовать log4net, было бы довольно просто написать альтернативную реализацию.
Если вы хотите разрешить NCron выполнять запись в журнал событий, вы можете избежать исключительной ситуации SecurityException, создав целевой журнал событий под учетной записью администратора перед запуском службы. Обычно это можно сделать, включив создание журнала событий в установщик (если он у вас есть), например, с помощью EventLogInstaller.