23:20 hataların hocayla birlikte çözülmesi bence çok iyi oluyor, muhtemelen başka bir eğitimde bu kısımlar kesilir. Öyle olunca da Cem Yılmaz'ın dediği gibi "Burada yapılmışı var" tadında bir eğitim oluyor. Bu haliyle eğitimler hem daha samimi oluyor, hem de hatalara nasıl yaklaşılacağını görüyoruz.
Elinize sağlık hocam kapsamlı bir içerik olmuş. Sektörde loglama zaman zaman kısa vadede zaman bakımından maliyet olarak gözükse de uzun vadede iyi kurgulanmayan loglama çok daha maliyetli olmakta.
Giyim mağazasında mağaza müdürü 1.5 yıl boyunca her akşam 2 -3 satışı silip parayı cebe atıyormuş 300 küsür bin tl parayı hiç etmiş. Biz programda kullanıcı hareketlerini tutuyorduk. Yeni müdür geldikten 15 gün sonra farketmiş mevzu büyüdü gitti.. bilmem video ile alakalı mı ama Log çok değerli 😎
henüz videoyu izlemedim ancak yıllar önce bir ticaret firmasında da benzer bir iş için analiz yapmıştık. Log analizi ile çıkardığımız rapor sonucunda 90 bin sterlin açık çıkmıştı.
Güncellenen Entity ve propertylerini kaydetmek istenildiğinde otomatik json olarak kaydettiğinden dolayı json loop oluyor navigation property'ler sonsuz döngüye girerek tekrarlı data oluşturuyor. JsonIgnore yapılsada devam ediyor..
Aynılarını bir bir yaptım, githubdan da izledim, connectionStringi de zibilyon kere kontrol edip yazdım fakat dbde table oluşturamıyorum. Sorunu yaşayan var mı? Sıkıntı isimlendirmeymiş, user_name yerine user-name yazdım diye öyle olmuş. İsterseniz ahmet verebilirsiniz demiştiniz. Dbyi oluşturmamasının sebebi -(özel karakter) mi yoksa farklı isim vermiş olmam mı?
@ Yazım size değildi hocam. Siz teknolojiyi, aracı ve kullanımını göstermişsiniz. Benim maksadım benim gibi bununla uygulama geliştirecek arkadaşlara not olsun manasındaydı. 🙏
Hocam size kısa bir soru daha sormak istiyorum daha 4 gun once yaptıklarımı suan unuttum ne icin yaptıgımı bu normal mi yani o an ciddi anlamda anlamıstım ama simdi koda bakınca neden acab diye sorguluyorum bu olagan bir sey mi yoksa olan mıdır hocam siz ne dusunuyorsunuz ?
2 года назад+4
Olağan tabi. Onca mimari, onca design pattern öğreniyoruz, uyguluyoruz, yazıyoruz, anlatıyoruz lakin 3 hafta sonra dökümanlara bakmaksızın çoğu şeyi hatırlamıyorum :)
- Hocam merhaba, UserName'i yakalayıp veri tabanına yazabilmesi için giriş yapmış olmak ve herhangi bir action methodu çağırmak yetmiyor. - Hem giriş yapmış olmak hem de çağırılan action method'un [Authorize(AuthenticationSchemes = "Admin")] ile işaretlenmiş olması gerekiyor. Aksi halde veri tabanında log ile ilgili tabloda UserName null olarak devam ediyor. Doğru mu böyle mi çalışması gerekiyor yoksa bende bir eksik mi var?
2 года назад+1
Doğru, çünkü doğrulamayı Admin şemasıyla gerçekleştiriyoruz.
@ Hocam benim entegrasyonumda [Authorize(AuthenticationSchemes = "Admin")] bunu kullanmıyorum daha farklı bir token üretme kodum var userName sürekli null geliyor breakpoint koydum middleware üzerine iki kere giriyor ilkinde username null ikincisinde gözüküyor veritabanı null oluyor sorun ne olabilir (Mssql kullanıyorum CustomUserNameColumn içeriside null geliyor)
edit hata cözdüm aynı sorunu yaşayanlar için public class CustomUserNameColumn : ILogEventEnricher { public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory) { // HttpContextAccessor örneği üzerinden JWT'yi al var httpContextAccessor = new HttpContextAccessor(); var username = httpContextAccessor.HttpContext?.User?.Identity?.Name; if (!string.IsNullOrEmpty(username)) { var getValue = propertyFactory.CreateProperty("UserName", username); logEvent.AddPropertyIfAbsent(getValue); } } } bu kod usernameyi getiriyor
Hocam biz konsola yazıyoruz logları daha sonra bir tool yardımıyla konsoldan logları toplayıp Kibanaya yazıyoruz. Tertemiz mis gibi oluyor. Tabi sizin yöntem de gayet güzel. Edit: Hocam biz logları db ye yazarsak sürekli bu db şişmez mi ya aklıma takıldı dersin ortasında
Hocam Redis ve RabbitMQ özellikle iş ilanlarında çok karşımıza çıkıyor ve çok değerli konular. Sizin anlatımız ile birçok öğrenciniz istifade etmiş olacak. Çok hayır duası alırsınız:)
Logger log = new LoggerConfiguration() .WriteTo.Console() .WriteTo.File("logs/logs.txt") .WriteTo.MSSqlServer(builder.Configuration.GetConnectionString("ConnectionString"), "logs", autoCreateSqlTable: true) .CreateLogger(); builder.Host.UseSerilog(log); hocam selam mssql için ekledim fakat otomatik olarak oluşturmadı db de logs tablosunu sizce neden ?
23:20 hataların hocayla birlikte çözülmesi bence çok iyi oluyor, muhtemelen başka bir eğitimde bu kısımlar kesilir. Öyle olunca da Cem Yılmaz'ın dediği gibi "Burada yapılmışı var" tadında bir eğitim oluyor. Bu haliyle eğitimler hem daha samimi oluyor, hem de hatalara nasıl yaklaşılacağını görüyoruz.
Hocam Allah razı olsun sizden, ellerinize sağlık
Elinize sağlık hocam kapsamlı bir içerik olmuş.
Sektörde loglama zaman zaman kısa vadede zaman bakımından maliyet olarak gözükse de uzun vadede iyi kurgulanmayan loglama çok daha maliyetli olmakta.
Hocam her zamanki gibi çok güzel bir anlatım yapmışsınız teşekkür ederim.
MsSql kullanan arkadaşlar
Program.cs
SqlColumn sqlColumn = new SqlColumn();
sqlColumn.ColumnName = "UserName";
sqlColumn.DataType = System.Data.SqlDbType.NVarChar;
sqlColumn.PropertyName = "UserName";
sqlColumn.DataLength = 50;
sqlColumn.AllowNull = true;
ColumnOptions columnOpt = new ColumnOptions();
columnOpt.Store.Remove(StandardColumn.Properties);
columnOpt.Store.Add(StandardColumn.LogEvent);
columnOpt.AdditionalColumns = new Collection { sqlColumn};
Logger log = new LoggerConfiguration()
.WriteTo.Console()
.WriteTo.File("logs/log.txt")
.WriteTo.MSSqlServer(
connectionString: builder.Configuration.GetConnectionString("SqlCon"),
sinkOptions: new MSSqlServerSinkOptions
{
AutoCreateSqlTable = true,
TableName = "logs",
},
appConfiguration: null,
columnOptions: columnOpt
)
.Enrich.FromLogContext()
.Enrich.With()
.MinimumLevel.Information()
.CreateLogger();
builder.Host.UseSerilog(log);
public class CustomUserNameColumn : ILogEventEnricher
{
public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory)
{
var (username, value) = logEvent.Properties.FirstOrDefault(x => x.Key == "UserName");
if (value != null)
{
var getValue= propertyFactory.CreateProperty(username,value);
logEvent.AddPropertyIfAbsent(getValue);
}
}
}
kolonu ekleyebilir ve tablodaki sütuna username değerini aktarabilirsiniz.
Çok teşekkürler
eline sağlık.
2 günümü aldı. Sonunda yorumlara bakmaya karar verdim ve çalıştı. Teşekkür ederim eline sağlık.
MySql olan versiyonu var mı :((
@@mr.kuzoluk68 bulabildiniz mi acaba
Ellerinize sağlık hocam, çok teşekkürler
Giyim mağazasında mağaza müdürü 1.5 yıl boyunca her akşam 2 -3 satışı silip parayı cebe atıyormuş 300 küsür bin tl parayı hiç etmiş. Biz programda kullanıcı hareketlerini tutuyorduk. Yeni müdür geldikten 15 gün sonra farketmiş mevzu büyüdü gitti.. bilmem video ile alakalı mı ama Log çok değerli 😎
henüz videoyu izlemedim ancak yıllar önce bir ticaret firmasında da benzer bir iş için analiz yapmıştık. Log analizi ile çıkardığımız rapor sonucunda 90 bin sterlin açık çıkmıştı.
Güncellenen Entity ve propertylerini kaydetmek istenildiğinde otomatik json olarak kaydettiğinden dolayı json loop oluyor navigation property'ler sonsuz döngüye girerek tekrarlı data oluşturuyor. JsonIgnore yapılsada devam ediyor..
hocam bu arada havanın birden kararması ile sizin ekrana cıkmanıza cok gulduk affedin.... 1:17:33
Bence hoca o gün oruc tutmus olabilir. Iftardan sonra cekime devam 🤣
Teşekkürler hocam
Teşekkürler.
Hocam projede rabbitmq'ye de yer verecek misiniz ?
Elinize sağlık hocam🌾 zor bir dersti .d
Aynılarını bir bir yaptım, githubdan da izledim, connectionStringi de zibilyon kere kontrol edip yazdım fakat dbde table oluşturamıyorum. Sorunu yaşayan var mı?
Sıkıntı isimlendirmeymiş, user_name yerine user-name yazdım diye öyle olmuş. İsterseniz ahmet verebilirsiniz demiştiniz. Dbyi oluşturmamasının sebebi -(özel karakter) mi yoksa farklı isim vermiş olmam mı?
Bu logu site içerisinde işleyip bizim göstermemiz lazım. Seq çok güzel bir araç ama bana tam istediğimi vermiyor gibi.
Bi monitoring ayağıda site içerisinde olursa tadından yenmez tabi.
@ Yazım size değildi hocam. Siz teknolojiyi, aracı ve kullanımını göstermişsiniz. Benim maksadım benim gibi bununla uygulama geliştirecek arkadaşlara not olsun manasındaydı. 🙏
@@taner-saydam olsun katıldım bende işte 🙃
MySQL olanını nasıl yapıcaz bilen var mı :((
Hocam size kısa bir soru daha sormak istiyorum daha 4 gun once yaptıklarımı suan unuttum ne icin yaptıgımı bu normal mi yani o an ciddi anlamda anlamıstım ama simdi koda bakınca neden acab diye sorguluyorum bu olagan bir sey mi yoksa olan mıdır hocam siz ne dusunuyorsunuz ?
Olağan tabi. Onca mimari, onca design pattern öğreniyoruz, uyguluyoruz, yazıyoruz, anlatıyoruz lakin 3 hafta sonra dökümanlara bakmaksızın çoğu şeyi hatırlamıyorum :)
- Hocam merhaba, UserName'i yakalayıp veri tabanına yazabilmesi için giriş yapmış olmak ve herhangi bir action methodu çağırmak yetmiyor.
- Hem giriş yapmış olmak hem de çağırılan action method'un [Authorize(AuthenticationSchemes = "Admin")] ile işaretlenmiş olması gerekiyor. Aksi halde veri tabanında log ile ilgili tabloda UserName null olarak devam ediyor.
Doğru mu böyle mi çalışması gerekiyor yoksa bende bir eksik mi var?
Doğru, çünkü doğrulamayı Admin şemasıyla gerçekleştiriyoruz.
@ Hocam benim entegrasyonumda [Authorize(AuthenticationSchemes = "Admin")] bunu kullanmıyorum daha farklı bir token üretme kodum var userName sürekli null geliyor breakpoint koydum middleware üzerine iki kere giriyor ilkinde username null ikincisinde gözüküyor veritabanı null oluyor sorun ne olabilir (Mssql kullanıyorum CustomUserNameColumn içeriside null geliyor)
edit hata cözdüm aynı sorunu yaşayanlar için public class CustomUserNameColumn : ILogEventEnricher
{
public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory)
{
// HttpContextAccessor örneği üzerinden JWT'yi al
var httpContextAccessor = new HttpContextAccessor();
var username = httpContextAccessor.HttpContext?.User?.Identity?.Name;
if (!string.IsNullOrEmpty(username))
{
var getValue = propertyFactory.CreateProperty("UserName", username);
logEvent.AddPropertyIfAbsent(getValue);
}
}
} bu kod usernameyi getiriyor
Hocam biz konsola yazıyoruz logları daha sonra bir tool yardımıyla konsoldan logları toplayıp Kibanaya yazıyoruz. Tertemiz mis gibi oluyor. Tabi sizin yöntem de gayet güzel.
Edit: Hocam biz logları db ye yazarsak sürekli bu db şişmez mi ya aklıma takıldı dersin ortasında
hocam nolursunuz rabbitMQ anlatın lütfennnnnnnnnnnnnnnn rabbitmq ve worker service veya hanfire bir de lütfennnnnnn redissssssssssssssss lütfen hocam
Hocam Redis ve RabbitMQ özellikle iş ilanlarında çok karşımıza çıkıyor ve çok değerli konular. Sizin anlatımız ile birçok öğrenciniz istifade etmiş olacak. Çok hayır duası alırsınız:)
Logger log = new LoggerConfiguration()
.WriteTo.Console()
.WriteTo.File("logs/logs.txt")
.WriteTo.MSSqlServer(builder.Configuration.GetConnectionString("ConnectionString"), "logs", autoCreateSqlTable: true)
.CreateLogger();
builder.Host.UseSerilog(log);
hocam selam mssql için ekledim fakat otomatik olarak oluşturmadı db de logs tablosunu sizce neden ?
burada ki sorunu halledebildin mi bende de aynı problem var ?
Logger log = new LoggerConfiguration()
.WriteTo.Console()
.WriteTo.File("logs/log.txt")
.WriteTo.MSSqlServer(builder.Configuration.GetConnectionString("MSSQL"), sinkOptions: new MSSqlServerSinkOptions { TableName = "Log" , AutoCreateSqlTable=true }
, null, null, LogEventLevel.Warning, null,null, null, null)
.CreateLogger();
builder.Host.UseSerilog(log);
Bunu kullanabilirsiniz.Ayrıca, Serilog.Sinks.MSSqlServer Paketi 6.0.0 yerine 5.8.0 kurarsanız sql bağlantı hatası vermıyor.
selam.ColumnOptions nasil yazdiniz mssql de ?
@@korayer35 Teşekkürler işe yaradı