【问题标题】:log4net stops working on separate tasklog4net 停止处理单独的任务
【发布时间】:2018-05-31 09:20:15
【问题描述】:

我有这个 log4net 的代码,它只适用于几行,但在这之后就停止了,这很奇怪!

这里是代码

public void SyncPR5600(int serviceId)
{
    Logger.Info("Starting execution of {0} out of task");
    Task.Factory.StartNew(() =>
    {
        string tableName = "PR5600";
        Logger.Info(string.Format("Starting execution of {0}", tableName));    
    });
}

Logger 的第一行被 log4net appender 记录,但 Task.Factory.StratNew 中的后一行停止工作。

令人惊讶的是,相同的代码可以在控制台应用程序中运行,但是当移动到 Windows 服务时,它会停止记录。

这是大错特错!

[更新1] Log4net 配置

<log4net>
<appender name="ErrorsLog" type="log4net.Appender.RollingFileAppender">
  <file value="${PROGRAMDATA}\DEVIT\eProc\" />
  <appendToFile value="true" />
  <param name="DatePattern" value="yyyy-MM-'CadRmsSyncService_Errors.log'" />
  <staticLogFileName value="false" />
  <maximumFileSize value="100GB" />
  <maxSizeRollBackups value="0" />
  <param name="Threshold" value="WARN" />
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%d [%t] %-5p - %m%n" />
  </layout>
</appender>
<appender name="InfoLog" type="log4net.Appender.RollingFileAppender">
  <file value="${PROGRAMDATA}\DEVIT\eProc\" />
  <appendToFile value="true" />
  <param name="DatePattern" value="yyyy-MM-'CadRmsSyncService_Info.log'" />
  <staticLogFileName value="false" />
  <maximumFileSize value="100GB" />
  <maxSizeRollBackups value="0" />
  <param name="Threshold" value="DEBUG" />
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%d [%t] %-5p - %m%n" />
    <IgnoresException value="False" />
  </layout>
  <filter type="log4net.Filter.LevelRangeFilter">
    <levelMin value="DEBUG" />
    <levelMax value="FATAL" />
  </filter>
</appender>
<root>
  <level value="DEBUG"/>      
  <appender-ref ref="ErrorsLog" />
  <appender-ref ref="InfoLog" />
</root>

【问题讨论】:

  • 你能发布你的 log4net 配置吗?
  • 另外,Logger 是什么?
  • @pixelbadger 查看有问题的更新
  • @Matan Shahar - 它在内部使用 log4net 进行日志记录。这是一个常用的日志类。
  • 默认情况下 ProgramData 具有受限权限 - 一个用户创建的文件不能被另一个用户修改。默认情况下,Windows 服务将以与您自己的 Windows 帐户不同的用户身份运行。您是否可以删除现有的日志文件,然后运行您的 Windows 服务,而不首先将其作为控制台应用程序运行?

标签: c# log4net log4net-configuration


【解决方案1】:

我的代码使用 TaskCreationOptions.AttachedToParent 选项。有趣的是,在 VS2017 调试模式下运行即使没有选项也会产生日志。

public static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

...

Task.Factory.StartNew<Model>(() =>
{
    //My Work that writes log
}, TaskCreationOptions.AttachedToParent).ContinueWith((t) =>
{
    //Update UI code using that also writes log
}, TaskScheduler.FromCurrentSynchronizationContext());

【讨论】:

    猜你喜欢
    • 2012-06-06
    • 2014-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-28
    相关资源
    最近更新 更多