使用NLog从Hangfire预定后台作业进行日志记录

时间:2015-02-27 09:00:47

标签: 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'...

但无法看到预定作业的日志记录。

我想问的是:我如何从预定的方法/工作中进行记录?我的猜测是我在某个地方错过了一个依赖/背景,但我真的没有任何线索。

1 个答案:

答案 0 :(得分:0)

在执行Hangfire作业时,NLog可能找不到它的配置。

解决方案是:

  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