我正在使用任务调度程序运行几个控制台应用程序。这些应用程序执行一些后台任务,并作为 C# 控制台应用程序运行。
应用程序本身运行良好(例如,其中一个在运行结束时输出电子邮件,我收到了这些电子邮件),但我无法让它们正确记录。它们使用 Log4Net,配置看起来不错,因为如果我手动运行它们,它们会正确生成日志。
但是,当我在任务调度程序下以相同的用户帐户(通过检查进程管理器确认)运行这些程序时,它们不会生成任何日志。就好像它们缺乏正确的权限(但由于它们执行良好,因此不会引发异常)或任务调度程序以某种方式对磁盘写入进行沙盒处理,并且从不让它们接触实际磁盘。
我最初尝试写入 %AppData%,但我读到任务调度程序在用户变量方面存在问题。因此,我现在将路径硬编码到 c:\BackOffice\Logs,但这根本没有改变这种不幸的行为。D:
有什么想法吗?这是在 AWS EC2 上运行的 Microsoft Server 2008 R2 数据中心。
如果有帮助的话,这里是 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>
答案1
这听起来像我刚刚处理的 UAC 问题——我在寻找答案时发现了您的问题!
就我而言,我必须在选中“以最高权限运行”复选框的情况下运行计划任务。这适用于管理员帐户,因为使用 UAC,具有更高权限的管理员令牌可以读取/写入其他用户的文件(在本例中为另一个管理员的文件)。我进行了测试,发现如果计划在与拥有文件/目录的用户相同的用户下运行任务,即使没有“最高权限”令牌也可以正常工作。
我还没有确定所有这些是否适用于非管理员帐户和访问,但我的假设是,由于非管理员帐户没有“更高权限”令牌,因此它将会失败。
经过进一步研究,似乎 %alluserprofile% 目录是放置“此计算机”数据的地方,而不是 %appdata% 目录中的“每个用户”数据。因此,也许将其放在那里可以解决您的问题。
答案2
最后我找到了问题所在。当前工作目录不是应用程序目录,因此 log4net 永远找不到配置文件。幸运的是,任务计划程序中有一个可选字段,允许您设置任务的起始目录。