iLogger within a class started from Main

376 Views Asked by At

struggeling with iLogger. For me it is currently not clear how to instantiate a logging instance aside the web controller.

In main I'm staging a "version monitor":

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

Within the version monitor constructor I'm starting a timer:

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

All I want to do, is now to log sth. within the elapsed timer event:

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

Could you guide me, how to do this, please?

Thanks in advance.

1

There are 1 best solutions below

5
On

Rather than directly instantiating your class...look into the official hosted services. They should integrate nicely with DI so they get an injected logger. Check the documentation. They even have examples with timers.

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();
    }
}

Then just wire it up:

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>();
        });