c# - 使用 NLog 从 Hangfire 计划的后台作业记录日志

标签 c# .net nlog hangfire

所以我的问题如下:我调度到/使用 Hangfire 的方法/函数使用 NLog 执行大量相关信息的日志记录。在没有 hangfire 的情况下运行该方法时,我得到了我想要的所有日志记录信息,但是当我使用 hangfire 安排方法时,所有这些日志记录都丢失了。

我知道 Hangfire 使用 NLog(或您喜欢的任何其他日志记录框架)来实现其自己的日志记录目的。我正在使用来自 ASP.NET MVC4 Web 应用程序的 Hangfire。我正在使用 Ninject 并使用当前看起来像这样的 OWIN Startup 类设置 hangfire:

public class Startup
{
  public void Configuration(IAppBuilder app)
  {
    app.UseHangfire(config =>
    {
        var kernel = new StandardKernel(new MyModule());
        config.UseNinjectActivator(kernel);
        config.UseSqlServerStorage("Context");
        LogProvider.SetCurrentLogProvider(new NLogLogProvider());
        config.UseServer();
    });
   }
}

我想要完成的是 Hangfire 可以进行自己的日志记录,而我的预定作业也可以完成所有日志记录,我不关心它在一个或多个文件中。目前 Hangfire 正在正确地进行日志记录,即:

2015-02-25 14:32:41.4400|TRACE|Hangfire.Server.AutomaticRetryServerComponentWrapper|Sending start request for server component 'Server Bootstrapper'...

等等

但是无法看到计划作业的日志记录。

我想问的是:我如何从预定的方法/作业进行日志记录?我的猜测是我在某处缺少依赖项/上下文,但我真的不知道 atm。

最佳答案

可能是 NLog 在 Hangfire 作业中运行时找不到它的配置。

解决方案是:

  1. 或者使用路径加载配置,例如

    LogManager.Configuration = new XmlLoggingConfiguration("c:/dir/nlog.config");
    
  2. 或者在 C# 中创建配置。参见 docs

    var config = new LoggingConfiguration();
    config.AddRuleForAllLevels(new FileTarget()
    {
        FileName = "c:/temp/my-logfile.log"
    });
    LogManager.Configuration = config; //apply config
    

如果这仍然是一个问题,您可以使用内部日志进行故障排除:

// set internal log level
InternalLogger.LogLevel = LogLevel.Trace;

// enable internal logging to a file
InternalLogger.LogFile = "c:\\temp\\nlog-internal.log";

参见 internal log docs

关于c# - 使用 NLog 从 Hangfire 计划的后台作业记录日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28761035/

相关文章:

NLog 与 DNX Core 5.0

c# - 来自 .NET Standard 类库的日志消息

c# - 我的 C# Windows 窗体应用程序和 azure

c# - Composite Stream Wrapper 提供部分 MemoryStream 和完整的原始 Stream

c# - 使用反射获取执行程序集名称

c# - 使用 webclient DownloadFileAsync 多个文件

c# - System.Text.StringBuilder 限制

.net - 时间戳是否有 Windows 绝对时间? (。网)

.net - 为什么在 XAML 中设置依赖属性时会在运行时绕过 .NET 属性包装器?

c# - 如何在 NLog 中修改 ${stacktrace} 布局渲染器