﻿
{"id":19604,"date":"2020-12-01T22:00:43","date_gmt":"2020-12-01T22:00:43","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=19604"},"modified":"2020-12-01T22:00:43","modified_gmt":"2020-12-01T22:00:43","slug":"entity-framework-core-query-log","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/entity-framework-core-query-log\/","title":{"rendered":"Entity Framework Core &#8211; Query Log"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Entity Framework Core mimarisinde yaz\u0131lan LINQ sorgular\u0131 neticesinde generate edilen sorgular\u0131 izleyebilmek ve olas\u0131 teknik hatalar\u0131 ay\u0131klayabilmek amac\u0131yla loglama mekanizmas\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rmam\u0131z gerekebilmektedir. Bu ihtiyaca istinaden, .NET Core&#8217;da dahili olarak gelen log mekanizmas\u0131 Entity Framework Core ile entegre olabilmekte ve i\u015flevselli\u011fini g\u00f6sterebilmektedir. Bizler bu i\u00e7eri\u011fimizde LINQ sorgular\u0131 neticesinde olu\u015fturulan sql query&#8217;lerinin nas\u0131l loglan\u0131p, izlenebilece\u011fini ele alacak ve pratik olarak inceleyece\u011fiz.<\/p>\n<p>\u0130lk olarak LINQ sorgular\u0131 neticesinde olu\u015fturulacak sql sorgular\u0131n\u0131 loglayaca\u011f\u0131m\u0131z platformu se\u00e7erek ba\u015flayal\u0131m. Bunun i\u00e7in \u015fimdilik Console olduk\u00e7a ideal olsa gerek. Haliyle ilgili projeye console&#8217;da loglama yapabilmek i\u00e7in <a href=\"https:\/\/www.nuget.org\/packages\/microsoft.extensions.logging.console\" rel=\"noopener noreferrer\" target=\"_blank\">Microsoft.Extensions.Logging.Console<\/a> k\u00fct\u00fcphanesini y\u00fcklemeli ve altyap\u0131 olarak s\u00fcrece haz\u0131r olmal\u0131y\u0131z.<\/p>\n<p>\u0130lgili k\u00fct\u00fcphaneyi y\u00fckledikten sonra uygulamadaki DbContext ile log mekanizmas\u0131n\u0131n nas\u0131l entegre olduklar\u0131n\u0131 ve i\u015flevsellik g\u00f6sterdiklerini a\u015fa\u011f\u0131daki g\u00f6rsel \u00fczerinden inceleyelim;<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/Entity-Framework-Core-Query-Log.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/Entity-Framework-Core-Query-Log.jpg\" alt=\"Entity Framework Core - Query Log\" width=\"1195\" height=\"469\" class=\"aligncenter size-full wp-image-19611\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/Entity-Framework-Core-Query-Log.jpg 1195w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/Entity-Framework-Core-Query-Log-300x118.jpg 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/Entity-Framework-Core-Query-Log-1024x402.jpg 1024w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/Entity-Framework-Core-Query-Log-768x301.jpg 768w\" sizes=\"auto, (max-width: 1195px) 100vw, 1195px\" \/><\/a><br \/>\nG\u00f6rselden de anla\u015f\u0131laca\u011f\u0131 \u00fczere manuel olu\u015fturulacak olan <em>ILoggerFactory<\/em>, DbContext nesnesi ile ili\u015fkilendirilmektedir. <em>ILoggerFactory<\/em> ise akabinde yukar\u0131da y\u00fckledi\u011fimiz console uygulamas\u0131n\u0131n paketini kullanarak(keza kullan\u0131lan platform her ne ise onunda paketi olabilir) i\u015flevini ger\u00e7ekle\u015ftirmektedir.<\/p>\n<p>Misal, a\u015fa\u011f\u0131daki \u00f6rnek DbContext&#8217;i inceleyebilirsiniz;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class CompanyContext : DbContext\r\n    {\r\n        public DbSet&lt;Employee&gt; Employees { get; set; }\r\n        public DbSet&lt;Sale&gt; Sales { get; set; }\r\n\r\n        public static readonly ILoggerFactory loggerFactory = LoggerFactory.Create(builder =&gt; builder.AddConsole());\r\n        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)\r\n        {\r\n            optionsBuilder.UseSqlServer(&quot;Server=.;Database=CompanyDb;Trusted_Connection=True;&quot;)\r\n                          .UseLoggerFactory(loggerFactory);\r\n            base.OnConfiguring(optionsBuilder);\r\n        }\r\n    }\r\n<\/pre>\n<p><strong><em>6.<\/em><\/strong> sat\u0131rda static olarak olu\u015fturulan <em>ILoggerFactory<\/em> nesnesi, <strong><em>10.<\/em><\/strong> sat\u0131rda &#8216;UseLoggerFactory&#8217; metoduna verilerek bu DbContext ile ili\u015fkilendirilmekte ve uygulamada bu context \u00fczerinden generate edilecek t\u00fcm query&#8217;ler loglanmaya haz\u0131r hale getirilmektedir.<\/p>\n<p>Buyrun deneyelim&#8230;<\/p>\n<table>\n<thead>\n<tr>\n<th>Select Query<\/th>\n<th>Insert Query<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/Entity-Framework-Core-Query-Log-1.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/Entity-Framework-Core-Query-Log-1.jpg\" alt=\"Entity Framework Core - Query Log\" width=\"704\" height=\"271\" class=\"aligncenter size-full wp-image-19617\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/Entity-Framework-Core-Query-Log-1.jpg 704w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/Entity-Framework-Core-Query-Log-1-300x115.jpg 300w\" sizes=\"auto, (max-width: 704px) 100vw, 704px\" \/><\/a>\n<\/td>\n<td><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/Entity-Framework-Core-Query-Log-2.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/Entity-Framework-Core-Query-Log-2.jpg\" alt=\"Entity Framework Core - Query Log\" width=\"594\" height=\"455\" class=\"aligncenter size-full wp-image-19619\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/Entity-Framework-Core-Query-Log-2.jpg 594w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/Entity-Framework-Core-Query-Log-2-300x230.jpg 300w\" sizes=\"auto, (max-width: 594px) 100vw, 594px\" \/><\/a><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Evet&#8230; G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere sorgular\u0131m\u0131z ba\u015far\u0131yla loglanmaktad\u0131r&#8230;<\/p>\n<h4>Filtreleme<\/h4>\n<p>Yukar\u0131daki \u00f6rneklerde g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere olu\u015fturulan sorgulara dair t\u00fcm bilgiler loglanmaktad\u0131r. Bu bazen tercih etmek istemeyece\u011fimiz bir durum olabilir ve loglanacak verileri belli k\u0131staslarla filtrelemek ihtiyac\u0131 duyabiliriz.<\/p>\n<p>Misal;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n.\r\n.\r\n.\r\n        public static readonly ILoggerFactory loggerFactory = LoggerFactory.Create(builder =&gt; builder\r\n        .AddFilter((category, level) =&gt; \r\n            category == DbLoggerCategory.Database.Command.Name \r\n             &amp;&amp; \r\n            level == LogLevel.Information)\r\n        .AddConsole());\r\n.\r\n.\r\n.\r\n<\/pre>\n<p>Yukar\u0131daki \u00f6rnekte oldu\u011fu gibi &#8216;AddFilter&#8217; fonksiyonu ile log seviyesi ve category de\u011ferleri \u015farta ba\u011fl\u0131 bir \u015fekilde filtrelenebilir. B\u00f6ylece log datas\u0131 istenildi\u011fi gibi \u00f6zelle\u015ftirilebilmektedir.<\/p>\n<p>\u0130\u015fte bu kadar \ud83d\ude42 Okudu\u011funuz i\u00e7in te\u015fekk\u00fcr ederim.<\/p>\n<p>\u0130lgilenenlerin faydalanmas\u0131 dile\u011fiyle&#8230;<br \/>\nSonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar&#8230;<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Merhaba, Entity Framework Core mimarisinde yaz\u0131lan LINQ sorgular\u0131 neticesinde generate edilen sorgular\u0131 izleyebilmek ve olas\u0131 teknik hatalar\u0131 ay\u0131klayabilmek amac\u0131yla loglama mekanizmas\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rmam\u0131z gerekebilmektedir. Bu ihtiyaca istinaden, .NET Core&#8217;da dahili olarak gelen log mekanizmas\u0131 Entity&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":11538,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[955,2914],"tags":[2850,3983,3984],"class_list":["post-19604","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-entity-framework","category-entity-framework-core","tag-entity-framework-core","tag-entity-framework-core-query-log","tag-query-log"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/19604","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=19604"}],"version-history":[{"count":18,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/19604\/revisions"}],"predecessor-version":[{"id":19625,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/19604\/revisions\/19625"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/11538"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=19604"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=19604"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=19604"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}