Sprint Hikayeleri #1 (Snorlax - Audit Log)

Furkan Güngör
Mobiroller Tech
Published in
4 min readApr 4, 2020
Snorlax

Herkese merhabalar 🙋‍♂

Ekip olarak Covid-19 sayesinde kendimize daha fazla vakit ayırabileceğimizi görünce her sprint’te yaşadığımız problemleri, üretilen çözümleri ve bu süreç içerisinde kullandığımız teknolojileri anlatan bir seriye başlama kararı aldık.

MobirollerTech kanalının ilk yazısını yazmanın mutluluğu var bu satırlarda :) ve bu serinin devamında çok eğlenceli konular olacağını şimdiden görüyorum 🤗

Mobiroller monolithic mimariden microservice mimarisine geçen ve bu süreci oldukça konforlu bir şekilde tamamlamak isteyen bir kuruluş.

Ekip olarak sadece teknolojiyi yenilemek yerine bu süreç içerisinde sistemin temel gereksinimlerini yeniden planlayarak, dinamik microservice’ler oluşturmaya çalışıyoruz.

Evet bu süreç her ne kadar zor olsa da, bir developer olarak sorunlu yapıları tespit ettikten sonra çözüm üretirken bir hafta sonu sahilde denizin büyüleyici huzuruna kapılmışçasına mutlu oluyorum 🤩

Daha fazla konuyu uzatmadan Snorlax’in temel konusu olan Audit Log hakkında konuşmaya başlayalım.

En ilkel tanımı ile audit log, kullanıcının uygulamanız üzerinde gerçekleştirdiği tüm aksiyonları güvenlik amacıyla saklayan belgeler bütünüdür.

Microservice mimarisinde uygulamanın temel gereksinimlerini yerine getirmek amacıyla birden fazla servis bulunmaktadır. Kullanıcı bir işlem yaparken hangi servise bağlandığını bilmeden işlemlerini yürütür.

Tüm servisler log tutmak zorundadır, bu yüzden uygulanacak çözüm tekrar kullanılabilir, ve kolay entegre edilebilir olmalıydı.

Log hangi seviyede tutulacak ?

Event Categories

  • Create
  • Read
  • Update
  • Delete

Data

  • Name surname
  • Email
  • IP
  • User agent
  • Action
  • Time

Teknik ekip olarak yapılan PoC sonucunda kullanılabilecek open source projeler listelendi.

Star ve kullanılan projeleri inceledikten sonra bizim tercihimiz Audit.Net oldu.

Audit.Net oldukça kolay entegre edilen bir kütüphane. Oldukça fazla data provider seçeneği ile sprint sonunda bize çok güzel bir knowhow sağladı.

DynamoDB, PostgreSQL, Azure Blob, Mongo gibi birçok provider’a sahip, daha önce kullanmadığımız bir teknolojiyi kullanmak adına sprint başında DynamoDB kullanma kararı aldık ancak tutulan bu log kayıtları kullanıcıların takip edeceği bir görünüme sahip olacaktır. Bu aşamada tutulan bu kayıtlar üzerinde sorting, filter, pagination gibi işlemler yaparak kayıtları yorumlayıp kullanıcılara sunmamız gerekecekti, yapılan PoC sonucuna göre DynamoDB için kullanılan SDK ile kurgulanan yapı arasında farklılıklar olunca MongoDB kullanmaya karar verdik.

.Net Core ile Audit.Net

  • Audit.WebApi
  • Audit.WebApi.Core

Nuget yardımıyla kütüphaneleri uygulamamıza ekledikten sonra kendi senaryonuza göre Audit.Net’i konfigüre edebilirsiniz.

Audit attribute ile istediğiniz endpoint üzerinde log tutmaya başlayabilirsiniz.

Default olarak AuditAttribute ile yukarıda görülen parametreleri loglayabilirsiniz.

Not : IncludeRequestBody özelliğini kullanmak istiyorsanız Request Buffering’i aktif hale getirmelisiniz.

Audit attribute ile basit anlamda gelen http requestlerini loglayabilirsiniz. Request ve response içerisinde bulunan body datası ile old ve new dataları karşılaştırabilirsiniz ancak bizim gibi custom field tutmak istiyorsanız o zaman MobiRoller yöntemine gelin.

Audit attribute gibi Action Filter Attribute’den inherit alarak kendi yapımızı oluşturalım.

  • Her log kaydı bir entity üzerinde olacaktır, bu yüzden primaryKey bizim için işlemin gerçekleştiği entity’nin primary key bilgisi olmalıdır.
  • bodyIgnore parametresi ile Login, Register, Change Password gibi endpointlerde log tutulurken old ve new bilgisi kaydedilmemelidir.

HttpContext içerisinde body stream olarak tutulduğu için json’a parse edelim.

ActionFilter’da bulunan OnActionExecuted override ederek custom AuditLogAttribute gerçekleştirebiliriz.

Artık yapmamız gereken endpointler üzerine bu attribute yerleştirmek :)

Artık her request’de kullanıcının belirtilen parametreler ile kayıtları kaydedilecek, ama nereye? Güzel soru :))

Audit.Net ile desteklenen tüm provider’ları kullanabilirsiniz. Audit.NET.MongoDB kütüphanesi ile data provider olarak mongo kullanabilirsiniz. (Biz öyle yaptık :)) )

Sample Data

Daha fazlası için Audit.Net github reposunu incelemenizi tavsiye ederim.

Bir sonraki sprint hikayesinde görüşmek üzere, hepiniz #EvdeKal’ın.

--

--

Furkan Güngör
Mobiroller Tech

Solution Developer — I want to change the world, give me the source code.