{"id":34950,"date":"2025-11-24T02:40:53","date_gmt":"2025-11-23T23:40:53","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=34950"},"modified":"2025-11-24T02:40:53","modified_gmt":"2025-11-23T23:40:53","slug":"express-projelerinizde-morgan-middlewareini-etkin-kullanim-rehberi","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/express-projelerinizde-morgan-middlewareini-etkin-kullanim-rehberi\/","title":{"rendered":"Express Projelerinizde Morgan Middleware&#8217;ini Etkin Kullan\u0131m Rehberi"},"content":{"rendered":"<p><body><\/p>\n<h2>Express Projelerinizde Morgan Middleware&#8217;ini Etkin Kullan\u0131m Rehberi<\/h2>\n<p>Web uygulamalar\u0131n\u0131n geli\u015ftirilmesi, da\u011f\u0131t\u0131m\u0131 ve bak\u0131m\u0131 s\u00fcre\u00e7lerinde, uygulaman\u0131n davran\u0131\u015flar\u0131n\u0131 izlemek ve potansiyel sorunlar\u0131 tespit etmek kritik \u00f6neme sahiptir. Sunucu taraf\u0131nda ger\u00e7ekle\u015fen her HTTP iste\u011finin ve yan\u0131t\u0131n\u0131n kaydedilmesi, uygulaman\u0131n performans\u0131, g\u00fcvenli\u011fi ve kararl\u0131l\u0131\u011f\u0131 hakk\u0131nda paha bi\u00e7ilmez bilgiler sunar. Node.js ve Express.js ekosisteminde, bu t\u00fcr bir istek g\u00fcnl\u00fc\u011f\u00fc (request logging) i\u00e7in en pop\u00fcler, esnek ve etkili ara\u00e7lardan biri Morgan middleware&#8217;idir.<\/p>\n<p>Morgan, Express uygulamalar\u0131n\u0131za gelen her HTTP iste\u011fini konsola veya bir dosyaya kolayca kaydetmenizi sa\u011flayan, hafif ve kullan\u0131m\u0131 basit bir ara\u00e7t\u0131r. Geli\u015ftirme ortam\u0131nda h\u0131zl\u0131 hata ay\u0131klama i\u00e7in konsola \u00e7\u0131kt\u0131 vermek, \u00fcretim ortam\u0131nda ise detayl\u0131 loglar\u0131 bir dosyaya yazarak daha sonra analiz etmek i\u00e7in idealdir. Bu makalede, Morgan&#8217;\u0131n Express projelerinizde nas\u0131l kurulaca\u011f\u0131ndan, temel kullan\u0131m\u0131ndan ileri seviye \u00f6zelle\u015ftirmelerine ve di\u011fer loglama k\u00fct\u00fcphaneleriyle entegrasyonuna kadar t\u00fcm y\u00f6nlerini detayl\u0131 bir \u015fekilde inceleyece\u011fiz.<\/p>\n<h3>Morgan Nedir ve Neden \u00d6nemlidir?<\/h3>\n<p>Morgan, Express.js i\u00e7in \u00f6zel olarak tasarlanm\u0131\u015f bir HTTP istek logger middleware&#8217;idir. Temel amac\u0131, sunucuya gelen her iste\u011fin metot (GET, POST), URL, HTTP durumu (200, 404, 500), yan\u0131t s\u00fcresi, uzak IP adresi gibi \u00e7e\u015fitli bilgilerini kaydetmektir. Bu bilgiler, a\u015fa\u011f\u0131daki nedenlerle son derece \u00f6nemlidir:<\/p>\n<p>*   <strong>Hata Ay\u0131klama ve Sorun Giderme:<\/strong> Uygulaman\u0131zda bir sorun olu\u015ftu\u011funda, loglar sorunun ne zaman ve hangi istekler s\u0131ras\u0131nda meydana geldi\u011fini anlaman\u0131za yard\u0131mc\u0131 olur. Hata kodlar\u0131 (\u00f6rn. 500 Internal Server Error) ile birlikte gelen istek detaylar\u0131, hatan\u0131n k\u00f6k nedenini bulmak i\u00e7in ilk ad\u0131md\u0131r.<br \/>\n*   <strong>Performans \u0130zleme:<\/strong> Her iste\u011fin ne kadar s\u00fcrede yan\u0131tland\u0131\u011f\u0131n\u0131 g\u00f6steren <code>response-time<\/code> gibi metrikler, uygulaman\u0131z\u0131n performans darbo\u011fazlar\u0131n\u0131 belirlemenize yard\u0131mc\u0131 olabilir. Yava\u015f yan\u0131t veren endpoint&#8217;leri tespit ederek optimizasyon yapabilirsiniz.<br \/>\n*   <strong>G\u00fcvenlik Analizi:<\/strong> \u015e\u00fcpheli istek kal\u0131plar\u0131n\u0131 (\u00f6rn. s\u00fcrekli ba\u015far\u0131s\u0131z giri\u015f denemeleri, al\u0131\u015f\u0131lmad\u0131k URL eri\u015fimleri) izleyerek potansiyel g\u00fcvenlik tehditlerini erken a\u015famada fark edebilirsiniz.<br \/>\n*   <strong>Kullan\u0131m Analizi:<\/strong> Hangi URL&#8217;lerin daha s\u0131k ziyaret edildi\u011fi, hangi HTTP metotlar\u0131n\u0131n kullan\u0131ld\u0131\u011f\u0131 gibi bilgiler, uygulaman\u0131z\u0131n kullan\u0131m kal\u0131plar\u0131n\u0131 anlaman\u0131za ve gelecekteki geli\u015ftirmeler i\u00e7in yol haritas\u0131 \u00e7\u0131karman\u0131za yard\u0131mc\u0131 olur.<br \/>\n*   <strong>Denetim ve Uyumluluk:<\/strong> Baz\u0131 sekt\u00f6rlerde veya uygulamalarda, yasal veya d\u00fczenleyici uyumluluk gereklilikleri nedeniyle t\u00fcm isteklerin kaydedilmesi zorunlu olabilir.<\/p>\n<p>Morgan, bu bilgileri esnek bir \u015fekilde sunarak geli\u015ftiricilere ve operasyon ekiplerine g\u00fc\u00e7l\u00fc bir ara\u00e7 sa\u011flar.<\/p>\n<h3>\u00d6n Ko\u015fullar<\/h3>\n<p>Morgan&#8217;\u0131 Express projenizde kullanmaya ba\u015flamadan \u00f6nce a\u015fa\u011f\u0131daki temel bilgilere ve ara\u00e7lara sahip oldu\u011funuzdan emin olun:<\/p>\n<p>*   <strong>Node.js ve npm\/yarn:<\/strong> Sisteminizde Node.js kurulu olmal\u0131d\u0131r. npm (Node Package Manager) veya yarn gibi bir paket y\u00f6neticisi de otomatik olarak Node.js ile birlikte gelir.<br \/>\n*   <strong>Express.js Temelleri:<\/strong> Express.js framework&#8217;\u00fcn\u00fcn nas\u0131l kuruldu\u011funu ve temel bir sunucu uygulamas\u0131n\u0131n nas\u0131l olu\u015fturuldu\u011funu bilmelisiniz. Middleware kavram\u0131na a\u015fina olman\u0131z \u00f6nemlidir.<br \/>\n*   <strong>Terminal\/Komut \u0130stemi:<\/strong> Komut sat\u0131r\u0131 aray\u00fcz\u00fcn\u00fc kullanarak paketleri y\u00fckleyebilmeli ve Node.js uygulamalar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rabilmelisiniz.<\/p>\n<h3>Kurulum<\/h3>\n<p>Morgan&#8217;\u0131 Express projenize eklemek olduk\u00e7a basittir. Projenizin ana dizininde bir terminal a\u00e7arak a\u015fa\u011f\u0131daki komutlardan birini \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<p><strong>npm ile:<\/strong><\/p>\n<pre><code class=\"language-bash\">npm install morgan<\/code><\/pre>\n<p><strong>yarn ile:<\/strong><\/p>\n<pre><code class=\"language-bash\">yarn add morgan<\/code><\/pre>\n<p>Bu komut, Morgan paketini projenizin <code>node_modules<\/code> dizinine indirecek ve <code>package.json<\/code> dosyan\u0131zdaki <code>dependencies<\/code> b\u00f6l\u00fcm\u00fcne ekleyecektir.<\/p>\n<h3>Temel Kullan\u0131m<\/h3>\n<p>Morgan&#8217;\u0131 Express uygulaman\u0131zda bir middleware olarak kullan\u0131rs\u0131n\u0131z. Uygulaman\u0131za gelen her iste\u011fi yakalar ve belirtti\u011finiz formata g\u00f6re loglama yapar.<\/p>\n<p>\u0130lk olarak, <code>index.js<\/code> veya ana uygulama dosyan\u0131zda Morgan&#8217;\u0131 i\u00e7e aktarman\u0131z gerekir:<\/p>\n<pre><code class=\"language-javascript\">const express = require('express');\nconst morgan = require('morgan'); \/\/ Morgan'\u0131 i\u00e7e aktar\u0131n\n\nconst app = express();\nconst port = 3000;\n\n\/\/ Morgan'\u0131 bir middleware olarak kullan\u0131n\napp.use(morgan('dev'));\n\n\/\/ Basit bir route\napp.get('\/', (req, res) => {\n  res.send('Merhaba Express!');\n});\n\n\/\/ Ba\u015fka bir route\napp.get('\/api\/users', (req, res) => {\n  res.json([{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }]);\n});\n\napp.listen(port, () => {\n  console.log(<code>Sunucu http:\/\/localhost:${port} adresinde \u00e7al\u0131\u015f\u0131yor.<\/code>);\n});<\/code><\/pre>\n<p>Yukar\u0131daki \u00f6rnekte, <code>app.use(morgan('dev'));<\/code> sat\u0131r\u0131 Morgan&#8217;\u0131 uygulaman\u0131za entegre eder. <code>'dev'<\/code> burada Morgan&#8217;\u0131n \u00f6nceden tan\u0131mlanm\u0131\u015f log formatlar\u0131ndan biridir.<\/p>\n<p>Morgan, geli\u015ftiricilerin ihtiya\u00e7lar\u0131na g\u00f6re farkl\u0131 detay seviyelerinde loglama yapabilmesi i\u00e7in \u00e7e\u015fitli \u00f6nceden tan\u0131mlanm\u0131\u015f formatlar sunar:<\/p>\n<p>*   <strong><code>dev<\/code>:<\/strong> Geli\u015ftirme ortam\u0131 i\u00e7in uygun, renkli ve \u00f6zl\u00fc bir format. \u0130stek metodu, URL, durum kodu, yan\u0131t s\u00fcresi ve i\u00e7erik uzunlu\u011funu g\u00f6sterir. Hata durumlar\u0131nda (4xx, 5xx) k\u0131rm\u0131z\u0131 renkte g\u00f6r\u00fcn\u00fcr.<\/p>\n<pre><code class=\"language-\">GET \/ 200 12.000 ms - 17<\/code><\/pre>\n<p>*   <strong><code>tiny<\/code>:<\/strong> Minimum bilgi i\u00e7eren \u00e7ok k\u0131sa bir format. Metot, URL, durum kodu, i\u00e7erik uzunlu\u011fu ve yan\u0131t s\u00fcresi.<\/p>\n<pre><code class=\"language-\">GET \/ 200 17 - 12.000 ms<\/code><\/pre>\n<p>*   <strong><code>short<\/code>:<\/strong> <code>tiny<\/code>&#8216;den biraz daha fazla bilgi i\u00e7erir. Metot, URL, IP adresi, durum kodu, i\u00e7erik uzunlu\u011fu ve yan\u0131t s\u00fcresi.<\/p>\n<pre><code class=\"language-\">::1 - GET \/ HTTP\/1.1 200 17 - 12.000 ms<\/code><\/pre>\n<p>*   <strong><code>common<\/code>:<\/strong> Apache ortak log format\u0131na benzer. Uzak IP adresi, uzak kullan\u0131c\u0131 (varsa), tarih\/saat, metot, URL, HTTP versiyonu, durum kodu, i\u00e7erik uzunlu\u011fu.<\/p>\n<pre><code class=\"language-\">::1 - - [01\/Jan\/2024:12:00:00 +0000] \"GET \/ HTTP\/1.1\" 200 17<\/code><\/pre>\n<p>*   <strong><code>combined<\/code>:<\/strong> Apache birle\u015fik log format\u0131na benzer. <code>common<\/code> format\u0131na ek olarak referrer ve user-agent bilgilerini de i\u00e7erir. \u00dcretim ortamlar\u0131 i\u00e7in genellikle tercih edilir.<\/p>\n<pre><code class=\"language-\">::1 - - [01\/Jan\/2024:12:00:00 +0000] \"GET \/ HTTP\/1.1\" 200 17 \"-\" \"Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/...\"<\/code><\/pre>\n<p>Bu formatlar\u0131 kullanarak uygulaman\u0131z\u0131n loglama \u00e7\u0131kt\u0131s\u0131n\u0131 kolayca de\u011fi\u015ftirebilirsiniz. \u00d6rne\u011fin, \u00fcretim ortam\u0131nda daha detayl\u0131 loglar i\u00e7in <code>combined<\/code> format\u0131n\u0131 tercih edebilirsiniz:<\/p>\n<pre><code class=\"language-javascript\">\/\/ \u00dcretim ortam\u0131 i\u00e7in\n\/\/ app.use(morgan('combined'));\n\n\/\/ Geli\u015ftirme ortam\u0131 i\u00e7in\napp.use(morgan('dev'));<\/code><\/pre>\n<h3>\u00d6zel Formatlar Olu\u015fturma<\/h3>\n<p>Morgan&#8217;\u0131n \u00f6nceden tan\u0131mlanm\u0131\u015f formatlar\u0131 \u00e7o\u011fu zaman yeterli olsa da, bazen uygulaman\u0131z\u0131n veya i\u015fletmenizin \u00f6zel ihtiya\u00e7lar\u0131na g\u00f6re daha spesifik veya farkl\u0131 bir log format\u0131na ihtiyac\u0131n\u0131z olabilir. Morgan, bu durumu ele almak i\u00e7in kendi format\u0131n\u0131z\u0131 belirlemenize olanak tan\u0131yan esnek bir token sistemi sunar.<\/p>\n<p>\u00d6zel bir format olu\u015fturmak i\u00e7in, Morgan&#8217;a bir string parametre olarak istedi\u011finiz token&#8217;lar\u0131 ve statik metinleri i\u00e7eren bir \u015fablon verirsiniz. Morgan, bu token&#8217;lar\u0131 her istek i\u00e7in ilgili de\u011ferlerle de\u011fi\u015ftirir.<\/p>\n<p>\u0130\u015fte en s\u0131k kullan\u0131lan baz\u0131 token&#8217;lar:<\/p>\n<p>*   <strong><code>:method<\/code><\/strong>: HTTP iste\u011fi metodu (GET, POST, PUT, DELETE vb.).<br \/>\n*   <strong><code>:url<\/code><\/strong>: \u0130ste\u011fin URL&#8217;si.<br \/>\n*   <strong><code>:status<\/code><\/strong>: Yan\u0131t\u0131n durum kodu (200, 404, 500 vb.).<br \/>\n*   <strong><code>:response-time<\/code><\/strong>: Yan\u0131t\u0131n g\u00f6nderilmesi i\u00e7in ge\u00e7en s\u00fcre (milisaniye cinsinden).<br \/>\n*   <strong><code>:remote-addr<\/code><\/strong>: \u0130ste\u011fi yapan istemcinin IP adresi.<br \/>\n*   <strong><code>:remote-user<\/code><\/strong>: \u0130ste\u011fi yapan uzak kullan\u0131c\u0131 (varsa).<br \/>\n*   <strong><code>:http-version<\/code><\/strong>: HTTP protokol versiyonu (1.0, 1.1, 2.0).<br \/>\n*   <strong><code>:user-agent<\/code><\/strong>: \u0130stemcinin User-Agent ba\u015fl\u0131\u011f\u0131.<br \/>\n*   <strong><code>:referrer<\/code><\/strong>: \u0130ste\u011fin geldi\u011fi referrer URL.<br \/>\n*   <strong><code>:date[format]<\/code><\/strong>: \u0130ste\u011fin yap\u0131ld\u0131\u011f\u0131 tarih ve saat. <code>format<\/code> parametresi <code>clf<\/code> (Common Log Format), <code>iso<\/code> (ISO 8601), <code>web<\/code> (RFC 1123) veya \u00f6zel bir <code>moment.js<\/code> format\u0131 olabilir. \u00d6rne\u011fin, <code>:date[iso]<\/code>.<br \/>\n*   <strong><code>:req[header-name]<\/code><\/strong>: Belirli bir istek ba\u015fl\u0131\u011f\u0131n\u0131n de\u011feri. \u00d6rne\u011fin, <code>:req[Content-Type]<\/code> veya <code>:req[Authorization]<\/code>.<br \/>\n*   <strong><code>:res[header-name]<\/code><\/strong>: Belirli bir yan\u0131t ba\u015fl\u0131\u011f\u0131n\u0131n de\u011feri. \u00d6rne\u011fin, <code>:res[Content-Length]<\/code>.<br \/>\n*   <strong><code>:total-time<\/code><\/strong>: \u0130ste\u011fin ba\u015flamas\u0131ndan yan\u0131t\u0131n tamamen g\u00f6nderilmesine kadar ge\u00e7en toplam s\u00fcre.<br \/>\n*   <strong><code>:pid<\/code><\/strong>: Sunucu s\u00fcrecinin Process ID&#8217;si.<\/p>\n<p><strong>\u00d6rnek \u00d6zel Format:<\/strong><\/p>\n<p>Diyelim ki, her istek i\u00e7in IP adresi, tarih, metot, URL, durum kodu, yan\u0131t s\u00fcresi, referans URL&#8217;si ve user-agent bilgilerini i\u00e7eren daha detayl\u0131 bir log \u00e7\u0131kt\u0131s\u0131 istiyorsunuz:<\/p>\n<pre><code class=\"language-javascript\">app.use(morgan(':remote-addr - :remote-user [:date[clf]] \":method :url HTTP\/:http-version\" :status :res[content-length] \":referrer\" \":user-agent\"'));<\/code><\/pre>\n<p>Bu format, <code>combined<\/code> format\u0131na benzer ancak tam kontrol size aittir. \u00c7\u0131kt\u0131 \u015f\u00f6yle g\u00f6r\u00fcnebilir:<\/p>\n<pre><code class=\"language-\">::1 - - [01\/Jan\/2024:12:00:00 +0000] \"GET \/ HTTP\/1.1\" 200 17 \"-\" \"Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/...\"<\/code><\/pre>\n<p><strong>Kendi \u00d6zel Token&#8217;\u0131n\u0131z\u0131 Tan\u0131mlama:<\/strong><\/p>\n<p>Morgan, mevcut token&#8217;lar\u0131n \u00f6tesinde kendi \u00f6zel token&#8217;lar\u0131n\u0131z\u0131 tan\u0131mlaman\u0131za da olanak tan\u0131r. Bu, uygulaman\u0131za \u00f6zg\u00fc bilgileri (\u00f6rne\u011fin, oturum kimli\u011fi, kullan\u0131c\u0131 ID&#8217;si) loglara eklemek istedi\u011finizde \u00e7ok kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<p><code>morgan.token()<\/code> metodunu kullanarak yeni bir token tan\u0131mlayabilirsiniz:<\/p>\n<pre><code class=\"language-javascript\">morgan.token('id', function getId(req) {\n  return req.id; \/\/ Express'in req.id \u00f6zelli\u011fi varsa onu kullan\u0131r\n});\n\n\/\/ E\u011fer req.id yoksa veya farkl\u0131 bir yerden geliyorsa\nmorgan.token('user-id', (req, res) => {\n  \/\/ \u00d6rne\u011fin, bir kimlik do\u011frulama middleware'i kullan\u0131c\u0131 ID'sini req.user.id'ye eklemi\u015f olabilir.\n  return req.user ? req.user.id : 'misafir';\n});\n\n\/\/ \u00d6zel token'\u0131 format string'inizde kullan\u0131n\napp.use(morgan(':id :method :url :status :response-time ms'));\n\/\/ veya\napp.use(morgan(':user-id :method :url :status :response-time ms'));<\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>id<\/code> veya <code>user-id<\/code> ad\u0131nda yeni bir token tan\u0131mlad\u0131k. Bu token&#8217;lar, istek nesnesinden (<code>req<\/code>) veya yan\u0131t nesnesinden (<code>res<\/code>) bilgi alabilir. Bu \u015fekilde, uygulaman\u0131z\u0131n i\u015f mant\u0131\u011f\u0131na \u00f6zg\u00fc verileri loglara dahil edebilirsiniz.<\/p>\n<h3>Loglar\u0131 Bir Dosyaya Yazma<\/h3>\n<p>Geli\u015ftirme ortam\u0131nda loglar\u0131 konsola yazd\u0131rmak kullan\u0131\u015fl\u0131 olsa da, \u00fcretim ortam\u0131nda loglar\u0131 bir dosyaya kaydetmek \u00e7ok daha \u00f6nemlidir. Dosya loglar\u0131:<\/p>\n<p>*   <strong>Kal\u0131c\u0131d\u0131r:<\/strong> Sunucu yeniden ba\u015flat\u0131lsa bile loglar kaybolmaz.<br \/>\n*   <strong>Merkezi Analiz:<\/strong> Log toplama ara\u00e7lar\u0131 (ELK Stack, Splunk vb.) taraf\u0131ndan kolayca i\u015flenebilir ve analiz edilebilir.<br \/>\n*   <strong>Performans:<\/strong> Konsola yazmaktan ziyade dosyaya yazmak, \u00f6zellikle y\u00fcksek trafikli uygulamalarda daha verimli olabilir.<\/p>\n<p>Morgan, loglar\u0131 bir dosyaya yazmak i\u00e7in Node.js&#8217;in <code>fs<\/code> (file system) mod\u00fcl\u00fc ile birlikte kullan\u0131labilir. <code>fs.createWriteStream()<\/code> metodunu kullanarak bir yazma ak\u0131\u015f\u0131 (write stream) olu\u015fturur ve bunu Morgan&#8217;\u0131n <code>stream<\/code> se\u00e7ene\u011fine ge\u00e7irirsiniz.<\/p>\n<pre><code class=\"language-javascript\">const express = require('express');\nconst morgan = require('morgan');\nconst fs = require('fs');\nconst path = require('path');\n\nconst app = express();\nconst port = 3000;\n\n\/\/ Loglar\u0131n yaz\u0131laca\u011f\u0131 dizini olu\u015fturun (e\u011fer yoksa)\nconst logDirectory = path.join(__dirname, 'log');\nfs.existsSync(logDirectory) || fs.mkdirSync(logDirectory);\n\n\/\/ Bir yazma ak\u0131\u015f\u0131 olu\u015fturun (append mode)\nconst accessLogStream = fs.createWriteStream(path.join(logDirectory, 'access.log'), { flags: 'a' });\n\n\/\/ Morgan'\u0131 'combined' format\u0131nda ve olu\u015fturdu\u011fumuz stream'e yazacak \u015fekilde kullan\u0131n\napp.use(morgan('combined', { stream: accessLogStream }));\n\n\/\/ Ayr\u0131ca geli\u015ftirme ortam\u0131nda konsola da yazd\u0131rmak isteyebilirsiniz\n\/\/ app.use(morgan('dev')); \/\/ Bu sat\u0131r\u0131 yorumdan \u00e7\u0131kar\u0131rsan\u0131z hem dosyaya hem konsola yazar\n\napp.get('\/', (req, res) => {\n  res.send('Ana Sayfa');\n});\n\napp.get('\/api\/data', (req, res) => {\n  res.json({ message: 'Verileriniz burada.' });\n});\n\napp.listen(port, () => {\n  console.log(<code>Sunucu http:\/\/localhost:${port} adresinde \u00e7al\u0131\u015f\u0131yor.<\/code>);\n});<\/code><\/pre>\n<p>Bu \u00f6rnekte:<\/p>\n<p>1.  <code>log<\/code> dizini olu\u015fturulur (e\u011fer yoksa).<br \/>\n2.  <code>fs.createWriteStream()<\/code> kullanarak <code>access.log<\/code> dosyas\u0131na yazacak bir ak\u0131\u015f olu\u015fturulur. <code>flags: 'a'<\/code> se\u00e7ene\u011fi, dosyan\u0131n sonuna ekleme yap\u0131lmas\u0131n\u0131 sa\u011flar (append mode), b\u00f6ylece her sunucu yeniden ba\u015flat\u0131ld\u0131\u011f\u0131nda eski loglar silinmez.<br \/>\n3.  <code>morgan('combined', { stream: accessLogStream })<\/code> sat\u0131r\u0131, Morgan&#8217;\u0131 <code>combined<\/code> format\u0131nda \u00e7\u0131kt\u0131 vermesi ve bu \u00e7\u0131kt\u0131y\u0131 <code>accessLogStream<\/code>&#8216;e y\u00f6nlendirmesi i\u00e7in yap\u0131land\u0131r\u0131r.<\/p>\n<p><strong>Log Rotasyonu (Log Rotation):<\/strong><\/p>\n<p>\u00dcretim ortam\u0131nda, log dosyalar\u0131 zamanla \u00e7ok b\u00fcy\u00fck boyutlara ula\u015fabilir. Bu durum, disk alan\u0131n\u0131 t\u00fcketebilir ve loglar\u0131n okunmas\u0131n\u0131\/i\u015flenmesini zorla\u015ft\u0131rabilir. Bu sorunu \u00e7\u00f6zmek i\u00e7in &#8220;log rotasyonu&#8221; kullan\u0131l\u0131r. Log rotasyonu, belirli bir boyuta veya zamana ula\u015ft\u0131\u011f\u0131nda mevcut log dosyas\u0131n\u0131 ar\u015fivleyip yeni bir log dosyas\u0131 olu\u015fturma i\u015flemidir.<\/p>\n<p>Morgan&#8217;\u0131n kendisi yerle\u015fik bir log rotasyonu \u00f6zelli\u011fi sunmaz. Bunun i\u00e7in a\u015fa\u011f\u0131daki yakla\u015f\u0131mlar\u0131 kullanabilirsiniz:<\/p>\n<p>*   <strong>\u0130\u015fletim Sistemi Ara\u00e7lar\u0131:<\/strong> Linux sistemlerinde <code>logrotate<\/code> gibi ara\u00e7lar, log dosyalar\u0131n\u0131 otomatik olarak d\u00f6nd\u00fcrmek, s\u0131k\u0131\u015ft\u0131rmak ve temizlemek i\u00e7in kullan\u0131labilir. Bu, sunucu d\u00fczeyinde yap\u0131land\u0131r\u0131l\u0131r.<br \/>\n*   <strong>\u00dc\u00e7\u00fcnc\u00fc Parti Node.js K\u00fct\u00fcphaneleri:<\/strong> <code>rotating-file-stream<\/code> veya <code>winston-daily-rotate-file<\/code> gibi k\u00fct\u00fcphaneler, Node.js uygulaman\u0131z i\u00e7inde programatik olarak log rotasyonu yapman\u0131za olanak tan\u0131r. Bu k\u00fct\u00fcphaneler, Morgan&#8217;\u0131n <code>stream<\/code> se\u00e7ene\u011fiyle entegre edilebilir.<\/p>\n<p>\u00d6rne\u011fin, <code>rotating-file-stream<\/code> ile basit bir entegrasyon:<\/p>\n<pre><code class=\"language-javascript\">const rfs = require('rotating-file-stream'); \/\/ npm install rotating-file-stream\n\n\/\/ ... di\u011fer kodlar ...\n\nconst accessLogStream = rfs.createStream('access.log', {\n  interval: '1d', \/\/ her g\u00fcn d\u00f6nd\u00fcr\n  path: logDirectory,\n  compress: 'gzip' \/\/ eski loglar\u0131 s\u0131k\u0131\u015ft\u0131r\n});\n\napp.use(morgan('combined', { stream: accessLogStream }));<\/code><\/pre>\n<p>Bu \u015fekilde, log dosyalar\u0131n\u0131z\u0131n y\u00f6netimi daha d\u00fczenli hale gelir.<\/p>\n<h3>Ko\u015fullu Loglama (Conditional Logging)<\/h3>\n<p>Bazen uygulaman\u0131zdaki belirli istekleri loglamak istemeyebilirsiniz. \u00d6rne\u011fin:<\/p>\n<p>*   <strong>Sa\u011fl\u0131k Kontrol\u00fc (Health Check) Endpoint&#8217;leri:<\/strong> S\u0131k s\u0131k sorgulanan <code>\/health<\/code> veya <code>\/status<\/code> gibi endpoint&#8217;ler, ger\u00e7ek uygulama trafi\u011fi hakk\u0131nda bilgi vermedi\u011fi i\u00e7in loglar\u0131 gereksiz yere \u015fi\u015firebilir.<br \/>\n*   <strong>Statik Dosyalar:<\/strong> Resimler, CSS veya JavaScript dosyalar\u0131 gibi statik varl\u0131klara yap\u0131lan istekler genellikle loglanmaya de\u011fer de\u011fildir.<br \/>\n*   <strong>Hata Durumlar\u0131:<\/strong> Yaln\u0131zca belirli bir HTTP durum koduna sahip istekleri (\u00f6rne\u011fin, sadece 4xx veya 5xx hatalar\u0131n\u0131) loglamak isteyebilirsiniz.<\/p>\n<p>Morgan, <code>skip<\/code> se\u00e7ene\u011fi arac\u0131l\u0131\u011f\u0131yla ko\u015fullu loglama yapman\u0131za olanak tan\u0131r. <code>skip<\/code> se\u00e7ene\u011fi, bir istek ve yan\u0131t nesnesi (<code>req<\/code>, <code>res<\/code>) alan ve loglama yap\u0131l\u0131p yap\u0131lmayaca\u011f\u0131n\u0131 belirten bir boolean de\u011fer d\u00f6nd\u00fcren bir fonksiyondur. E\u011fer fonksiyon <code>true<\/code> d\u00f6nd\u00fcr\u00fcrse, istek loglanmaz; <code>false<\/code> d\u00f6nd\u00fcr\u00fcrse loglan\u0131r.<\/p>\n<pre><code class=\"language-javascript\">const express = require('express');\nconst morgan = require('morgan');\n\nconst app = express();\nconst port = 3000;\n\n\/\/ Sadece 400 ve \u00fczeri durum kodlar\u0131na sahip istekleri logla\napp.use(morgan('dev', {\n  skip: function (req, res) { return res.statusCode < 400 }\n}));\n\n\/\/ Sa\u011fl\u0131k kontrol\u00fc endpoint'ini loglama\n\/\/ app.use(morgan('dev', {\n\/\/   skip: function (req, res) { return req.url === '\/health' }\n\/\/ }));\n\napp.get('\/', (req, res) => {\n  res.send('Ana Sayfa');\n});\n\napp.get('\/health', (req, res) => {\n  res.status(200).send('OK'); \/\/ Bu istek loglanmayacak (e\u011fer skip aktifse)\n});\n\napp.get('\/error', (req, res) => {\n  res.status(500).send('Bir hata olu\u015ftu!'); \/\/ Bu istek loglanacak\n});\n\napp.listen(port, () => {\n  console.log(<code>Sunucu http:\/\/localhost:${port} adresinde \u00e7al\u0131\u015f\u0131yor.<\/code>);\n});<\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>skip<\/code> fonksiyonu, yan\u0131t\u0131n durum kodu 400&#8217;den k\u00fc\u00e7\u00fckse <code>true<\/code> d\u00f6nd\u00fcr\u00fcr (yani loglama yapmaz). Bu sayede sadece istemci veya sunucu hatalar\u0131na yol a\u00e7an istekler loglan\u0131r.<\/p>\n<p>Birden fazla ko\u015fulu birle\u015ftirmek i\u00e7in mant\u0131ksal operat\u00f6rler kullanabilirsiniz:<\/p>\n<pre><code class=\"language-javascript\">app.use(morgan('dev', {\n  skip: function (req, res) {\n    return req.url === '\/health' || req.url.startsWith('\/static\/') || res.statusCode < 400;\n  }\n}));\n\napp.use(express.static('public')); \/\/ \u00d6rnek statik dosya sunumu<\/code><\/pre>\n<p>Bu yap\u0131land\u0131rma ile <code>\/health<\/code> URL'sine gelen istekler, <code>\/static\/<\/code> ile ba\u015flayan URL'lere gelen istekler ve 400'den d\u00fc\u015f\u00fck durum koduna sahip yan\u0131tlar loglanmayacakt\u0131r.<\/p>\n<h3>Di\u011fer Loglama K\u00fct\u00fcphaneleriyle Entegrasyon<\/h3>\n<p>Morgan, HTTP istek loglamas\u0131nda m\u00fckemmel olsa da, genel uygulama loglamas\u0131 (hata loglar\u0131, bilgi loglar\u0131, uyar\u0131lar vb.) i\u00e7in daha geli\u015fmi\u015f \u00f6zellikler sunan Winston veya Pino gibi k\u00fct\u00fcphanelerle birlikte kullanmak isteyebilirsiniz. Bu k\u00fct\u00fcphaneler genellikle:<\/p>\n<p>*   Farkl\u0131 log seviyeleri (debug, info, warn, error).<br \/>\n*   \u00c7e\u015fitli ta\u015f\u0131y\u0131c\u0131lar (konsol, dosya, veritaban\u0131, uzak servisler).<br \/>\n*   Yap\u0131sal loglama (JSON format\u0131nda loglar) gibi \u00f6zellikler sunar.<\/p>\n<p>Morgan'\u0131n \u00e7\u0131kt\u0131s\u0131n\u0131 bu geli\u015fmi\u015f loglama k\u00fct\u00fcphanelerine y\u00f6nlendirmek m\u00fcmk\u00fcnd\u00fcr. Bunun i\u00e7in yine Morgan'\u0131n <code>stream<\/code> se\u00e7ene\u011fini kullan\u0131r\u0131z, ancak bu sefer bir <code>fs.createWriteStream<\/code> yerine, di\u011fer loglama k\u00fct\u00fcphanesinin <code>write<\/code> metodunu kullanan bir nesne sa\u011flar\u0131z.<\/p>\n<p><strong>Winston ile Entegrasyon \u00d6rne\u011fi:<\/strong><\/p>\n<p>\u00d6nce Winston'\u0131 kurun: <code>npm install winston<\/code><\/p>\n<pre><code class=\"language-javascript\">const express = require('express');\nconst morgan = require('morgan');\nconst winston = require('winston'); \/\/ Winston'\u0131 i\u00e7e aktar\u0131n\n\nconst app = express();\nconst port = 3000;\n\n\/\/ Winston logger'\u0131 yap\u0131land\u0131r\u0131n\nconst logger = winston.createLogger({\n  level: 'info', \/\/ Hangi seviyeden itibaren loglama yap\u0131laca\u011f\u0131n\u0131 belirler\n  format: winston.format.json(), \/\/ Loglar\u0131 JSON format\u0131nda \u00e7\u0131kt\u0131 ver\n  transports: [\n    new winston.transports.Console(), \/\/ Konsola yaz\n    new winston.transports.File({ filename: 'combined.log' }) \/\/ Dosyaya yaz\n  ]\n});\n\n\/\/ Morgan'\u0131n \u00e7\u0131kt\u0131s\u0131n\u0131 Winston'a y\u00f6nlendirmek i\u00e7in bir stream nesnesi olu\u015fturun\n\/\/ Winston'\u0131n bir \"stream\" \u00f6zelli\u011fi yoktur, ancak bir \"write\" metodu olan herhangi bir nesneyi kabul eder.\nconst morganStream = {\n  write: (message) => {\n    logger.info(message.trim()); \/\/ Morgan'dan gelen mesaj\u0131 Winston ile 'info' seviyesinde logla\n  },\n};\n\n\/\/ Morgan'\u0131 'combined' format\u0131nda ve olu\u015fturdu\u011fumuz stream'e yazacak \u015fekilde kullan\u0131n\napp.use(morgan('combined', { stream: morganStream }));\n\n\/\/ Uygulama genelinde hata loglamas\u0131 i\u00e7in Winston'\u0131 kullanabilirsiniz\napp.use((req, res, next) => {\n  req.logger = logger; \/\/ \u0130ste\u011fe logger nesnesini ekleyebiliriz\n  next();\n});\n\napp.get('\/', (req, res) => {\n  req.logger.info('Ana sayfaya istek geldi.'); \/\/ Uygulama logu\n  res.send('Merhaba Express!');\n});\n\napp.get('\/error-test', (req, res, next) => {\n  const err = new Error('Bu bir test hatas\u0131d\u0131r!');\n  err.status = 500;\n  next(err); \/\/ Hata i\u015fleme middleware'ine y\u00f6nlendir\n});\n\n\/\/ Hata i\u015fleme middleware'i\napp.use((err, req, res, next) => {\n  logger.error(<code>${err.status || 500} - ${err.message} - ${req.originalUrl} - ${req.method} - ${req.ip}<\/code>);\n  res.status(err.status || 500).send('Sunucu hatas\u0131');\n});\n\napp.listen(port, () => {\n  logger.info(<code>Sunucu http:\/\/localhost:${port} adresinde \u00e7al\u0131\u015f\u0131yor.<\/code>);\n});<\/code><\/pre>\n<p>Bu kurulumda, Morgan sadece HTTP istek loglar\u0131n\u0131 yakalar ve bunlar\u0131 Winston'\u0131n <code>info<\/code> seviyesinde i\u015flemesini sa\u011flar. Uygulama i\u00e7indeki di\u011fer loglar (\u00f6rne\u011fin, <code>\/error-test<\/code> route'undaki hata) do\u011frudan Winston taraf\u0131ndan y\u00f6netilir. Bu, loglar\u0131n\u0131z\u0131n tutarl\u0131 bir formatta ve tek bir merkezi loglama sisteminde toplanmas\u0131n\u0131 sa\u011flar.<\/p>\n<h3>Hata Loglamas\u0131 ve Express Hata \u0130\u015fleme<\/h3>\n<p>Morgan, HTTP isteklerinin durumunu (ba\u015far\u0131l\u0131, istemci hatas\u0131, sunucu hatas\u0131) g\u00f6steren durum kodlar\u0131n\u0131 loglar. \u00d6rne\u011fin, 500 Internal Server Error durum koduyla sonu\u00e7lanan bir iste\u011fi Morgan \u00e7\u0131kt\u0131s\u0131nda g\u00f6rebilirsiniz. Ancak Morgan'\u0131n kendisi, bu hatan\u0131n nedenini (\u00f6rne\u011fin, stack trace) veya uygulama i\u00e7indeki hata nesnesinin detaylar\u0131n\u0131 loglamaz.<\/p>\n<p>Uygulama i\u00e7indeki hatalar\u0131 (istisnalar, veritaban\u0131 hatalar\u0131 vb.) yakalamak ve detayl\u0131 bir \u015fekilde loglamak i\u00e7in Express'in kendi hata i\u015fleme middleware'ini ve Winston veya Pino gibi daha geli\u015fmi\u015f bir loglama k\u00fct\u00fcphanesini kullanman\u0131z gerekir.<\/p>\n<p><strong>Express Hata \u0130\u015fleme \u00d6rne\u011fi:<\/strong><\/p>\n<pre><code class=\"language-javascript\">const express = require('express');\nconst morgan = require('morgan');\nconst winston = require('winston');\n\nconst app = express();\nconst port = 3000;\n\nconst logger = winston.createLogger({\n  level: 'info',\n  format: winston.format.json(),\n  transports: [\n    new winston.transports.Console(),\n    new winston.transports.File({ filename: 'app-errors.log', level: 'error' }) \/\/ Sadece 'error' seviyesindeki loglar\u0131 buraya yaz\n  ]\n});\n\n\/\/ Morgan, t\u00fcm istekleri loglar, hatal\u0131 olanlar dahil\napp.use(morgan('dev'));\n\napp.get('\/', (req, res) => {\n  res.send('Ana Sayfa');\n});\n\napp.get('\/cause-error', (req, res, next) => {\n  try {\n    throw new Error('Uygulama i\u00e7inde beklenmedik bir hata olu\u015ftu!');\n  } catch (error) {\n    next(error); \/\/ Hatay\u0131 hata i\u015fleme middleware'ine g\u00f6nder\n  }\n});\n\n\/\/ Hata i\u015fleme middleware'i - 4 parametreli olmal\u0131 (err, req, res, next)\napp.use((err, req, res, next) => {\n  logger.error({\n    message: err.message,\n    stack: err.stack, \/\/ Hatan\u0131n detayl\u0131 izini logla\n    url: req.originalUrl,\n    method: req.method,\n    ip: req.ip,\n    timestamp: new Date().toISOString()\n  });\n  res.status(500).send('Sunucu hatas\u0131 olu\u015ftu. L\u00fctfen daha sonra tekrar deneyin.');\n});\n\napp.listen(port, () => {\n  logger.info(<code>Sunucu http:\/\/localhost:${port} adresinde \u00e7al\u0131\u015f\u0131yor.<\/code>);\n});<\/code><\/pre>\n<p>Bu senaryoda:<\/p>\n<p>1.  <code>\/cause-error<\/code> endpoint'ine yap\u0131lan bir istek, <code>morgan('dev')<\/code> taraf\u0131ndan loglan\u0131r ve muhtemelen <code>GET \/cause-error 500 ...<\/code> gibi bir \u00e7\u0131kt\u0131 verir.<br \/>\n2.  <code>try...catch<\/code> blo\u011fundaki hata, <code>next(error)<\/code> ile hata i\u015fleme middleware'ine iletilir.<br \/>\n3.  Hata i\u015fleme middleware'i, Winston <code>logger.error()<\/code> metodunu kullanarak hatan\u0131n mesaj\u0131n\u0131, stack trace'ini ve istekle ilgili di\u011fer detaylar\u0131 <code>app-errors.log<\/code> dosyas\u0131na (veya konsola) yazar.<\/p>\n<p>Bu yakla\u015f\u0131m, hem HTTP istek loglar\u0131n\u0131 (Morgan ile) hem de uygulama i\u00e7indeki detayl\u0131 hata loglar\u0131n\u0131 (Winston veya Pino ile) ayr\u0131 ayr\u0131 ve etkili bir \u015fekilde y\u00f6netmenizi sa\u011flar. Morgan'\u0131n \u00e7\u0131kt\u0131s\u0131, bir iste\u011fin neden 500 hatas\u0131 d\u00f6nd\u00fcrd\u00fc\u011f\u00fcn\u00fc g\u00f6sterir; Winston'\u0131n \u00e7\u0131kt\u0131s\u0131 ise bu 500 hatas\u0131n\u0131n i\u00e7 detaylar\u0131n\u0131 a\u00e7\u0131klar.<\/p>\n<h3>Performans De\u011ferlendirmeleri<\/h3>\n<p>Loglama, uygulaman\u0131z\u0131n performans\u0131na hafif de olsa bir y\u00fck getirecektir. Her istek i\u00e7in log kayd\u0131 olu\u015fturmak, CPU d\u00f6ng\u00fcleri ve G\/\u00c7 (Input\/Output) i\u015flemleri gerektirir. Y\u00fcksek trafikli uygulamalarda bu etki g\u00f6z ard\u0131 edilmemelidir.<\/p>\n<p>Morgan'\u0131 kullan\u0131rken performans g\u00f6z \u00f6n\u00fcnde bulundurularak \u015funlara dikkat edilmelidir:<\/p>\n<p>*   <strong>Format Se\u00e7imi:<\/strong> \u00dcretim ortam\u0131nda <code>dev<\/code> gibi \u00e7ok detayl\u0131 ve renkli formatlardan ka\u00e7\u0131n\u0131n. <code>combined<\/code> veya \u00f6zel olarak olu\u015fturulmu\u015f, sadece gerekli bilgileri i\u00e7eren formatlar daha az i\u015flem y\u00fck\u00fc getirir. A\u015f\u0131r\u0131 token kullan\u0131m\u0131, her iste\u011fin i\u015flenmesi gereken veri miktar\u0131n\u0131 art\u0131r\u0131r.<br \/>\n*   <strong>Ko\u015fullu Loglama:<\/strong> Gereksiz istekleri (sa\u011fl\u0131k kontrolleri, statik dosyalar) <code>skip<\/code> se\u00e7ene\u011fi ile loglamayarak performans\u0131 art\u0131rabilirsiniz.<br \/>\n*   <strong>Dosyaya Yazma:<\/strong> Dosyaya yazma i\u015flemleri genellikle asenkrondur, bu da uygulaman\u0131n ana i\u015f par\u00e7ac\u0131\u011f\u0131n\u0131 engellemez. Ancak, \u00e7ok s\u0131k ve b\u00fcy\u00fck log dosyalar\u0131na yazmak, disk G\/\u00c7'sini zorlayabilir. Log rotasyonu bu y\u00fck\u00fc hafifletmeye yard\u0131mc\u0131 olur.<br \/>\n*   <strong>Di\u011fer Loglama K\u00fct\u00fcphaneleri:<\/strong> Winston veya Pino gibi k\u00fct\u00fcphaneler genellikle loglar\u0131 tamponlama (buffering) veya farkl\u0131 i\u015f par\u00e7ac\u0131klar\u0131nda i\u015fleme gibi optimizasyonlar sunar. Morgan'\u0131 bu t\u00fcr k\u00fct\u00fcphanelerle entegre etmek, loglama performans\u0131n\u0131 genel olarak art\u0131rabilir.<br \/>\n*   <strong>Hassas Veriler:<\/strong> Performans\u0131n yan\u0131 s\u0131ra, hassas verileri (\u015fifreler, API anahtarlar\u0131, ki\u015fisel bilgiler) loglamaktan ka\u00e7\u0131nmak g\u00fcvenlik a\u00e7\u0131s\u0131ndan da kritik \u00f6neme sahiptir. \u00d6zel token'lar olu\u015ftururken veya formatlar\u0131 belirlerken bu konuya dikkat edin.<\/p>\n<h3>En \u0130yi Uygulamalar<\/h3>\n<p>Morgan'\u0131 Express projelerinizde en verimli ve g\u00fcvenli \u015fekilde kullanmak i\u00e7in a\u015fa\u011f\u0131daki en iyi uygulamalar\u0131 g\u00f6z \u00f6n\u00fcnde bulundurun:<\/p>\n<p>1.  <strong>Ortama G\u00f6re Format Se\u00e7imi:<\/strong> Geli\u015ftirme ortam\u0131nda <code>dev<\/code> gibi renkli ve \u00f6zl\u00fc formatlar\u0131 kullan\u0131rken, \u00fcretim ortam\u0131nda <code>combined<\/code> veya kendi olu\u015fturdu\u011funuz, daha az detayl\u0131 ancak kritik bilgileri i\u00e7eren formatlar\u0131 tercih edin.<br \/>\n2.  <strong>\u00dcretimde Dosya Loglama:<\/strong> Canl\u0131 sistemlerde loglar\u0131 konsola de\u011fil, her zaman bir dosyaya yaz\u0131n. Bu, loglar\u0131n kal\u0131c\u0131l\u0131\u011f\u0131n\u0131 ve merkezi olarak toplanabilirli\u011fini sa\u011flar.<br \/>\n3.  <strong>Log Rotasyonu Kullan\u0131n:<\/strong> Log dosyalar\u0131n\u0131n boyutunu y\u00f6netmek i\u00e7in i\u015fletim sistemi ara\u00e7lar\u0131n\u0131 (<code>logrotate<\/code>) veya Node.js k\u00fct\u00fcphanelerini (<code>rotating-file-stream<\/code>) kullanarak log rotasyonunu uygulay\u0131n.<br \/>\n4.  <strong>Hassas Verileri Loglamay\u0131n:<\/strong> \u015eifreler, kimlik bilgileri, kredi kart\u0131 numaralar\u0131 veya di\u011fer ki\u015fisel tan\u0131mlay\u0131c\u0131 bilgileri i\u00e7eren istek ba\u015fl\u0131klar\u0131n\u0131 veya g\u00f6vdelerini loglamaktan ka\u00e7\u0131n\u0131n. \u00d6zel formatlar olu\u015ftururken bu token'lar\u0131 dahil etmeyin.<br \/>\n5.  <strong>Yap\u0131sal Loglama \u0130\u00e7in Entegre Edin:<\/strong> Daha geli\u015fmi\u015f analiz, filtreleme ve arama yetenekleri i\u00e7in Morgan'\u0131 Winston veya Pino gibi yap\u0131sal loglama k\u00fct\u00fcphaneleriyle entegre edin. Bu, loglar\u0131n\u0131z\u0131 JSON gibi makine taraf\u0131ndan okunabilir bir formatta tutman\u0131z\u0131 sa\u011flar.<br \/>\n6.  <strong>Merkezi Log Y\u00f6netimi:<\/strong> B\u00fcy\u00fck \u00f6l\u00e7ekli uygulamalarda, loglar\u0131 merkezi bir log toplama sistemine (ELK Stack, Grafana Loki, Splunk, Datadog vb.) g\u00f6nderin. Bu, birden fazla sunucudan gelen loglar\u0131 tek bir yerden izlemenizi ve analiz etmenizi kolayla\u015ft\u0131r\u0131r.<br \/>\n7.  <strong>Hata \u0130\u015fleme ile Birlikte Kullan\u0131n:<\/strong> Morgan, HTTP istek hatalar\u0131n\u0131 g\u00f6sterse de, uygulama i\u00e7indeki detayl\u0131 hata loglar\u0131 i\u00e7in Express'in hata i\u015fleme middleware'i ve ayr\u0131 bir loglama k\u00fct\u00fcphanesi kullan\u0131n.<br \/>\n8.  <strong><code>skip<\/code> Se\u00e7ene\u011fini Ak\u0131ll\u0131ca Kullan\u0131n:<\/strong> Gereksiz log g\u00fcr\u00fclt\u00fcs\u00fcn\u00fc azaltmak ve performans\u0131 art\u0131rmak i\u00e7in sa\u011fl\u0131k kontrol\u00fc endpoint'leri veya statik dosyalar gibi \u00f6nemsiz istekleri loglamay\u0131 atlay\u0131n.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Morgan, Express.js uygulamalar\u0131 i\u00e7in vazge\u00e7ilmez bir HTTP istek logger middleware'idir. Basit kurulumu, esnek format se\u00e7enekleri ve g\u00fc\u00e7l\u00fc \u00f6zelle\u015ftirme yetenekleri sayesinde, uygulaman\u0131z\u0131n geli\u015ftirme, hata ay\u0131klama ve \u00fcretim s\u00fcre\u00e7lerinde kritik bir rol oynar. \u0130ster h\u0131zl\u0131 bir geli\u015ftirme \u00e7\u0131kt\u0131s\u0131, ister detayl\u0131 bir \u00fcretim logu ar\u0131yor olun, Morgan ihtiya\u00e7lar\u0131n\u0131za uygun bir \u00e7\u00f6z\u00fcm sunar.<\/p>\n<p>Bu makalede Morgan'\u0131n temel kullan\u0131m\u0131ndan, \u00f6zel formatlar olu\u015fturmaya, loglar\u0131 dosyalara yazmaya, ko\u015fullu loglama yapmaya ve di\u011fer geli\u015fmi\u015f loglama k\u00fct\u00fcphaneleriyle entegrasyona kadar bir\u00e7ok y\u00f6n\u00fcn\u00fc ele ald\u0131k. Morgan'\u0131 en iyi uygulamalara uygun \u015fekilde kullanarak, Express uygulaman\u0131z\u0131n izlenebilirli\u011fini, g\u00fcvenli\u011fini ve kararl\u0131l\u0131\u011f\u0131n\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131rabilirsiniz. Uygulaman\u0131z\u0131n ne yapt\u0131\u011f\u0131n\u0131 anlamak ve gerekti\u011finde sorunlar\u0131 h\u0131zla \u00e7\u00f6zmek i\u00e7in loglama, her zaman \u00f6ncelikli bir konu olmal\u0131d\u0131r ve Morgan bu s\u00fcrecin temel ta\u015flar\u0131ndan biridir.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Express Projelerinizde Morgan Middleware&#8217;ini Etkin Kullan\u0131m Rehberi\nWeb uygulamalar\u0131n\u0131n geli\u015ftirilmesi, da\u011f\u0131t\u0131m\u0131 ve bak\u0131m\u0131 s\u00fcre\u00e7lerinde,","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-34950","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Express Projelerinizde Morgan Middleware&#039;ini Etkin Kullan\u0131m Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/express-projelerinizde-morgan-middlewareini-etkin-kullanim-rehberi\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Express Projelerinizde Morgan Middleware&#039;ini Etkin Kullan\u0131m Rehberi\" \/>\n<meta property=\"og:description\" content=\"Express Projelerinizde Morgan Middleware&#039;ini Etkin Kullan\u0131m Rehberi Web uygulamalar\u0131n\u0131n geli\u015ftirilmesi, da\u011f\u0131t\u0131m\u0131 ve bak\u0131m\u0131 s\u00fcre\u00e7lerinde,\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/express-projelerinizde-morgan-middlewareini-etkin-kullanim-rehberi\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-23T23:40:53+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"20 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/express-projelerinizde-morgan-middlewareini-etkin-kullanim-rehberi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/express-projelerinizde-morgan-middlewareini-etkin-kullanim-rehberi\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Express Projelerinizde Morgan Middleware&#8217;ini Etkin Kullan\u0131m Rehberi\",\"datePublished\":\"2025-11-23T23:40:53+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/express-projelerinizde-morgan-middlewareini-etkin-kullanim-rehberi\/\"},\"wordCount\":2960,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/express-projelerinizde-morgan-middlewareini-etkin-kullanim-rehberi\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/express-projelerinizde-morgan-middlewareini-etkin-kullanim-rehberi\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/express-projelerinizde-morgan-middlewareini-etkin-kullanim-rehberi\/\",\"name\":\"Express Projelerinizde Morgan Middleware'ini Etkin Kullan\u0131m Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-23T23:40:53+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/express-projelerinizde-morgan-middlewareini-etkin-kullanim-rehberi\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/express-projelerinizde-morgan-middlewareini-etkin-kullanim-rehberi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/express-projelerinizde-morgan-middlewareini-etkin-kullanim-rehberi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Express Projelerinizde Morgan Middleware&#8217;ini Etkin Kullan\u0131m Rehberi\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Express Projelerinizde Morgan Middleware'ini Etkin Kullan\u0131m Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/express-projelerinizde-morgan-middlewareini-etkin-kullanim-rehberi\/","og_locale":"tr_TR","og_type":"article","og_title":"Express Projelerinizde Morgan Middleware'ini Etkin Kullan\u0131m Rehberi","og_description":"Express Projelerinizde Morgan Middleware'ini Etkin Kullan\u0131m Rehberi Web uygulamalar\u0131n\u0131n geli\u015ftirilmesi, da\u011f\u0131t\u0131m\u0131 ve bak\u0131m\u0131 s\u00fcre\u00e7lerinde,","og_url":"https:\/\/fatihsoysal.com\/blog\/express-projelerinizde-morgan-middlewareini-etkin-kullanim-rehberi\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-23T23:40:53+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"20 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/express-projelerinizde-morgan-middlewareini-etkin-kullanim-rehberi\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/express-projelerinizde-morgan-middlewareini-etkin-kullanim-rehberi\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Express Projelerinizde Morgan Middleware&#8217;ini Etkin Kullan\u0131m Rehberi","datePublished":"2025-11-23T23:40:53+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/express-projelerinizde-morgan-middlewareini-etkin-kullanim-rehberi\/"},"wordCount":2960,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/express-projelerinizde-morgan-middlewareini-etkin-kullanim-rehberi\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/express-projelerinizde-morgan-middlewareini-etkin-kullanim-rehberi\/","url":"https:\/\/fatihsoysal.com\/blog\/express-projelerinizde-morgan-middlewareini-etkin-kullanim-rehberi\/","name":"Express Projelerinizde Morgan Middleware'ini Etkin Kullan\u0131m Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-23T23:40:53+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/express-projelerinizde-morgan-middlewareini-etkin-kullanim-rehberi\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/express-projelerinizde-morgan-middlewareini-etkin-kullanim-rehberi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/express-projelerinizde-morgan-middlewareini-etkin-kullanim-rehberi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Express Projelerinizde Morgan Middleware&#8217;ini Etkin Kullan\u0131m Rehberi"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34950","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=34950"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34950\/revisions"}],"predecessor-version":[{"id":34951,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34950\/revisions\/34951"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=34950"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=34950"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=34950"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}