Serilog, .NET için tasarlanmış popüler ve güçlü bir logging kütüphanesidir. Uygulamalarınızda olay kayıtlarını (logları) kolay ve esnek bir şekilde oluşturmanıza, yönetmenize ve depolamanıza olanak tanır. Yapılandırılabilir ve genişletilebilir bir mimarisi vardır, bu sayede log kayıtlarınızı çeşitli çıktı noktalarına (console, dosya, veritabanı, ElasticSearch, Seq gibi) gönderebilir ve ayrıca log mesajlarınızın içerisindeki yapılandırılmış verilere dayalı olarak daha detaylı sorgulamalar yapabilirsiniz.
Serilog’ün en önemli özelliklerinden biri, “yapılandırılmış logging” (structured logging) imkanı sunmasıdır. Yapılandırılmış logging ile log mesajlarınızı sadece metinsel olarak değil, aynı zamanda veri olarak da kaydedebilirsiniz. Örneğin, bir kullanıcının oturum açma işlemi loglandığında, kullanıcı adı ve zaman damgası gibi bilgiler de kaydedilerek daha sonra bu bilgilere göre filtreleme veya sorgulama yapılabilir.
Serilog’un kullanımı genellikle aşağıdaki adımları içerir:
- Kurulum ve Yapılandırma: Serilog, NuGet üzerinden projenize eklenir ve genellikle uygulamanın başlatılması esnasında (örneğin ASP.NET Core’da
Startup.cs
veyaProgram.cs
içerisinde) yapılandırılır. - Logging Sinks: Serilog “sink” kavramını kullanır, bu kavram logların gönderileceği hedefi ifade eder. Örneğin, bir dosyaya, konsola veya uzaktaki bir log sunucusuna log göndermek için farklı sinkler kullanılır.
- Log Oluşturma: Uygulamanızın çeşitli noktalarında, Serilog API’sini kullanarak log mesajları oluşturabilirsiniz. Bu mesajlar hata ayıklama, bilgi, uyarı, hata ve kritik seviyelerde olabilir.
- Yapılandırılmış Veri: Log mesajlarınızın içerisine, log ile ilgili ek veriler ekleyebilirsiniz. Bu, özellikle büyük ve karmaşık uygulamalarda, olayların daha sonra analiz edilmesi açısından büyük kolaylık sağlar.
- Log Yönetimi: Logların düzgün bir şekilde döndürülmesi (log rotation), arşivlenmesi ve eski logların temizlenmesi gibi işlemler Serilog veya ekstra tool’lar ile yönetilebilir.
Serilog, loglamayı modern bir yaklaşımla ele alır ve .NET geliştiricilerinin ihtiyaç duyduğu performans ve esnekliği sağlar. Yapılandırılmış loglamayı desteklemesi ve güçlü sink ekosistemi ile Serilog, .NET ekosistemi içinde çok tercih edilen bir logging çözümüdür.
Şimdi Başlıyoruz.
Aşağıdaki 3 .net kütüphanesini kurun.
Serilog.AspNetCore
Serilog.Settings.Configuration
Serilog.Sinks.MSSqlServer
C#Ardından Program.cs dosyasına aşağıdaki kodları ekleyin.
var sconfig = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production"}.json", optional: true)
.Build();
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(sconfig)
.CreateLogger();
/// kodlar
app.UseSerilogRequestLogging(options =>
{
options.MessageTemplate = "{RemoteIpAddress} {RequestScheme} {RequestHost} {RequestMethod} {RequestPath} responded {StatusCode} in {Elapsed:0.0000} ms";
options.GetLevel = (httpContext, elapsed, ex) => LogEventLevel.Debug;
options.EnrichDiagnosticContext = (diagnosticContext, httpContext) =>
{
diagnosticContext.Set("RequestHost", httpContext.Request.Host.Value);
diagnosticContext.Set("RequestScheme", httpContext.Request.Scheme);
diagnosticContext.Set("RemoteIpAddress", httpContext.Connection.RemoteIpAddress);
};
});
//Bu bölüm, her bir HTTP isteğinin loglanması için Serilog’un yapılandırılmasını içerir. Log mesajlarını özelleştirmek, log seviyelerini belirlemek ve ekstra bilgileri diagnostic context'e eklemek için kullanılır.
C#SqlServer‘da tablomuzu oluşturalım.
CREATE TABLE [Log] (
[Id] int IDENTITY(1,1) NOT NULL,
[Message] nvarchar(max) NULL,
[MessageTemplate] nvarchar(max) NULL,
[Level] nvarchar(128) NULL,
[TimeStamp] datetimeoffset(7) NOT NULL,
[Exception] nvarchar(max) NULL,
[Properties] xml NULL,
[LogEvent] nvarchar(max) NULL
CONSTRAINT [PK_Log]
PRIMARY KEY CLUSTERED ([Id] ASC)
)
SQLSqlServer’da log kayıtlarımıza bakıyoruz.
Günlüğün SQL Server’a yazılmasında sorun yaşarsak, Serilog’daki hataları ortaya çıkarmak için Program.cs içindeki Serilog.Debugging.SelfLog.Enable() işlevini kullanabileceğimizi unutmayın.
Serilog.Debugging.SelfLog.Enable(msg =>
{
Debug.Print(msg);
Debugger.Break();
});
C#Konumuzun sonuna geldik Eğer dilerseniz GITHUB PROJE ‘sinden kodların tamamına ulaşabilirsiniz. İyi Kodlamalar…
Eline sağlık güzel bir yazı olmuş.