Я запускаю несколько консольных приложений с помощью планировщика задач. Это приложения, которые выполняют небольшие служебные задачи и работают как консольные приложения C #.
Сами приложения работают отлично (т.е. одно из них выводит электронные письма в конце своего запуска, и я получаю эти электронные письма), но у меня возникают проблемы с их правильным логированием. Они используют Log4Net, и конфигурация выглядит нормально, потому что, если я запускаю их вручную, они создают журналы правильно.
Однако, когда я запускаю их под той же учетной записью (подтвержденной проверкой диспетчера процессов) в планировщике задач, они не создают никаких журналов. Это как если бы им не хватало правильных привилегий (но не выкидывали исключения, потому что они выполняются нормально) или планировщик задач каким-то образом изолировал записи на диск и никогда не позволял им касаться фактического диска.
Первоначально я пытался записать в% AppData%, но я прочитал, что у планировщика задач есть проблемы с пользовательскими переменными. Итак, я жестко запрограммировал пути к c: \ BackOffice \ Logs, однако это нисколько не изменило неудачное поведение. D:
Любые идеи? Это Microsoft Server 2008 R2 Datacenter, работающий на AWS EC2.
Вот конфигурация log4net, если это поможет:
<?xml version="1.0" encoding="utf-8"?>
<log4net>
<appender name="ConsoleAppender"
type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%ndc] - %message%newline" />
</layout>
</appender>
<appender name="FileAppender"
type="log4net.Appender.FileAppender">
<file value="c:\BackOffice\Logs\LogName_log.txt" />
<appendToFile value="true" />
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
</layout>
</appender>
<root>
<level value="DEBUG" />
<appender-ref ref="FileAppender" />
<appender-ref ref="ConsoleAppender" />
</root>
</log4net>
Наконец я нашел свою проблему. Текущий рабочий каталог не был каталогом приложения, поэтому log4net никогда не мог найти файл конфигурации. К счастью, в планировщике задач есть необязательное поле, которое позволяет вам установить начальный каталог для вашей задачи.
Похоже на проблему UAC, с которой я только что имел дело - я нашел ваш вопрос, пока искал ответ!
В моем случае мне пришлось запустить запланированный запрос с установленным флажком «Запускать с наивысшими привилегиями». Это работало с учетной записью администратора, потому что с UAC токен администратора с более высокими привилегиями может читать / записывать файлы других пользователей (в данном случае - файлы другого администратора). Я протестировал и обнаружил, что если задача была запланирована для запуска под тем же пользователем, что и пользователь, владеющий файлом / каталогом, это работало даже без токена «наивысших привилегий».
Я не определил, применимо ли все это к учетным записям и доступу без прав администратора, но я предполагаю, что, поскольку для учетной записи без прав администратора нет токена с более высокими привилегиями, он просто потерпит неудачу.
Дополнительные исследования, и похоже, что каталог% alluserprofile% - это то место, куда вы должны поместить данные «этого компьютера», а не данные «для каждого пользователя» в каталоге% appdata%. Так что, возможно, размещение его там решит вашу проблему.