C#
ILogger
Learn the logging contract with ILogger<T>.
ILogger<T>
ILogger<T> is the interface used for logging in .NET. The T type parameter marks the category; usually it is the class that logs. This makes it easy to tell apart messages from different classes.
A class receives its logger through constructor injection: public UserService(ILogger<UserService> logger). This binds the class to the interface, not a concrete logger; in tests a fake logger can be supplied. In production an implementation like ConsoleLogger<UserService> is wired up.
Logger as a dependency
The logger is passed to a class as a constructor parameter. The class stores it in a private field and calls it where needed. This decouples the class from the logger implementation; a fake logger (say, one that records to memory) can be supplied in tests.
For convenience the interface exposes common methods: LogInformation, LogWarning, LogError, and LogDebug. Each carries a different severity; details come in the next lesson.
Exercise ILogger<T> with UserService
Define an ILogger<T> interface with a void LogInformation(string message) method. ConsoleLogger<T> implements it and calls Console.WriteLine("[INF] " + message). UserService takes an ILogger<UserService> in its constructor; its Greet(string user) method calls _logger.LogInformation($"Merhaba {user}"). In Main, create a ConsoleLogger<UserService>, build the service, and call Greet.
Show example solution
Define interface ILogger<T> { void LogInformation(string message); }. Write class ConsoleLogger<T> : ILogger<T> { public void LogInformation(string message) => Console.WriteLine("[INF] " + message); }. Write class UserService { private readonly ILogger<UserService> _logger; public UserService(ILogger<UserService> logger) => _logger = logger; public void Greet(string user) => _logger.LogInformation($"Merhaba {user}"); }. In Main: var svc = new UserService(new ConsoleLogger<UserService>()); svc.Greet("Ayşe");
Example solution:
using System;
public interface ILogger<T>
{
void LogInformation(string message);
}
public class ConsoleLogger<T> : ILogger<T>
{
public void LogInformation(string message) =>
Console.WriteLine("[INF] " + message);
}
class UserService
{
private readonly ILogger<UserService> _logger;
public UserService(ILogger<UserService> logger) => _logger = logger;
public void Greet(string user) =>
_logger.LogInformation($"Merhaba {user}");
}
class Program
{
static void Main()
{
var service = new UserService(new ConsoleLogger<UserService>());
service.Greet("Ayşe");
}
}
Test yourself
-
What does T specify in ILogger<T>?
- The log category (usually the class)
- The log level
- The output format
- The file path
Show answer
The log category (usually the class) — Correct. T marks the category; usually the class that logs.
-
Complete the log method call
logger.____("Servis başlatıldı");
Show answer
logger.LogInformation("Servis başlatıldı");
-
Match ILogger<T> concepts
- ILogger<T>
- Logging interface
- T
- Category type
- ConsoleLogger<T>
- Writes to console
- LogInformation
- Information level
Next lesson: Log levels