首页 > 解决方案 > 从 Main 开始的类中的 iLogger

问题描述

与 iLogger 斗争。对我来说,目前尚不清楚如何在 Web 控制器旁边实例化日志实例。

主要我正在上演一个“版本监视器”:

 public static void Main(string[] args)
        {
            IWebHostEnvironment env;
            VersionMonitor vControl = new VersionMonitor();
            CreateHostBuilder(args).Build().Run();    
        }

在版本监视器构造函数中,我正在启动一个计时器:

public VersionMonitor()
        {
            Timer timer = new Timer();
            timer.Interval = UpInterval;
            timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
            timer.Enabled = true;
         }

我想做的就是现在记录某事。在经过的计时器事件中:

   static void timer_Elapsed(object sender, ElapsedEventArgs e)
    {
            //how to?
            ILogger<timer_Elapsed> _logger;
            logger.LogInformation("Message");
    }

请您指导我,如何做到这一点,好吗?

提前致谢。

标签: c#asp.net-coreilogger

解决方案


而不是直接实例化您的类...查看官方托管服务。他们应该与 DI 很好地集成,以便获得注入的记录器。检查文档。他们甚至有计时器的例子。

public class VersionMonitor: IHostedService, IDisposable
{
    ILogger<VersionMonitor> _logger;
  
    Timer _timer;

    public VersionMonitor(ILogger<VersionMonitor> logger)
    {
        _logger = logger;
        _timer = new Timer();
        _timer.Interval = UpInterval;
        _timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
    }

    public Task StartAsync(CancellationToken cancellationToken)
    {        
        _timer.Enabled = true;
    }

    void timer_Elapsed(object sender, ElapsedEventArgs e)
    {
        _logger.LogInformation("Message");
    }

     public void Dispose()
    {
        _timer?.Dispose();
    }
}

然后把它连起来:

public static void Main(string[] args)
{
    CreateHostBuilder(args).Build().Run();    
}

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
        })
        .ConfigureServices(services =>
        {
            services.AddHostedService<VersionMonitor>();
        });

推荐阅读