Asp.net core Logging ILogger, ILoggerProvider ve ILoggerFactory Giriş.
Published: 2021-10-09 09:27:52

İlk başta C:\ dizinine LoggerFolder adlı bir klasör(folder) oluşturalım. Dah asonra bu Folder'ın içine LoggerFile.txt dosyasını(file'ını) oluşturalım. Dizin şu şekilde olacaktır : "C:\LoggerFolder\LoggerFile.txt".

Amacımız : Bu yukarıdaki yarattığımız dizine loglama yani : 

```
_logger.LogInformation("Bu bir bilgilendirmedir.")
```
kodunu yazdığımızda, artık loglama yukarıda yarattığımız dosyaya yazılacaktır. 

## ILogger nedir ? 

Verilen log level'de loglama yapmaktan sorumlu olan Logger sınıfının imzasıdır.

## Logger nedir ? 

Verilen log level'de loglama yapmaktan sorumludur.

## ILoggerProvider nedir ?

ILogger örneği/instance'ı yaratmak için kullanılacak olan LoggerFileProvider'ının imzasıdır.

## LoggerFileProvider nedir ?

ILogger örneği/instance'ı yaratmak için kullanılacak olan sınıftır.

## ILoggerFactory  nedir ? 

ILoggerFactory, ILoggerProviders koleksiyonlarını tutar.



Şimdi Interface ve class'larımızı tanıttıktan sonra sırasıyla onları hayata geçerilim.

1.) Boş bir model-view-controller projesi oluşuturun.

2.) "appsettings.json"a aşağıdaki aşağıdaki key-value pair'ını ekleyelim : 

```
"FileLoggerProvider": {
    "Path":"C:\\LoggerFolder\\LoggerFile.txt" 
  }
```

appsettings.json aşağıdaki gibi gözükecektir : 

![alt text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yryiliiz0agwdyygy6zb.png)
 
3.) Projenin üstüne sağ tıklayın, "Add" kısmında "New Folder"a tıklayın. Oluşturduğunuz klasörün ismine : Logger diyebilirsiniz.

4.) Oluşturduğunuz Logger klasörünün içine : "Logger" ve "LoggerFileProvide" adlı iki class oluşturun. Aşağıdaki gibi : 

![alt text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3wknwn9rbr7tm8z1xea1.png)
 
5.) Logger class'ınızı açın Logger class'ını ILogger adlı interface'den türetin. Daha sonra ILogger adlı interface implement edin. Ve Logger class'ı biraz inceleyin daha sonra ILogger'ı seçip f12 ile açıklamalarını gidin ve inceleyin.

6.) Logger class'ının içindeki kodları temizleyip aşağıdaki kodları yazın : 

```
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;

namespace LoggingBir.Logger
{
    public class Logger : ILogger
    {
        public string Path { get; set; }
        public Logger(string FullPath)
        {
            Path = FullPath;
        }
        public IDisposable BeginScope<TState>(TState state)
        {
            return null;
        }

        public bool IsEnabled(LogLevel logLevel)
        {
            return true;
        }

        public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)
        {
            File.AppendAllText($"{Path}",$"LogLevel: { logLevel } | EventId: { eventId }|  TState : { state } | Exception : { exception } | Formatter : { formatter } + Datetime :  {DateTime.Now} "+ Environment.NewLine + Environment.NewLine);

        }
    }
}

```
Burada yaptığımız bir Path oluşturarak, o path File.AppendAllText diyerek hataları yazdırmak ama işimiz hala bitmedi.

7.) LoggerFileProvider class'ına gelin, ILoggerProvider'dan türetin. Ve ILoggerProvider Interface'ini implement edin. LoggerFileProvider class'ını ve ILoggerProvider interface'ini incelemenizi öneririm.

8.) LoggerFileProvider class'ının içine silip aşağıdaki kodları yapıştırın : 

```
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace LoggingBir.Logger
{
    public class LoggerFileProvider : ILoggerProvider
    {
        public string Path { get; set; }
        public LoggerFileProvider(string FullPath)
        {
            Path = FullPath;
        }
        public ILogger CreateLogger(string categoryName)
        {
             return new Logger(Path);
        }

        public void Dispose()
        {
            throw new NotImplementedException();
        }
    }
}

```
Burada yaptığımız şey şunun için : ILoggerFactory bizden ILoggerProvider implement etmiş bir provider isteyecektir biz burada bunu oluşturuyorz. Aynı zamanda CreateLogger(..) ile daha önce oluşturmuş olduğumuz ILogger'ı geri döndürüyoruz.

9.) Startup.cs adlı class'ımızı açalım : 

a.) Configure metodumuza parametre olarak : ILoggerFactory loggerFactory verelim. Configure metotdunu parametreleri şuna benziyor olması gerekiyor : 

![alt text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7a4x94022fbqhq1gujr9.png)
  
b.) Configure metodunun içine aşağıdaki kod bloğunu ekleyelim : 

```
 loggerFactory.AddProvider(new LoggerFileProvider(Configuration["FileLoggerProvider:Path"]));
```

Burada yaptığımız : 
 İlk olarak : daha önce bahsettiğim gibi ILoggerFactory  bizden bir provider bekliyor biz de LoggerFileProvider'ı veriyoruz. 
 İkinci olarak : appsettings.json dosyasında daha önce oluşturmuş olduğumuz key-value pair'ını LoggerFileProvider parametre olarak veriyoruz.
Configure metodunun şuna benzemesi gerekiyor : 

![alt text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0wcjerufug8cumzai4ps.png)
 
10.) HomeController adlı controller'ımızı açıyoruz ve Index action'ına aşağıdaki kodları yapıştırıyoruz : 

```
            _logger.LogInformation(eventId: new EventId(123, "Event"), new Exception("Bu bir exception"), "Information mesajı...");
            _logger.LogError(new EventId(2), new Exception("Bu bir Exception'dır."),"Bu bir mesajdır.");

```
HomeController şuna benzeyecektir : 

![alt text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qcadwbp2fj7cgvy974gr.png)
 
11.) Uygulamayı ayağı kaldırıyoruz. Daha sonra : "C:\LoggerFolder\LoggerFile.txt" yolunda oluşturduğumuz dosyayı açıyoruz. Görüldüğü üzere loglarımız yazıyor : 

![alt text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dssl24motnbizrgvhmsz.png)

Bir dahaki yazımda görüşmek dileğiyle.

En iyi dilekerim ile. 

Mustafa Samed Yeyin.  

https://www.dotnettr.com/