{"id":35372,"date":"2025-11-28T23:40:56","date_gmt":"2025-11-28T20:40:56","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=35372"},"modified":"2025-11-28T23:40:56","modified_gmt":"2025-11-28T20:40:56","slug":"winston-ile-node-js-uygulamalarini-ubuntu-16-04-uzerinde-gunluge-kaydetme-rehberi","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/winston-ile-node-js-uygulamalarini-ubuntu-16-04-uzerinde-gunluge-kaydetme-rehberi\/","title":{"rendered":"Winston ile Node.js Uygulamalar\u0131n\u0131 Ubuntu 16.04 \u00dczerinde G\u00fcnl\u00fc\u011fe Kaydetme Rehberi"},"content":{"rendered":"<p><body><\/p>\n<h2>Winston ile Node.js Uygulamalar\u0131n\u0131 Ubuntu 16.04 \u00dczerinde G\u00fcnl\u00fc\u011fe Kaydetme Rehberi<\/h2>\n<h3>Giri\u015f<\/h3>\n<p>Modern yaz\u0131l\u0131m geli\u015ftirmenin temel ta\u015flar\u0131ndan biri, uygulamalar\u0131n davran\u0131\u015flar\u0131n\u0131 izlemek, hatalar\u0131 ay\u0131klamak ve performans sorunlar\u0131n\u0131 tespit etmek i\u00e7in kapsaml\u0131 bir g\u00fcnl\u00fck (logging) sistemine sahip olmakt\u0131r. Node.js uygulamalar\u0131, \u00f6zellikle sunucu taraf\u0131nda \u00e7al\u0131\u015ft\u0131klar\u0131nda, \u00fcretim ortam\u0131nda olu\u015fan sorunlar\u0131 h\u0131zl\u0131ca tespit edebilmek ve \u00e7\u00f6zebilmek i\u00e7in g\u00fc\u00e7l\u00fc bir g\u00fcnl\u00fckleme mekanizmas\u0131na ihtiya\u00e7 duyarlar. Geleneksel <code>console.log()<\/code> kullan\u0131m\u0131 geli\u015ftirme a\u015famas\u0131nda yeterli olsa da, \u00fcretim ortam\u0131nda bu y\u00f6ntem yetersiz kal\u0131r. G\u00fcnl\u00fck seviyeleri, farkl\u0131 \u00e7\u0131kt\u0131 hedefleri (konsol, dosya, veritaban\u0131, uzak sunucu) ve \u00f6zelle\u015ftirilebilir formatlar gibi \u00f6zellikler sunan profesyonel bir g\u00fcnl\u00fckleme k\u00fct\u00fcphanesi kullanmak zorunluluktur.<\/p>\n<p>Bu teknik makalede, Node.js ekosisteminin en pop\u00fcler ve g\u00fc\u00e7l\u00fc g\u00fcnl\u00fckleme k\u00fct\u00fcphanelerinden biri olan Winston&#8217;\u0131, Ubuntu 16.04 i\u015fletim sistemi \u00fczerinde Node.js uygulamalar\u0131n\u0131z\u0131 g\u00fcnl\u00fc\u011fe kaydetmek i\u00e7in nas\u0131l kullanaca\u011f\u0131n\u0131z\u0131 ayr\u0131nt\u0131l\u0131 olarak ele alaca\u011f\u0131z. Winston&#8217;\u0131n temel kurulumundan geli\u015fmi\u015f konfig\u00fcrasyonlar\u0131na, farkl\u0131 g\u00fcnl\u00fck ta\u015f\u0131y\u0131c\u0131lar\u0131n\u0131n (transports) kullan\u0131m\u0131ndan hata y\u00f6netimine ve Ubuntu&#8217;nun yerel ara\u00e7lar\u0131yla (\u00f6rne\u011fin <code>logrotate<\/code>) entegrasyonuna kadar her ad\u0131m\u0131 pratik \u00f6rneklerle a\u00e7\u0131klayaca\u011f\u0131z. Amac\u0131m\u0131z, Node.js uygulamalar\u0131n\u0131z i\u00e7in sa\u011flam, y\u00f6netilebilir ve etkili bir g\u00fcnl\u00fckleme altyap\u0131s\u0131 olu\u015fturman\u0131za yard\u0131mc\u0131 olmakt\u0131r.<\/p>\n<h3>Neden Winston?<\/h3>\n<p>Piyasada bir\u00e7ok Node.js g\u00fcnl\u00fckleme k\u00fct\u00fcphanesi bulunmas\u0131na ra\u011fmen, Winston bir\u00e7ok geli\u015ftirici taraf\u0131ndan tercih edilmektedir. Bunun ba\u015fl\u0131ca nedenleri \u015funlard\u0131r:<\/p>\n<p>*   <strong>Mod\u00fcler Mimari (Transports):<\/strong> Winston, g\u00fcnl\u00fck mesajlar\u0131n\u0131 farkl\u0131 hedeflere (konsol, dosya, HTTP, veritaban\u0131 vb.) g\u00f6nderebilen &#8220;ta\u015f\u0131y\u0131c\u0131lar&#8221; (transports) ad\u0131 verilen mod\u00fcler bir yap\u0131ya sahiptir. Bu, ayn\u0131 g\u00fcnl\u00fck mesaj\u0131n\u0131 farkl\u0131 formatlarda birden fazla yere g\u00f6ndermenize olanak tan\u0131r.<br \/>\n*   <strong>Esnek G\u00fcnl\u00fck Seviyeleri:<\/strong> <code>error<\/code>, <code>warn<\/code>, <code>info<\/code>, <code>http<\/code>, <code>verbose<\/code>, <code>debug<\/code>, <code>silly<\/code> gibi standart g\u00fcnl\u00fck seviyelerini destekler ve iste\u011fe ba\u011fl\u0131 olarak \u00f6zel seviyeler tan\u0131mlaman\u0131za izin verir. Bu seviyeler sayesinde, belirli \u00f6nem derecesindeki mesajlar\u0131 filtreleyebilir ve yaln\u0131zca ilgili g\u00fcnl\u00fckleri g\u00f6rebilirsiniz.<br \/>\n*   <strong>Geni\u015f Formatlama Se\u00e7enekleri:<\/strong> Winston, g\u00fcnl\u00fck mesajlar\u0131n\u0131n \u00e7\u0131kt\u0131s\u0131n\u0131 istedi\u011finiz gibi bi\u00e7imlendirmenizi sa\u011flayan zengin formatlama se\u00e7enekleri sunar. JSON, metin, zaman damgas\u0131, renkli \u00e7\u0131kt\u0131 ve tamamen \u00f6zel formatlar olu\u015fturabilirsiniz.<br \/>\n*   <strong>Hata Y\u00f6netimi:<\/strong> Uygulaman\u0131zdaki yakalanmam\u0131\u015f istisnalar\u0131 (uncaught exceptions) ve i\u015flenmemi\u015f reddedilmeleri (unhandled rejections) otomatik olarak g\u00fcnl\u00fc\u011fe kaydetme yetene\u011fi, \u00fcretim ortam\u0131ndaki kritik hatalar\u0131 tespit etmek i\u00e7in hayati \u00f6neme sahiptir.<br \/>\n*   <strong>Geni\u015fletilebilirlik:<\/strong> Kendi \u00f6zel ta\u015f\u0131y\u0131c\u0131lar\u0131n\u0131z\u0131 veya formatlar\u0131n\u0131z\u0131 kolayca yazarak Winston&#8217;\u0131 ihtiya\u00e7lar\u0131n\u0131za g\u00f6re uyarlayabilirsiniz.<br \/>\n*   <strong>Topluluk Deste\u011fi:<\/strong> Aktif bir toplulu\u011fa ve iyi belgelere sahip olmas\u0131, kar\u015f\u0131la\u015f\u0131lan sorunlarda h\u0131zl\u0131 \u00e7\u00f6z\u00fcmler bulmay\u0131 kolayla\u015ft\u0131r\u0131r.<\/p>\n<p>Bu \u00f6zellikler, Winston&#8217;\u0131 Node.js uygulamalar\u0131 i\u00e7in g\u00fc\u00e7l\u00fc ve esnek bir g\u00fcnl\u00fckleme \u00e7\u00f6z\u00fcm\u00fc haline getirmektedir.<\/p>\n<h3>\u00d6n Ko\u015fullar<\/h3>\n<p>Bu rehberi takip edebilmek i\u00e7in a\u015fa\u011f\u0131daki \u00f6n ko\u015fullar\u0131n sa\u011flanm\u0131\u015f olmas\u0131 gerekmektedir:<\/p>\n<p>*   <strong>Ubuntu 16.04 \u0130\u015fletim Sistemi:<\/strong> Bir Ubuntu 16.04 sunucusu veya sanal makinesi. (Temel Node.js ve Winston prensipleri di\u011fer Linux da\u011f\u0131t\u0131mlar\u0131nda da ge\u00e7erli olsa da, baz\u0131 sistem ayarlar\u0131 Ubuntu 16.04&#8217;e \u00f6zel olabilir.)<br \/>\n*   <strong>Node.js ve npm:<\/strong> Ubuntu 16.04 \u00fczerinde Node.js ve npm (Node Package Manager) kurulu olmal\u0131d\u0131r.<br \/>\n*   <strong>Temel Node.js Bilgisi:<\/strong> Node.js mod\u00fcl sistemi, callback&#8217;ler, promise&#8217;ler ve genel JavaScript s\u00f6zdizimi hakk\u0131nda temel bilgi.<br \/>\n*   <strong>Temel Linux Komut Sat\u0131r\u0131 Bilgisi:<\/strong> Dosya sistemi navigasyonu, paket y\u00fckleme ve temel sistem komutlar\u0131 hakk\u0131nda bilgi.<\/p>\n<h3>Ubuntu 16.04 Ortam\u0131n\u0131n Haz\u0131rlanmas\u0131<\/h3>\n<p>\u0130lk olarak, Node.js ve npm&#8217;in sisteminizde kurulu oldu\u011fundan emin olal\u0131m. E\u011fer kurulu de\u011filse, Node..js&#8217;yi kurman\u0131n birka\u00e7 yolu vard\u0131r. <code>nvm<\/code> (Node Version Manager) kullanmak, farkl\u0131 Node.js s\u00fcr\u00fcmleri aras\u0131nda ge\u00e7i\u015f yapma esnekli\u011fi sundu\u011fu i\u00e7in \u00f6nerilir.<\/p>\n<p>1.  <strong>Sistemi G\u00fcncelleme:<\/strong><\/p>\n<pre><code class=\"language-bash\">sudo apt update\n    sudo apt upgrade<\/code><\/pre>\n<p>2.  <strong>Node.js ve npm Kurulumu (nvm ile \u00d6nerilen):<\/strong><br \/>\n    <code>nvm<\/code> kurulumu i\u00e7in a\u015fa\u011f\u0131daki komutu kullanabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">curl -o- https:\/\/raw.githubusercontent.com\/nvm-sh\/nvm\/v0.39.1\/install.sh | bash<\/code><\/pre>\n<p>    Kurulumdan sonra terminali kapat\u0131p a\u00e7\u0131n veya a\u015fa\u011f\u0131daki komutu \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code class=\"language-bash\">source ~\/.bashrc<\/code><\/pre>\n<p>    Ard\u0131ndan, Node.js&#8217;nin son LTS (Uzun S\u00fcreli Destek) s\u00fcr\u00fcm\u00fcn\u00fc kurun:<\/p>\n<pre><code class=\"language-bash\">nvm install --lts\n    nvm use --lts\n    nvm alias default 'lts\/*'<\/code><\/pre>\n<p>    Kurulumu do\u011frulay\u0131n:<\/p>\n<pre><code class=\"language-bash\">node -v\n    npm -v<\/code><\/pre>\n<p>    E\u011fer <code>apt<\/code> ile kurmay\u0131 tercih ediyorsan\u0131z (daha az esneklik sunar):<\/p>\n<pre><code class=\"language-bash\">sudo apt install curl\n    curl -sL https:\/\/deb.nodesource.com\/setup_16.x | sudo -E bash -\n    sudo apt install nodejs<\/code><\/pre>\n<p>3.  <strong>\u00d6rnek Node.js Projesi Olu\u015fturma:<\/strong><br \/>\n    G\u00fcnl\u00fckleme i\u015flemlerini test etmek i\u00e7in basit bir Node.js projesi olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-bash\">mkdir my-winston-app\n    cd my-winston-app\n    npm init -y\n    touch app.js<\/code><\/pre>\n<p>    Art\u0131k <code>my-winston-app<\/code> dizininde bir <code>package.json<\/code> dosyas\u0131 ve <code>app.js<\/code> dosyan\u0131z olmal\u0131.<\/p>\n<h3>Winston&#8217;\u0131 Y\u00fckleme<\/h3>\n<p>Projenize Winston&#8217;\u0131 eklemek olduk\u00e7a basittir. <code>npm<\/code> kullanarak y\u00fckleyebilirsiniz:<\/p>\n<pre><code class=\"language-bash\">npm install winston<\/code><\/pre>\n<p>Winston&#8217;\u0131n 3.x s\u00fcr\u00fcm\u00fc \u015fu anda kararl\u0131 ve yayg\u0131n olarak kullan\u0131lmaktad\u0131r. E\u011fer belirli bir s\u00fcr\u00fcm\u00fc hedeflemek isterseniz, <code>winston@3<\/code> veya <code>winston@next<\/code> kullanabilirsiniz, ancak <code>npm install winston<\/code> genellikle en g\u00fcncel kararl\u0131 s\u00fcr\u00fcm\u00fc y\u00fckleyecektir.<\/p>\n<h3>Temel Winston Kullan\u0131m\u0131: Konsola G\u00fcnl\u00fck Kaydetme<\/h3>\n<p>Winston&#8217;\u0131 kullanmaya ba\u015flamak i\u00e7in \u00f6ncelikle bir logger (g\u00fcnl\u00fckleyici) \u00f6rne\u011fi olu\u015fturman\u0131z gerekir. Bu \u00f6rnek, g\u00fcnl\u00fck seviyelerini ve ta\u015f\u0131y\u0131c\u0131lar\u0131 (transports) yap\u0131land\u0131raca\u011f\u0131n\u0131z yerdir.<\/p>\n<p><code>app.js<\/code> dosyan\u0131z\u0131 a\u00e7\u0131n ve a\u015fa\u011f\u0131daki kodu ekleyin:<\/p>\n<pre><code class=\"language-javascript\">\/\/ app.js\nconst winston = require('winston');\n\n\/\/ Logger \u00f6rne\u011fi olu\u015fturma\nconst logger = winston.createLogger({\n  level: 'info', \/\/ Varsay\u0131lan g\u00fcnl\u00fck seviyesi\n  format: winston.format.json(), \/\/ G\u00fcnl\u00fck format\u0131\n  transports: [\n    new winston.transports.Console(), \/\/ Konsola \u00e7\u0131kt\u0131 veren ta\u015f\u0131y\u0131c\u0131\n  ],\n});\n\n\/\/ Farkl\u0131 g\u00fcnl\u00fck seviyelerinde mesajlar g\u00f6nderme\nlogger.error('Bu bir hata mesaj\u0131d\u0131r.');\nlogger.warn('Bu bir uyar\u0131 mesaj\u0131d\u0131r.');\nlogger.info('Bu bir bilgi mesaj\u0131d\u0131r.');\nlogger.http('Bu bir HTTP iste\u011fi g\u00fcnl\u00fc\u011f\u00fcd\u00fcr.');\nlogger.verbose('Bu daha detayl\u0131 bir mesajd\u0131r.');\nlogger.debug('Bu bir hata ay\u0131klama mesaj\u0131d\u0131r.');\nlogger.silly('Bu en d\u00fc\u015f\u00fck seviyeli bir mesajd\u0131r.');\n\nconsole.log('Uygulama \u00e7al\u0131\u015f\u0131yor...');<\/code><\/pre>\n<p>Uygulamay\u0131 \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code class=\"language-bash\">node app.js<\/code><\/pre>\n<p>Konsol \u00e7\u0131kt\u0131s\u0131 \u015funa benzer olacakt\u0131r (JSON format\u0131nda):<\/p>\n<pre><code class=\"language-json\">{\"level\":\"error\",\"message\":\"Bu bir hata mesaj\u0131d\u0131r.\"}\n{\"level\":\"warn\",\"message\":\"Bu bir uyar\u0131 mesaj\u0131d\u0131r.\"}\n{\"level\":\"info\",\"message\":\"Bu bir bilgi mesaj\u0131d\u0131r.\"}\n{\"level\":\"http\",\"message\":\"Bu bir HTTP iste\u011fi g\u00fcnl\u00fc\u011f\u00fcd\u00fcr.\"}\n{\"level\":\"verbose\",\"message\":\"Bu daha detayl\u0131 bir mesajd\u0131r.\"}\n{\"level\":\"debug\",\"message\":\"Bu bir hata ay\u0131klama mesaj\u0131d\u0131r.\"}\n{\"level\":\"silly\",\"message\":\"Bu en d\u00fc\u015f\u00fck seviyeli bir mesajd\u0131r.\"}\nUygulama \u00e7al\u0131\u015f\u0131yor...<\/code><\/pre>\n<p><strong>A\u00e7\u0131klama:<\/strong><br \/>\n*   <code>winston.createLogger()<\/code>: Yeni bir logger \u00f6rne\u011fi olu\u015fturur.<br \/>\n*   <code>level: 'info'<\/code>: Bu logger i\u00e7in varsay\u0131lan g\u00fcnl\u00fck seviyesini <code>info<\/code> olarak ayarlar. Bu, yaln\u0131zca <code>info<\/code> seviyesi ve \u00fczerindeki (warn, error) mesajlar\u0131n i\u015flenece\u011fi anlam\u0131na gelir. Yukar\u0131daki \u00f6rnekte <code>debug<\/code> ve <code>silly<\/code> mesajlar\u0131n\u0131n da \u00e7\u0131kt\u0131\u011f\u0131n\u0131 g\u00f6rebilirsiniz, \u00e7\u00fcnk\u00fc Console ta\u015f\u0131y\u0131c\u0131s\u0131n\u0131n varsay\u0131lan seviyesi <code>silly<\/code>&#8216;dir. Ta\u015f\u0131y\u0131c\u0131n\u0131n seviyesi logger&#8217;\u0131n genel seviyesinden daha d\u00fc\u015f\u00fck veya e\u015fitse, o ta\u015f\u0131y\u0131c\u0131 t\u00fcm bu seviyelerdeki mesajlar\u0131 i\u015fler.<br \/>\n*   <code>format: winston.format.json()<\/code>: G\u00fcnl\u00fck mesajlar\u0131n\u0131n JSON format\u0131nda olmas\u0131n\u0131 sa\u011flar.<br \/>\n*   <code>transports: [new winston.transports.Console()]<\/code>: G\u00fcnl\u00fck mesajlar\u0131n\u0131 konsola yazan bir ta\u015f\u0131y\u0131c\u0131 ekler.<\/p>\n<h3>G\u00fcnl\u00fck Ta\u015f\u0131y\u0131c\u0131lar\u0131n\u0131 (Transports) Yap\u0131land\u0131rma<\/h3>\n<p>Winston&#8217;\u0131n g\u00fcc\u00fc, farkl\u0131 ta\u015f\u0131y\u0131c\u0131lar arac\u0131l\u0131\u011f\u0131yla g\u00fcnl\u00fckleri \u00e7e\u015fitli hedeflere y\u00f6nlendirebilmesidir. En yayg\u0131n kullan\u0131lan ta\u015f\u0131y\u0131c\u0131lar\u0131 inceleyelim.<\/p>\n<h4>Konsol Ta\u015f\u0131y\u0131c\u0131s\u0131 (Console Transport)<\/h4>\n<p>Konsol ta\u015f\u0131y\u0131c\u0131s\u0131, geli\u015ftirme s\u0131ras\u0131nda ve bazen \u00fcretimde temel izleme i\u00e7in kullan\u0131\u015fl\u0131d\u0131r. \u00c7\u0131kt\u0131y\u0131 daha okunabilir hale getirmek i\u00e7in \u00f6zelle\u015ftirebiliriz.<\/p>\n<pre><code class=\"language-javascript\">const winston = require('winston');\n\nconst logger = winston.createLogger({\n  level: 'debug', \/\/ T\u00fcm seviyelerdeki mesajlar\u0131 g\u00f6relim\n  transports: [\n    new winston.transports.Console({\n      format: winston.format.combine(\n        winston.format.colorize(), \/\/ \u00c7\u0131kt\u0131y\u0131 renklendir\n        winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }), \/\/ Zaman damgas\u0131 ekle\n        winston.format.printf(info => <code>${info.timestamp} ${info.level}: ${info.message}<\/code>) \/\/ \u00d6zel format\n      ),\n      level: 'silly' \/\/ Konsol ta\u015f\u0131y\u0131c\u0131s\u0131 i\u00e7in en d\u00fc\u015f\u00fck seviye\n    }),\n  ],\n});\n\nlogger.error('Bu bir hata mesaj\u0131d\u0131r.');\nlogger.warn('Bu bir uyar\u0131 mesaj\u0131d\u0131r.');\nlogger.info('Bu bir bilgi mesaj\u0131d\u0131r.');\nlogger.debug('Bu bir hata ay\u0131klama mesaj\u0131d\u0131r.');<\/code><\/pre>\n<p>\u00c7\u0131kt\u0131, renkli ve \u00f6zel formatta olacakt\u0131r:<\/p>\n<pre><code class=\"language-\">2023-10-27 10:30:00 error: Bu bir hata mesaj\u0131d\u0131r.\n2023-10-27 10:30:00 warn: Bu bir uyar\u0131 mesaj\u0131d\u0131r.\n2023-10-27 10:30:00 info: Bu bir bilgi mesaj\u0131d\u0131r.\n2023-10-27 10:30:00 debug: Bu bir hata ay\u0131klama mesaj\u0131d\u0131r.<\/code><\/pre>\n<p><strong>A\u00e7\u0131klama:<\/strong><br \/>\n*   <code>winston.format.combine()<\/code>: Birden fazla formatlama i\u015flevini bir araya getirmenizi sa\u011flar.<br \/>\n*   <code>winston.format.colorize()<\/code>: G\u00fcnl\u00fck seviyelerini renklendirir.<br \/>\n*   <code>winston.format.timestamp()<\/code>: G\u00fcnl\u00fc\u011fe bir zaman damgas\u0131 ekler.<br \/>\n*   <code>winston.format.printf()<\/code>: G\u00fcnl\u00fck mesaj\u0131n\u0131n nas\u0131l g\u00f6r\u00fcnece\u011fini tamamen \u00f6zelle\u015ftirmek i\u00e7in bir fonksiyon tan\u0131mlaman\u0131za olanak tan\u0131r. <code>info<\/code> nesnesi <code>level<\/code>, <code>message<\/code>, <code>timestamp<\/code> gibi \u00f6zellikler i\u00e7erir.<\/p>\n<h4>Dosya Ta\u015f\u0131y\u0131c\u0131s\u0131 (File Transport)<\/h4>\n<p>\u00dcretim ortam\u0131nda g\u00fcnl\u00fckleri dosyalara yazmak kritik \u00f6neme sahiptir. Winston, bu ama\u00e7la <code>File<\/code> ta\u015f\u0131y\u0131c\u0131s\u0131n\u0131 sunar. Genellikle hata g\u00fcnl\u00fckleri i\u00e7in ayr\u0131 bir dosya ve genel uygulama g\u00fcnl\u00fckleri i\u00e7in ba\u015fka bir dosya tutulur.<\/p>\n<pre><code class=\"language-javascript\">const winston = require('winston');\nconst path = require('path');\n\n\/\/ G\u00fcnl\u00fck dosyalar\u0131n\u0131n kaydedilece\u011fi dizin\nconst logDir = 'logs';\n\n\/\/ Dizinin mevcut oldu\u011fundan emin olun, yoksa olu\u015fturun\n\/\/ (Bu i\u015flemi uygulaman\u0131z\u0131n ba\u015flang\u0131c\u0131nda veya bir kurulum beti\u011finde yapman\u0131z \u00f6nerilir)\nconst fs = require('fs');\nif (!fs.existsSync(logDir)) {\n  fs.mkdirSync(logDir);\n}\n\nconst logger = winston.createLogger({\n  level: 'info',\n  format: winston.format.combine(\n    winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),\n    winston.format.errors({ stack: true }), \/\/ Hata nesneleri i\u00e7in stack trace ekle\n    winston.format.splat(), \/\/ String interpolation i\u00e7in\n    winston.format.json() \/\/ JSON format\u0131nda \u00e7\u0131kt\u0131\n  ),\n  transports: [\n    \/\/ Konsol ta\u015f\u0131y\u0131c\u0131s\u0131 (iste\u011fe ba\u011fl\u0131)\n    new winston.transports.Console({\n      format: winston.format.combine(\n        winston.format.colorize(),\n        winston.format.printf(info => <code>${info.timestamp} ${info.level}: ${info.message}<\/code>)\n      ),\n      level: 'debug' \/\/ Konsol i\u00e7in debug seviyesini g\u00f6ster\n    }),\n    \/\/ T\u00fcm bilgi seviyesi ve \u00fczerindeki g\u00fcnl\u00fckleri 'combined.log' dosyas\u0131na kaydet\n    new winston.transports.File({\n      filename: path.join(logDir, 'combined.log'),\n      level: 'info',\n    }),\n    \/\/ Sadece hata seviyesindeki g\u00fcnl\u00fckleri 'error.log' dosyas\u0131na kaydet\n    new winston.transports.File({\n      filename: path.join(logDir, 'error.log'),\n      level: 'error',\n    }),\n  ],\n  exceptionHandlers: [ \/\/ Yakalanmam\u0131\u015f istisnalar\u0131 kaydet\n    new winston.transports.File({ filename: path.join(logDir, 'exceptions.log') })\n  ],\n  rejectionHandlers: [ \/\/ \u0130\u015flenmemi\u015f promise reddedilmelerini kaydet\n    new winston.transports.File({ filename: path.join(logDir, 'rejections.log') })\n  ]\n});\n\nlogger.info('Uygulama ba\u015flat\u0131ld\u0131.');\nlogger.warn('Disk alan\u0131 azal\u0131yor olabilir.');\nlogger.error('Veritaban\u0131 ba\u011flant\u0131s\u0131 ba\u015far\u0131s\u0131z oldu!', new Error('Connection refused.'));\nlogger.debug('Bu mesaj sadece konsolda g\u00f6r\u00fcn\u00fcr, dosyalarda de\u011fil (\u00e7\u00fcnk\u00fc dosya seviyesi info).');\n\n\/\/ Yakalanmam\u0131\u015f bir istisna tetikleme\n\/\/ setTimeout(() => {\n\/\/   throw new Error('Bu yakalanmam\u0131\u015f bir istisnad\u0131r!');\n\/\/ }, 100);\n\n\/\/ \u0130\u015flenmemi\u015f bir promise reddedilmesi tetikleme\n\/\/ Promise.reject(new Error('Bu i\u015flenmemi\u015f bir reddedilmedir!'));<\/code><\/pre>\n<p>Bu kodu \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda, <code>my-winston-app<\/code> dizini alt\u0131nda <code>logs<\/code> ad\u0131nda bir dizin olu\u015facak ve i\u00e7inde <code>combined.log<\/code>, <code>error.log<\/code> ve <code>exceptions.log<\/code> (e\u011fer bir istisna olu\u015fursa) dosyalar\u0131n\u0131 g\u00f6receksiniz.<\/p>\n<p><strong>\u00d6nemli Not: Dosya \u0130zinleri<\/strong><br \/>\nUbuntu sunucular\u0131nda, Node.js uygulaman\u0131z\u0131n g\u00fcnl\u00fck dosyalar\u0131n\u0131 yazabilmesi i\u00e7in ilgili dizinlere (\u00f6rne\u011fin <code>logs<\/code>) yazma iznine sahip olmas\u0131 gerekir. Genellikle Node.js uygulaman\u0131z <code>www-data<\/code> gibi bir kullan\u0131c\u0131 alt\u0131nda \u00e7al\u0131\u015f\u0131r. Bu durumda, <code>logs<\/code> dizininin bu kullan\u0131c\u0131 taraf\u0131ndan yaz\u0131labilir oldu\u011fundan emin olmal\u0131s\u0131n\u0131z:<\/p>\n<pre><code class=\"language-bash\">sudo chown -R www-data:www-data my-winston-app\/logs\nsudo chmod -R 755 my-winston-app\/logs<\/code><\/pre>\n<p>Veya daha basit bir test i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">sudo chmod -R 777 my-winston-app\/logs # Sadece test ama\u00e7l\u0131, \u00fcretimde dikkatli olun!<\/code><\/pre>\n<h4>G\u00fcnl\u00fck Rotasyonu (Log Rotation)<\/h4>\n<p>Uygulama \u00e7al\u0131\u015ft\u0131k\u00e7a g\u00fcnl\u00fck dosyalar\u0131 h\u0131zla b\u00fcy\u00fcyebilir ve disk alan\u0131n\u0131 t\u00fcketebilir. Bu durumu \u00f6nlemek i\u00e7in g\u00fcnl\u00fck rotasyonu (log rotation) kullanmak \u00f6nemlidir. Winston&#8217;\u0131n kendisi do\u011frudan g\u00fcnl\u00fck rotasyonu sa\u011flamaz, ancak <code>winston-daily-rotate-file<\/code> gibi bir eklenti veya sistem d\u00fczeyinde <code>logrotate<\/code> arac\u0131 kullan\u0131labilir.<\/p>\n<p><strong><code>winston-daily-rotate-file<\/code> ile Rotasyon:<\/strong><br \/>\nBu eklenti, g\u00fcnl\u00fck dosyalar\u0131n\u0131 tarihe g\u00f6re otomatik olarak d\u00f6nd\u00fcrmenizi sa\u011flar.<\/p>\n<p>1.  <strong>Y\u00fckleme:<\/strong><\/p>\n<pre><code class=\"language-bash\">npm install winston-daily-rotate-file<\/code><\/pre>\n<p>2.  <strong>Kullan\u0131m:<\/strong><br \/>\n    <code>app.js<\/code> dosyan\u0131zda <code>winston.transports.File<\/code> yerine <code>winston.transports.DailyRotateFile<\/code> kullan\u0131n:<\/p>\n<pre><code class=\"language-javascript\">const winston = require('winston');\n    const DailyRotateFile = require('winston-daily-rotate-file');\n    const path = require('path');\n    const fs = require('fs');\n\n    const logDir = 'logs';\n    if (!fs.existsSync(logDir)) {\n      fs.mkdirSync(logDir);\n    }\n\n    \/\/ Ortak g\u00fcnl\u00fck dosyas\u0131 i\u00e7in ta\u015f\u0131y\u0131c\u0131\n    const transportCombined = new DailyRotateFile({\n      filename: path.join(logDir, 'application-%DATE%.log'),\n      datePattern: 'YYYY-MM-DD-HH', \/\/ Her saat ba\u015f\u0131 yeni dosya\n      zippedArchive: true, \/\/ Eski g\u00fcnl\u00fckleri s\u0131k\u0131\u015ft\u0131r\n      maxSize: '20m', \/\/ Bir dosya maksimum 20MB olabilir\n      maxFiles: '14d', \/\/ Son 14 g\u00fcnl\u00fck dosyalar\u0131 sakla\n      level: 'info',\n    });\n\n    \/\/ Hata g\u00fcnl\u00fck dosyas\u0131 i\u00e7in ta\u015f\u0131y\u0131c\u0131\n    const transportError = new DailyRotateFile({\n      filename: path.join(logDir, 'error-%DATE%.log'),\n      datePattern: 'YYYY-MM-DD', \/\/ Her g\u00fcn yeni dosya\n      zippedArchive: true,\n      maxSize: '10m',\n      maxFiles: '7d',\n      level: 'error',\n    });\n\n    const logger = winston.createLogger({\n      level: 'info',\n      format: winston.format.combine(\n        winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),\n        winston.format.errors({ stack: true }),\n        winston.format.splat(),\n        winston.format.json()\n      ),\n      transports: [\n        new winston.transports.Console({\n          format: winston.format.combine(\n            winston.format.colorize(),\n            winston.format.printf(info => <code>${info.timestamp} ${info.level}: ${info.message}<\/code>)\n          ),\n          level: 'debug'\n        }),\n        transportCombined,\n        transportError,\n      ],\n      exceptionHandlers: [\n        new DailyRotateFile({\n          filename: path.join(logDir, 'exceptions-%DATE%.log'),\n          datePattern: 'YYYY-MM-DD',\n          zippedArchive: true,\n          maxSize: '5m',\n          maxFiles: '30d',\n        })\n      ],\n      rejectionHandlers: [\n        new DailyRotateFile({\n          filename: path.join(logDir, 'rejections-%DATE%.log'),\n          datePattern: 'YYYY-MM-DD',\n          zippedArchive: true,\n          maxSize: '5m',\n          maxFiles: '30d',\n        })\n      ]\n    });\n\n    logger.info('Uygulama ba\u015flat\u0131ld\u0131.');\n    logger.error('Kritik bir hata olu\u015ftu!');<\/code><\/pre>\n<p>    Bu yap\u0131land\u0131rma, g\u00fcnl\u00fck dosyalar\u0131n\u0131z\u0131 otomatik olarak tarihe g\u00f6re d\u00f6nd\u00fcrecek, belirli bir boyuta ula\u015ft\u0131\u011f\u0131nda yeni bir dosya olu\u015fturacak ve eski dosyalar\u0131 s\u0131k\u0131\u015ft\u0131rarak saklayacakt\u0131r.<\/p>\n<h4>HTTP Ta\u015f\u0131y\u0131c\u0131s\u0131 (HTTP Transport)<\/h4>\n<p>G\u00fcnl\u00fckleri merkezi bir g\u00fcnl\u00fck toplama hizmetine (\u00f6rne\u011fin ELK Stack, Splunk, Graylog) g\u00f6ndermek i\u00e7in HTTP ta\u015f\u0131y\u0131c\u0131s\u0131n\u0131 kullanabilirsiniz.<\/p>\n<pre><code class=\"language-javascript\">const winston = require('winston');\n\nconst logger = winston.createLogger({\n  level: 'info',\n  format: winston.format.json(),\n  transports: [\n    new winston.transports.Console(),\n    new winston.transports.Http({\n      host: 'localhost', \/\/ Merkezi g\u00fcnl\u00fck sunucusunun adresi\n      port: 3000,        \/\/ Merkezi g\u00fcnl\u00fck sunucusunun portu\n      path: '\/logs',     \/\/ G\u00fcnl\u00fcklerin g\u00f6nderilece\u011fi yol\n      \/\/ auth: { username: 'user', password: 'password' } \/\/ Kimlik do\u011frulama gerekiyorsa\n    }),\n  ],\n});\n\nlogger.info('Uygulama ba\u015flat\u0131ld\u0131, HTTP ile g\u00fcnl\u00fck g\u00f6nderiliyor.');<\/code><\/pre>\n<p>Bu, g\u00fcnl\u00fckleri belirtilen HTTP endpoint&#8217;ine POST iste\u011fi olarak g\u00f6nderecektir. Merkezi g\u00fcnl\u00fck toplama sisteminiz bu istekleri al\u0131p i\u015fleyecektir.<\/p>\n<h3>G\u00fcnl\u00fck Seviyeleri ve Filtreleme<\/h3>\n<p>Winston, varsay\u0131lan olarak a\u015fa\u011f\u0131daki g\u00fcnl\u00fck seviyelerini destekler (artan \u00f6nem s\u0131ras\u0131na g\u00f6re):<br \/>\n*   <code>silly<\/code><br \/>\n*   <code>debug<\/code><br \/>\n*   <code>verbose<\/code><br \/>\n*   <code>http<\/code><br \/>\n*   <code>info<\/code><br \/>\n*   <code>warn<\/code><br \/>\n*   <code>error<\/code><\/p>\n<p><code>createLogger<\/code> i\u00e7indeki <code>level<\/code> se\u00e7ene\u011fi, logger&#8217;\u0131n genel olarak hangi seviyeden itibaren g\u00fcnl\u00fckleri i\u015fleyece\u011fini belirler. Bir ta\u015f\u0131y\u0131c\u0131 i\u00e7in belirtilen <code>level<\/code> ise, o ta\u015f\u0131y\u0131c\u0131n\u0131n hangi seviyeden itibaren g\u00fcnl\u00fckleri i\u015fleyece\u011fini belirler. Bir ta\u015f\u0131y\u0131c\u0131n\u0131n seviyesi, logger&#8217;\u0131n genel seviyesinden daha d\u00fc\u015f\u00fck veya e\u015fitse, o ta\u015f\u0131y\u0131c\u0131 bu seviyedeki ve daha y\u00fcksek seviyelerdeki t\u00fcm mesajlar\u0131 alacakt\u0131r.<\/p>\n<pre><code class=\"language-javascript\">const winston = require('winston');\n\nconst logger = winston.createLogger({\n  level: 'info', \/\/ Logger'\u0131n genel seviyesi info\n  format: winston.format.simple(),\n  transports: [\n    new winston.transports.Console({\n      level: 'debug' \/\/ Konsol ta\u015f\u0131y\u0131c\u0131s\u0131 debug seviyesinden itibaren g\u00f6sterir\n    }),\n    new winston.transports.File({\n      filename: 'combined.log',\n      level: 'warn' \/\/ Dosya ta\u015f\u0131y\u0131c\u0131s\u0131 warn seviyesinden itibaren g\u00f6sterir\n    })\n  ]\n});\n\nlogger.debug('Bu bir debug mesaj\u0131d\u0131r.'); \/\/ Sadece konsolda g\u00f6r\u00fcn\u00fcr\nlogger.info('Bu bir info mesaj\u0131d\u0131r.');   \/\/ Konsolda ve dosyada g\u00f6r\u00fcn\u00fcr\nlogger.warn('Bu bir uyar\u0131 mesaj\u0131d\u0131r.'); \/\/ Konsolda ve dosyada g\u00f6r\u00fcn\u00fcr\nlogger.error('Bu bir hata mesaj\u0131d\u0131r.'); \/\/ Konsolda ve dosyada g\u00f6r\u00fcn\u00fcr<\/code><\/pre>\n<p>Yukar\u0131daki \u00f6rnekte:<br \/>\n*   <code>debug<\/code> mesaj\u0131 sadece konsolda g\u00f6r\u00fcn\u00fcr \u00e7\u00fcnk\u00fc konsolun seviyesi <code>debug<\/code> iken, dosya ta\u015f\u0131y\u0131c\u0131s\u0131n\u0131n seviyesi <code>warn<\/code>&#8216;d\u0131r.<br \/>\n*   <code>info<\/code>, <code>warn<\/code>, <code>error<\/code> mesajlar\u0131 hem konsolda hem de dosyada g\u00f6r\u00fcn\u00fcr, \u00e7\u00fcnk\u00fc her iki ta\u015f\u0131y\u0131c\u0131n\u0131n da seviyeleri bu mesajlar\u0131 kapsar.<\/p>\n<h3>G\u00fcnl\u00fck Formatlama<\/h3>\n<p>Winston&#8217;\u0131n <code>winston.format<\/code> mod\u00fcl\u00fc, g\u00fcnl\u00fck mesajlar\u0131n\u0131 bi\u00e7imlendirmek i\u00e7in g\u00fc\u00e7l\u00fc ara\u00e7lar sunar. Daha \u00f6nce <code>json()<\/code>, <code>timestamp()<\/code>, <code>colorize()<\/code>, <code>printf()<\/code> gibi formatlar\u0131 g\u00f6rd\u00fck. Di\u011fer baz\u0131 kullan\u0131\u015fl\u0131 formatlar:<\/p>\n<p>*   <strong><code>simple()<\/code>:<\/strong> Basit bir metin \u00e7\u0131kt\u0131s\u0131 sa\u011flar (varsay\u0131lan).<br \/>\n*   <strong><code>json()<\/code>:<\/strong> JSON format\u0131nda \u00e7\u0131kt\u0131 verir.<br \/>\n*   <strong><code>prettyPrint()<\/code>:<\/strong> JSON \u00e7\u0131kt\u0131s\u0131n\u0131 okunabilir hale getirir.<br \/>\n*   <strong><code>label({ label: 'my-app' })<\/code>:<\/strong> Her g\u00fcnl\u00fc\u011fe \u00f6zel bir etiket ekler.<br \/>\n*   <strong><code>metadata()<\/code>:<\/strong> G\u00fcnl\u00fck mesaj\u0131na eklenen meta verileri (\u00f6rne\u011fin, Express&#8217;ten <code>req<\/code> objesi) otomatik olarak g\u00fcnl\u00fc\u011fe dahil eder.<br \/>\n*   <strong><code>errors({ stack: true })<\/code>:<\/strong> Hata nesnelerinin stack trace&#8217;ini g\u00fcnl\u00fc\u011fe ekler.<\/p>\n<pre><code class=\"language-javascript\">const winston = require('winston');\n\nconst logger = winston.createLogger({\n  level: 'info',\n  format: winston.format.combine(\n    winston.format.label({ label: 'my-web-app' }),\n    winston.format.timestamp(),\n    winston.format.metadata({ fillExcept: ['message', 'level', 'timestamp', 'label'] }), \/\/ Mesaj d\u0131\u015f\u0131ndaki t\u00fcm meta verileri ekle\n    winston.format.printf(info => {\n      const { timestamp, label, level, message, metadata } = info;\n      \/\/ Meta verileri string'e d\u00f6n\u00fc\u015ft\u00fcrerek ekliyoruz\n      const meta = Object.keys(metadata).length ? JSON.stringify(metadata) : '';\n      return <code>${timestamp} [${label}] ${level}: ${message} ${meta}<\/code>;\n    })\n  ),\n  transports: [\n    new winston.transports.Console()\n  ]\n});\n\nlogger.info('Kullan\u0131c\u0131 giri\u015f yapt\u0131.', { userId: 123, ipAddress: '192.168.1.1' });\nlogger.error('Veritaban\u0131 hatas\u0131.', new Error('DB connection failed!'), { transactionId: 'abc' });<\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>metadata<\/code> formatlay\u0131c\u0131s\u0131 ve <code>printf<\/code> ile daha geli\u015fmi\u015f bir \u00e7\u0131kt\u0131 format\u0131 olu\u015fturulmu\u015ftur.<\/p>\n<h3>Winston ile Hata Y\u00f6netimi<\/h3>\n<p>Node.js uygulamalar\u0131nda yakalanmam\u0131\u015f istisnalar (uncaught exceptions) ve i\u015flenmemi\u015f promise reddedilmeleri (unhandled rejections) uygulaman\u0131n \u00e7\u00f6kmesine neden olabilir. Winston, bu durumlar\u0131 \u00f6zel ta\u015f\u0131y\u0131c\u0131lar kullanarak g\u00fcnl\u00fc\u011fe kaydetme yetene\u011fi sunar.<\/p>\n<p>Yukar\u0131daki dosya ta\u015f\u0131y\u0131c\u0131s\u0131 \u00f6rne\u011finde <code>exceptionHandlers<\/code> ve <code>rejectionHandlers<\/code> kullan\u0131mlar\u0131n\u0131 zaten g\u00f6stermi\u015ftik. Bu ta\u015f\u0131y\u0131c\u0131lar, uygulaman\u0131zda beklenmedik bir hata meydana geldi\u011finde otomatik olarak devreye girer ve hatay\u0131 belirtilen dosyalara kaydeder.<\/p>\n<pre><code class=\"language-javascript\">const winston = require('winston');\nconst path = require('path');\nconst fs = require('fs');\n\nconst logDir = 'logs';\nif (!fs.existsSync(logDir)) {\n  fs.mkdirSync(logDir);\n}\n\nconst logger = winston.createLogger({\n  level: 'info',\n  format: winston.format.combine(\n    winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),\n    winston.format.errors({ stack: true }),\n    winston.format.json()\n  ),\n  transports: [\n    new winston.transports.Console(),\n    new winston.transports.File({ filename: path.join(logDir, 'combined.log') }),\n  ],\n  exceptionHandlers: [\n    new winston.transports.File({ filename: path.join(logDir, 'exceptions.log') })\n  ],\n  rejectionHandlers: [\n    new winston.transports.File({ filename: path.join(logDir, 'rejections.log') })\n  ]\n});\n\nlogger.info('Uygulama ba\u015flat\u0131ld\u0131.');\n\n\/\/ Yakalanmam\u0131\u015f bir istisna tetikleyelim\n\/\/ setTimeout(() => {\n\/\/   throw new Error('Bu yakalanmam\u0131\u015f bir istisnad\u0131r!');\n\/\/ }, 100);\n\n\/\/ \u0130\u015flenmemi\u015f bir promise reddedilmesi tetikleyelim\n\/\/ Promise.reject(new Error('Bu i\u015flenmemi\u015f bir reddedilmedir!'));<\/code><\/pre>\n<p>Bu sat\u0131rlar\u0131 yorumdan \u00e7\u0131kar\u0131p uygulamay\u0131 \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda, hata mesajlar\u0131n\u0131n <code>exceptions.log<\/code> veya <code>rejections.log<\/code> dosyalar\u0131na yaz\u0131ld\u0131\u011f\u0131n\u0131 g\u00f6receksiniz. Uygulaman\u0131z bu hatalardan sonra varsay\u0131lan olarak kapanacakt\u0131r, ancak hatan\u0131n kayd\u0131n\u0131 tutmu\u015f olacaks\u0131n\u0131z.<\/p>\n<h3>Winston&#8217;\u0131 Node.js Uygulaman\u0131za Entegre Etme (Express \u00d6rne\u011fi)<\/h3>\n<p>Ger\u00e7ek d\u00fcnya Node.js uygulamalar\u0131nda, logger&#8217;\u0131 merkezi bir mod\u00fcl olarak tan\u0131mlamak ve uygulaman\u0131z\u0131n farkl\u0131 yerlerinde bu logger&#8217;\u0131 kullanmak iyi bir pratiktir. Express.js tabanl\u0131 bir uygulama i\u00e7in bir \u00f6rnek olu\u015ftural\u0131m.<\/p>\n<p>1.  <strong>Gerekli Paketleri Y\u00fckleyin:<\/strong><\/p>\n<pre><code class=\"language-bash\">npm install express<\/code><\/pre>\n<p>2.  <strong><code>logger.js<\/code> Olu\u015fturma:<\/strong><br \/>\n    <code>my-winston-app<\/code> dizini i\u00e7inde <code>logger.js<\/code> ad\u0131nda yeni bir dosya olu\u015fturun:<\/p>\n<pre><code class=\"language-javascript\">\/\/ logger.js\n    const winston = require('winston');\n    const DailyRotateFile = require('winston-daily-rotate-file');\n    const path = require('path');\n    const fs = require('fs');\n\n    const logDir = path.join(__dirname, 'logs'); \/\/ Uygulama k\u00f6k dizinindeki logs klas\u00f6r\u00fc\n    if (!fs.existsSync(logDir)) {\n      fs.mkdirSync(logDir);\n    }\n\n    const format = winston.format.combine(\n      winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),\n      winston.format.errors({ stack: true }),\n      winston.format.splat(),\n      winston.format.json()\n    );\n\n    const logger = winston.createLogger({\n      level: process.env.NODE_ENV === 'production' ? 'info' : 'debug', \/\/ Ortama g\u00f6re seviye ayar\u0131\n      format: format,\n      transports: [\n        new winston.transports.Console({\n          format: winston.format.combine(\n            winston.format.colorize(),\n            winston.format.printf(info => <code>${info.timestamp} ${info.level}: ${info.message}<\/code>)\n          ),\n          level: 'debug' \/\/ Konsol i\u00e7in her zaman debug seviyesini g\u00f6ster\n        }),\n        new DailyRotateFile({\n          filename: path.join(logDir, 'application-%DATE%.log'),\n          datePattern: 'YYYY-MM-DD',\n          zippedArchive: true,\n          maxSize: '20m',\n          maxFiles: '14d',\n          level: 'info',\n        }),\n        new DailyRotateFile({\n          filename: path.join(logDir, 'error-%DATE%.log'),\n          datePattern: 'YYYY-MM-DD',\n          zippedArchive: true,\n          maxSize: '10m',\n          maxFiles: '7d',\n          level: 'error',\n        }),\n      ],\n      exceptionHandlers: [\n        new DailyRotateFile({\n          filename: path.join(logDir, 'exceptions-%DATE%.log'),\n          datePattern: 'YYYY-MM-DD',\n          zippedArchive: true,\n          maxSize: '5m',\n          maxFiles: '30d',\n        })\n      ],\n      rejectionHandlers: [\n        new DailyRotateFile({\n          filename: path.join(logDir, 'rejections-%DATE%.log'),\n          datePattern: 'YYYY-MM-DD',\n          zippedArchive: true,\n          maxSize: '5m',\n          maxFiles: '30d',\n        })\n      ]\n    });\n\n    module.exports = logger;<\/code><\/pre>\n<p>3.  <strong><code>app.js<\/code> G\u00fcncelleme (Express ile Kullan\u0131m):<\/strong><br \/>\n    <code>app.js<\/code> dosyan\u0131z\u0131 Express uygulamas\u0131 ve Winston logger&#8217;\u0131 ile g\u00fcncelleyin:<\/p>\n<pre><code class=\"language-javascript\">\/\/ app.js\n    const express = require('express');\n    const logger = require('.\/logger'); \/\/ Logger mod\u00fcl\u00fcm\u00fcz\u00fc import et\n    const app = express();\n    const port = 3000;\n\n    \/\/ Her iste\u011fi loglayan bir middleware\n    app.use((req, res, next) => {\n      logger.http(<code>${req.method} ${req.url} - ${req.ip}<\/code>);\n      next();\n    });\n\n    app.get('\/', (req, res) => {\n      logger.info('Ana sayfaya istek geldi.');\n      res.send('Merhaba Winston!');\n    });\n\n    app.get('\/user\/:id', (req, res) => {\n      const userId = req.params.id;\n      logger.debug(<code>Kullan\u0131c\u0131 bilgisi isteniyor: ${userId}<\/code>);\n      if (userId === '1') {\n        res.send(<code>Kullan\u0131c\u0131 ID: ${userId}<\/code>);\n      } else {\n        logger.warn(<code>Kullan\u0131c\u0131 bulunamad\u0131: ${userId}<\/code>);\n        res.status(404).send('Kullan\u0131c\u0131 bulunamad\u0131.');\n      }\n    });\n\n    app.get('\/error-test', (req, res, next) => {\n      try {\n        throw new Error('Bu bir test hatas\u0131d\u0131r!');\n      } catch (err) {\n        logger.error('Bir hata olu\u015ftu:', err);\n        next(err); \/\/ Hata i\u015fleyici middleware'e g\u00f6nder\n      }\n    });\n\n    \/\/ Hata i\u015fleyici middleware\n    app.use((err, req, res, next) => {\n      logger.error(<code>Uygulama hatas\u0131: ${err.message}<\/code>, { stack: err.stack, url: req.originalUrl });\n      res.status(500).send('Sunucu hatas\u0131!');\n    });\n\n    app.listen(port, () => {\n      logger.info(<code>Uygulama http:\/\/localhost:${port} adresinde \u00e7al\u0131\u015f\u0131yor.<\/code>);\n    });\n\n    \/\/ Yakalanmam\u0131\u015f istisna ve reddedilme durumlar\u0131n\u0131 test etmek i\u00e7in\n    \/\/ setTimeout(() => {\n    \/\/   throw new Error('Uygulama d\u0131\u015f\u0131nda yakalanmam\u0131\u015f hata!');\n    \/\/ }, 5000);\n\n    \/\/ Promise.reject(new Error('Uygulama d\u0131\u015f\u0131nda i\u015flenmemi\u015f reddedilme!'));<\/code><\/pre>\n<p>    Bu yap\u0131land\u0131rma ile Express uygulaman\u0131zdaki t\u00fcm g\u00fcnl\u00fckleme i\u015flemlerini merkezi <code>logger.js<\/code> mod\u00fcl\u00fc \u00fczerinden yapabilir ve farkl\u0131 seviyelerdeki mesajlar\u0131 uygun ta\u015f\u0131y\u0131c\u0131lara y\u00f6nlendirebilirsiniz.<\/p>\n<h3>Geli\u015fmi\u015f Konular<\/h3>\n<h4>Ubuntu&#8217;da <code>logrotate<\/code> ile G\u00fcnl\u00fck Rotasyonu<\/h4>\n<p><code>winston-daily-rotate-file<\/code> eklentisi Node.js taraf\u0131nda g\u00fcnl\u00fck rotasyonu sa\u011flasa da, Linux sistemlerinin yerle\u015fik <code>logrotate<\/code> arac\u0131 daha g\u00fc\u00e7l\u00fc ve merkezi bir g\u00fcnl\u00fck y\u00f6netimi \u00e7\u00f6z\u00fcm\u00fc sunar. \u00d6zellikle \u00e7ok say\u0131da uygulaman\u0131z varsa veya farkl\u0131 sistem g\u00fcnl\u00fcklerini de y\u00f6netiyorsan\u0131z <code>logrotate<\/code> idealdir.<\/p>\n<p><code>logrotate<\/code> i\u00e7in bir yap\u0131land\u0131rma dosyas\u0131 olu\u015fturman\u0131z gerekir:<\/p>\n<p>1.  <strong>Yap\u0131land\u0131rma Dosyas\u0131 Olu\u015fturma:<\/strong><\/p>\n<pre><code class=\"language-bash\">sudo nano \/etc\/logrotate.d\/my-winston-app<\/code><\/pre>\n<p>2.  <strong>Yap\u0131land\u0131rma \u0130\u00e7eri\u011fi:<\/strong><br \/>\n    A\u015fa\u011f\u0131daki i\u00e7eri\u011fi dosyaya yap\u0131\u015ft\u0131r\u0131n. Bu \u00f6rnek, <code>my-winston-app\/logs<\/code> dizinindeki t\u00fcm <code>.log<\/code> dosyalar\u0131n\u0131 her g\u00fcn d\u00f6nd\u00fcrecektir.<\/p>\n<pre><code class=\"language-nginx\">\/path\/to\/my-winston-app\/logs\/*.log {\n        daily                 # Her g\u00fcn d\u00f6nd\u00fcr\n        missingok             # G\u00fcnl\u00fck dosyas\u0131 yoksa hata verme\n        rotate 7              # Son 7 g\u00fcnl\u00fck dosyay\u0131 sakla\n        compress              # Eski g\u00fcnl\u00fckleri s\u0131k\u0131\u015ft\u0131r\n        delaycompress         # S\u0131k\u0131\u015ft\u0131rmay\u0131 bir sonraki rotasyona ertele\n        notifempty            # Bo\u015fsa d\u00f6nd\u00fcrme\n        create 0640 www-data www-data # Yeni g\u00fcnl\u00fck dosyalar\u0131n\u0131 belirli izinlerle ve sahiple olu\u015ftur\n        # postrotate          # Rotasyondan sonra \u00e7al\u0131\u015facak komutlar (iste\u011fe ba\u011fl\u0131)\n        #    \/usr\/bin\/pkill -HUP node # Uygulamaya SIGHUP sinyali g\u00f6ndererek g\u00fcnl\u00fck dosyas\u0131n\u0131 yeniden a\u00e7mas\u0131n\u0131 s\u00f6yle\n        # endscript\n    }<\/code><\/pre>\n<p>    <strong>\u00d6nemli:<\/strong> <code>\/path\/to\/my-winston-app\/logs\/*.log<\/code> k\u0131sm\u0131n\u0131 uygulaman\u0131z\u0131n ger\u00e7ek g\u00fcnl\u00fck dizini yolu ile de\u011fi\u015ftirin.<br \/>\n    <code>create<\/code> sat\u0131r\u0131ndaki <code>www-data www-data<\/code> k\u0131sm\u0131, uygulaman\u0131z\u0131n hangi kullan\u0131c\u0131 ve grup alt\u0131nda \u00e7al\u0131\u015ft\u0131\u011f\u0131na ba\u011fl\u0131 olarak de\u011fi\u015febilir.<\/p>\n<p>3.  <strong>Test Etme:<\/strong><br \/>\n    Yap\u0131land\u0131rman\u0131z\u0131 test etmek i\u00e7in kuru \u00e7al\u0131\u015ft\u0131rma yapabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">sudo logrotate -d \/etc\/logrotate.d\/my-winston-app<\/code><\/pre>\n<p>    Ger\u00e7ek bir rotasyon tetiklemek i\u00e7in (manuel olarak):<\/p>\n<pre><code class=\"language-bash\">sudo logrotate -f \/etc\/logrotate.d\/my-winston-app<\/code><\/pre>\n<p>    <code>logrotate<\/code> genellikle <code>cron<\/code> arac\u0131l\u0131\u011f\u0131yla g\u00fcnde bir kez \u00e7al\u0131\u015facak \u015fekilde ayarlanm\u0131\u015ft\u0131r.<\/p>\n<h4>Merkezi G\u00fcnl\u00fckleme Sistemleri<\/h4>\n<p>B\u00fcy\u00fck \u00f6l\u00e7ekli uygulamalar ve mikroservis mimarilerinde, g\u00fcnl\u00fckleri merkezi bir yerde toplamak ve analiz etmek esast\u0131r. Winston, HTTP ta\u015f\u0131y\u0131c\u0131s\u0131 veya \u00f6zel ta\u015f\u0131y\u0131c\u0131lar arac\u0131l\u0131\u011f\u0131yla Elasticsearch, Logstash, Kibana (ELK Stack), Graylog, Splunk gibi sistemlere kolayca entegre edilebilir. Bu sistemler, g\u00fcnl\u00fckleri araman\u0131za, filtrelemenize, g\u00f6rselle\u015ftirmenize ve uyar\u0131lar olu\u015fturman\u0131za olanak tan\u0131r.<\/p>\n<h4>Performans De\u011ferlendirmeleri<\/h4>\n<p>G\u00fcnl\u00fckleme, I\/O yo\u011fun bir i\u015flem olabilir ve uygulaman\u0131z\u0131n performans\u0131n\u0131 etkileyebilir.<br \/>\n*   <strong>Asenkron G\u00fcnl\u00fckleme:<\/strong> Winston&#8217;\u0131n dosya ta\u015f\u0131y\u0131c\u0131lar\u0131 varsay\u0131lan olarak asenkrondur, bu da uygulaman\u0131z\u0131n g\u00fcnl\u00fck yazma i\u015flemini beklemeden devam etmesini sa\u011flar.<br \/>\n*   <strong>Bufferlama:<\/strong> Y\u00fcksek hacimli g\u00fcnl\u00fcklerde, g\u00fcnl\u00fckleri bir araya getirip toplu olarak yazmak (bufferlama) I\/O y\u00fck\u00fcn\u00fc azaltabilir. <code>winston-daily-rotate-file<\/code> gibi ta\u015f\u0131y\u0131c\u0131lar bu t\u00fcr optimizasyonlar\u0131 sunar.<br \/>\n*   <strong>Gereksiz G\u00fcnl\u00fckleme Yapmaktan Ka\u00e7\u0131n\u0131n:<\/strong> \u00dcretim ortam\u0131nda <code>debug<\/code> veya <code>silly<\/code> gibi \u00e7ok d\u00fc\u015f\u00fck seviyeli g\u00fcnl\u00fckleri dosyalara veya uzak sunuculara yazmaktan ka\u00e7\u0131n\u0131n. Yaln\u0131zca ihtiya\u00e7 duydu\u011funuz bilgileri g\u00fcnl\u00fc\u011fe kaydedin.<\/p>\n<h3>En \u0130yi Uygulamalar<\/h3>\n<p>*   <strong>Anlaml\u0131 Mesajlar:<\/strong> G\u00fcnl\u00fck mesajlar\u0131n\u0131z\u0131n a\u00e7\u0131k, \u00f6zl\u00fc ve ba\u011flam\u0131 anla\u015f\u0131l\u0131r olmas\u0131n\u0131 sa\u011flay\u0131n. Sadece &#8220;Hata olu\u015ftu&#8221; yerine &#8220;Kullan\u0131c\u0131 X i\u00e7in sipari\u015f i\u015flenirken veritaban\u0131 ba\u011flant\u0131s\u0131 hatas\u0131 olu\u015ftu&#8221; gibi detayl\u0131 mesajlar yaz\u0131n.<br \/>\n*   <strong>Uygun G\u00fcnl\u00fck Seviyeleri:<\/strong> Her mesaj i\u00e7in do\u011fru g\u00fcnl\u00fck seviyesini kullan\u0131n. \u00d6rne\u011fin, uygulaman\u0131n \u00e7\u00f6kmesine neden olan durumlar i\u00e7in <code>error<\/code>, beklenmedik ama uygulaman\u0131n \u00e7al\u0131\u015fmas\u0131n\u0131 engellemeyen durumlar i\u00e7in <code>warn<\/code>, normal operasyonel olaylar i\u00e7in <code>info<\/code> kullan\u0131n.<br \/>\n*   <strong>Hassas Verilerden Ka\u00e7\u0131n\u0131n:<\/strong> G\u00fcnl\u00fcklere parola, kredi kart\u0131 numaras\u0131, ki\u015fisel kimlik bilgileri gibi hassas verileri yazmaktan kesinlikle ka\u00e7\u0131n\u0131n. E\u011fer bu t\u00fcr verileri g\u00fcnl\u00fc\u011fe kaydetmeniz gerekiyorsa, mutlaka maskeleme veya \u015fifreleme kullan\u0131n.<br \/>\n*   <strong>G\u00fcnl\u00fck Dosyas\u0131 Y\u00f6netimi:<\/strong> G\u00fcnl\u00fck dosyalar\u0131n\u0131n diskte yer kaplamas\u0131n\u0131 \u00f6nlemek i\u00e7in g\u00fcnl\u00fck rotasyonunu (Winston eklentileri veya <code>logrotate<\/code> ile) etkinle\u015ftirin. Eski g\u00fcnl\u00fck dosyalar\u0131n\u0131 belirli bir s\u00fcre sonra silin veya ar\u015fivleyin.<br \/>\n*   <strong>Standartla\u015ft\u0131r\u0131lm\u0131\u015f Formatlar:<\/strong> \u00d6zellikle birden fazla uygulaman\u0131z varsa, t\u00fcm uygulamalar\u0131n\u0131zda g\u00fcnl\u00fck format\u0131n\u0131 standartla\u015ft\u0131r\u0131n (\u00f6rne\u011fin JSON). Bu, merkezi g\u00fcnl\u00fck toplama ve analizini kolayla\u015ft\u0131r\u0131r.<br \/>\n*   <strong>Merkezi G\u00fcnl\u00fckleme:<\/strong> \u00dcretim ortam\u0131nda, g\u00fcnl\u00fckleri merkezi bir sisteme (ELK, Graylog vb.) g\u00f6ndermeyi d\u00fc\u015f\u00fcn\u00fcn. Bu, da\u011f\u0131t\u0131k sistemlerde sorunlar\u0131 te\u015fhis etmeyi ve genel sistem sa\u011fl\u0131\u011f\u0131n\u0131 izlemeyi b\u00fcy\u00fck \u00f6l\u00e7\u00fcde kolayla\u015ft\u0131r\u0131r.<br \/>\n*   <strong>Ba\u011flam Ekleyin:<\/strong> G\u00fcnl\u00fck mesajlar\u0131na ilgili ba\u011flam\u0131 (kullan\u0131c\u0131 ID&#8217;si, istek ID&#8217;si, i\u015flem ID&#8217;si vb.) eklemek, sorunlar\u0131 daha h\u0131zl\u0131 izlemenize yard\u0131mc\u0131 olur. Winston&#8217;\u0131n meta veri \u00f6zellikleri bunun i\u00e7in idealdir.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Winston, Node.js uygulamalar\u0131n\u0131z i\u00e7in g\u00fc\u00e7l\u00fc, esnek ve \u00f6zelle\u015ftirilebilir bir g\u00fcnl\u00fckleme \u00e7\u00f6z\u00fcm\u00fc sunar. Bu rehberde, Ubuntu 16.04 \u00fczerinde Winston&#8217;\u0131 kurmaktan, farkl\u0131 ta\u015f\u0131y\u0131c\u0131lar\u0131 yap\u0131land\u0131rmaya, g\u00fcnl\u00fck seviyelerini ve formatlar\u0131 y\u00f6netmeye, hata i\u015fleme ve Express.js uygulamalar\u0131na entegrasyona kadar bir\u00e7ok konuyu ele ald\u0131k. Ayr\u0131ca, g\u00fcnl\u00fck rotasyonu gibi \u00f6nemli operasyonel konulara ve en iyi uygulamalara da de\u011findik.<\/p>\n<p>Sa\u011flam bir g\u00fcnl\u00fckleme stratejisi, uygulaman\u0131z\u0131n \u00fcretim ortam\u0131ndaki kararl\u0131l\u0131\u011f\u0131n\u0131 ve izlenebilirli\u011fini art\u0131r\u0131r. Winston&#8217;\u0131 do\u011fru bir \u015fekilde uygulayarak, Node.js uygulamalar\u0131n\u0131z\u0131n her zaman g\u00f6z\u00fcn\u00fcz\u00fcn \u00f6n\u00fcnde olmas\u0131n\u0131 sa\u011flayabilir ve potansiyel sorunlar\u0131 proaktif bir \u015fekilde \u00e7\u00f6zebilirsiniz. Uygulaman\u0131z\u0131n karma\u015f\u0131kl\u0131\u011f\u0131 artt\u0131k\u00e7a ve \u00f6l\u00e7eklendik\u00e7e, iyi yap\u0131land\u0131r\u0131lm\u0131\u015f bir g\u00fcnl\u00fckleme sisteminin de\u011feri paha bi\u00e7ilmez olacakt\u0131r.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Winston ile Node.js Uygulamalar\u0131n\u0131 Ubuntu 16.04 \u00dczerinde G\u00fcnl\u00fc\u011fe Kaydetme Rehberi\nGiri\u015f\nModern yaz\u0131l\u0131m geli\u015ftirmenin temel ta\u015flar\u0131ndan bi","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":[1468],"tags":[],"class_list":{"0":"post-35372","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-ubuntu","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>Winston ile Node.js Uygulamalar\u0131n\u0131 Ubuntu 16.04 \u00dczerinde G\u00fcnl\u00fc\u011fe Kaydetme 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\/winston-ile-node-js-uygulamalarini-ubuntu-16-04-uzerinde-gunluge-kaydetme-rehberi\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Winston ile Node.js Uygulamalar\u0131n\u0131 Ubuntu 16.04 \u00dczerinde G\u00fcnl\u00fc\u011fe Kaydetme Rehberi\" \/>\n<meta property=\"og:description\" content=\"Winston ile Node.js Uygulamalar\u0131n\u0131 Ubuntu 16.04 \u00dczerinde G\u00fcnl\u00fc\u011fe Kaydetme Rehberi Giri\u015f Modern yaz\u0131l\u0131m geli\u015ftirmenin temel ta\u015flar\u0131ndan bi\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/winston-ile-node-js-uygulamalarini-ubuntu-16-04-uzerinde-gunluge-kaydetme-rehberi\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-28T20:40:56+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=\"25 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/winston-ile-node-js-uygulamalarini-ubuntu-16-04-uzerinde-gunluge-kaydetme-rehberi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/winston-ile-node-js-uygulamalarini-ubuntu-16-04-uzerinde-gunluge-kaydetme-rehberi\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Winston ile Node.js Uygulamalar\u0131n\u0131 Ubuntu 16.04 \u00dczerinde G\u00fcnl\u00fc\u011fe Kaydetme Rehberi\",\"datePublished\":\"2025-11-28T20:40:56+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/winston-ile-node-js-uygulamalarini-ubuntu-16-04-uzerinde-gunluge-kaydetme-rehberi\/\"},\"wordCount\":2842,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Ubuntu\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/winston-ile-node-js-uygulamalarini-ubuntu-16-04-uzerinde-gunluge-kaydetme-rehberi\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/winston-ile-node-js-uygulamalarini-ubuntu-16-04-uzerinde-gunluge-kaydetme-rehberi\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/winston-ile-node-js-uygulamalarini-ubuntu-16-04-uzerinde-gunluge-kaydetme-rehberi\/\",\"name\":\"Winston ile Node.js Uygulamalar\u0131n\u0131 Ubuntu 16.04 \u00dczerinde G\u00fcnl\u00fc\u011fe Kaydetme Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-28T20:40:56+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/winston-ile-node-js-uygulamalarini-ubuntu-16-04-uzerinde-gunluge-kaydetme-rehberi\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/winston-ile-node-js-uygulamalarini-ubuntu-16-04-uzerinde-gunluge-kaydetme-rehberi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/winston-ile-node-js-uygulamalarini-ubuntu-16-04-uzerinde-gunluge-kaydetme-rehberi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Winston ile Node.js Uygulamalar\u0131n\u0131 Ubuntu 16.04 \u00dczerinde G\u00fcnl\u00fc\u011fe Kaydetme 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":"Winston ile Node.js Uygulamalar\u0131n\u0131 Ubuntu 16.04 \u00dczerinde G\u00fcnl\u00fc\u011fe Kaydetme 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\/winston-ile-node-js-uygulamalarini-ubuntu-16-04-uzerinde-gunluge-kaydetme-rehberi\/","og_locale":"tr_TR","og_type":"article","og_title":"Winston ile Node.js Uygulamalar\u0131n\u0131 Ubuntu 16.04 \u00dczerinde G\u00fcnl\u00fc\u011fe Kaydetme Rehberi","og_description":"Winston ile Node.js Uygulamalar\u0131n\u0131 Ubuntu 16.04 \u00dczerinde G\u00fcnl\u00fc\u011fe Kaydetme Rehberi Giri\u015f Modern yaz\u0131l\u0131m geli\u015ftirmenin temel ta\u015flar\u0131ndan bi","og_url":"https:\/\/fatihsoysal.com\/blog\/winston-ile-node-js-uygulamalarini-ubuntu-16-04-uzerinde-gunluge-kaydetme-rehberi\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-28T20:40:56+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"25 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/winston-ile-node-js-uygulamalarini-ubuntu-16-04-uzerinde-gunluge-kaydetme-rehberi\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/winston-ile-node-js-uygulamalarini-ubuntu-16-04-uzerinde-gunluge-kaydetme-rehberi\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Winston ile Node.js Uygulamalar\u0131n\u0131 Ubuntu 16.04 \u00dczerinde G\u00fcnl\u00fc\u011fe Kaydetme Rehberi","datePublished":"2025-11-28T20:40:56+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/winston-ile-node-js-uygulamalarini-ubuntu-16-04-uzerinde-gunluge-kaydetme-rehberi\/"},"wordCount":2842,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Ubuntu"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/winston-ile-node-js-uygulamalarini-ubuntu-16-04-uzerinde-gunluge-kaydetme-rehberi\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/winston-ile-node-js-uygulamalarini-ubuntu-16-04-uzerinde-gunluge-kaydetme-rehberi\/","url":"https:\/\/fatihsoysal.com\/blog\/winston-ile-node-js-uygulamalarini-ubuntu-16-04-uzerinde-gunluge-kaydetme-rehberi\/","name":"Winston ile Node.js Uygulamalar\u0131n\u0131 Ubuntu 16.04 \u00dczerinde G\u00fcnl\u00fc\u011fe Kaydetme Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-28T20:40:56+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/winston-ile-node-js-uygulamalarini-ubuntu-16-04-uzerinde-gunluge-kaydetme-rehberi\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/winston-ile-node-js-uygulamalarini-ubuntu-16-04-uzerinde-gunluge-kaydetme-rehberi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/winston-ile-node-js-uygulamalarini-ubuntu-16-04-uzerinde-gunluge-kaydetme-rehberi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Winston ile Node.js Uygulamalar\u0131n\u0131 Ubuntu 16.04 \u00dczerinde G\u00fcnl\u00fc\u011fe Kaydetme 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\/35372","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=35372"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/35372\/revisions"}],"predecessor-version":[{"id":35373,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/35372\/revisions\/35373"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=35372"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=35372"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=35372"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}