SQL作业或任务计划程序调用log4net,不写日志文件

Rob*_* Li 7 log4net

我用log4net编写了一个控制台应用程序,我的log4net配置如下

<?xml version="1.0" encoding="utf-8" ?>
<log4net>
  <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender" >
    <file value="Process_Log\" />
    <appendToFile value="true" />
    <datePattern value="yyyy-MM-dd.TXT" />
    <maxSizeRollBackups value="10" />
    <rollingStyle value="Date" />
    <maximumFileSize value="10MB" />
    <staticLogFileName value="false" />
    <layout type="log4net.Layout.PatternLayout">
      <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %p %message [%logger] %n" />
    </layout>
  </appender>

  <root>
    <level value="ALL" />
    <appender-ref ref="RollingLogFileAppender" />
  </root>
</log4net>
Run Code Online (Sandbox Code Playgroud)

运行控制台应用程序,它有输出日志文件.但是使用SQL Server代理作业或Windows任务计划程序调用它,它没有写日志文件.

小智 10

我解决了这个问题.从Visual Studio运行解决方案时,log4net从"bin"文件夹中找出配置文件.因此,它需要运行所需的信息.但是当您通过Windows任务计划程序运行应用程序时,情况就不同了.这次,Windows任务计划程序尝试从此位置"C:\ Windows\System32"中找出配置文件.因为,当您运行Windows任务计划程序时,它会将默认应用程序文件夹位置视为"C:\ Windows\System32".

您可以编写以下代码来导航应用程序以加载log4net配置文件.这里,配置文件名是"LogConfiguration.config".

 var log4NetConfigDirectory =
       AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory;
 var log4NetConfigFilePath = Path.Combine(log4NetConfigDirectory, "LogConfiguration.config");
 log4net.Config.XmlConfigurator.ConfigureAndWatch(new FileInfo(log4NetConfigFilePath));
Run Code Online (Sandbox Code Playgroud)


Ste*_*der 5

user3626918接受的关于该问题的答案是正确的(工作目录错误)。作为建议的代码更改解决方案的替代方法,您可以:

  • 配置计划任务的“开始于”目录(属性->操作->编辑...)

  • 确认运行计划任务的帐户有权写入日志文件目标。