{"id":1528,"date":"2025-11-07T23:38:59","date_gmt":"2025-11-07T20:38:59","guid":{"rendered":"https:\/\/www.dchost.com\/blog\/merkezi-loglama-ve-gozlemlenebilirlik-vpste-loki-promtail-grafana-ile-sakin-kalan-bir-zihin\/"},"modified":"2025-11-07T23:38:59","modified_gmt":"2025-11-07T20:38:59","slug":"merkezi-loglama-ve-gozlemlenebilirlik-vpste-loki-promtail-grafana-ile-sakin-kalan-bir-zihin","status":"publish","type":"post","link":"https:\/\/www.dchost.com\/blog\/merkezi-loglama-ve-gozlemlenebilirlik-vpste-loki-promtail-grafana-ile-sakin-kalan-bir-zihin\/","title":{"rendered":"Merkezi Loglama ve G\u00f6zlemlenebilirlik: VPS\u2019te Loki + Promtail + Grafana ile Sakin Kalan Bir Zihin"},"content":{"rendered":"<div class=\"dchost-blog-content-wrapper\"><div id=\"toc_container\" class=\"toc_transparent no_bullets\"><p class=\"toc_title\">\u0130&ccedil;indekiler<\/p><ul class=\"toc_list\"><li><a href=\"#Bir_Gece_Yarisi_Log_Pesinde_Neden_Merkezi_Loglama\"><span class=\"toc_number toc_depth_1\">1<\/span> Bir Gece Yar\u0131s\u0131 Log Pe\u015finde: Neden Merkezi Loglama?<\/a><\/li><li><a href=\"#Parcalari_Sakin_Sakin_Taniyalim_Loki_Promtail_Grafana\"><span class=\"toc_number toc_depth_1\">2<\/span> Par\u00e7alar\u0131 Sakin Sakin Tan\u0131yal\u0131m: Loki, Promtail, Grafana<\/a><\/li><li><a href=\"#Kurulum_Stratejisi_Kucuk_Adimlar_Net_Sonuclar\"><span class=\"toc_number toc_depth_1\">3<\/span> Kurulum Stratejisi: K\u00fc\u00e7\u00fck Ad\u0131mlar, Net Sonu\u00e7lar<\/a><\/li><li><a href=\"#Docker_Compose_ile_Hizli_Baslangic\"><span class=\"toc_number toc_depth_1\">4<\/span> Docker Compose ile H\u0131zl\u0131 Ba\u015flang\u0131\u00e7<\/a><\/li><li><a href=\"#Lokiyi_Ayarlamak_Saklama_Arsiv_Retention\"><span class=\"toc_number toc_depth_1\">5<\/span> Loki\u2019yi Ayarlamak: Saklama, Ar\u015fiv, Retention<\/a><\/li><li><a href=\"#Promtail_VPSin_Icindeki_Sesleri_Toplamak\"><span class=\"toc_number toc_depth_1\">6<\/span> Promtail: VPS\u2019in \u0130\u00e7indeki Sesleri Toplamak<\/a><\/li><li><a href=\"#Grafana_Loglari_Gozle_Okumaktan_Gozlemlenebilirlige\"><span class=\"toc_number toc_depth_1\">7<\/span> Grafana: Loglar\u0131 G\u00f6zle Okumaktan G\u00f6zlemlenebilirli\u011fe<\/a><\/li><li><a href=\"#Uyarilar_Hata_Sesini_Zamaninda_Duymak\"><span class=\"toc_number toc_depth_1\">8<\/span> Uyar\u0131lar: Hata Sesini Zaman\u0131nda Duymak<\/a><\/li><li><a href=\"#Arsiv_ve_Saklama_Ne_Kadar_Nerede_Nasil\"><span class=\"toc_number toc_depth_1\">9<\/span> Ar\u015fiv ve Saklama: Ne Kadar, Nerede, Nas\u0131l?<\/a><\/li><li><a href=\"#Guvenlik_ve_Erisim_Sadece_Ihtiyaci_Olan_Gorsun\"><span class=\"toc_number toc_depth_1\">10<\/span> G\u00fcvenlik ve Eri\u015fim: Sadece \u0130htiyac\u0131 Olan G\u00f6rs\u00fcn<\/a><\/li><li><a href=\"#Sahadan_Notlar_Etiket_Disiplini_Bellek_ve_Sorgu_Hizi\"><span class=\"toc_number toc_depth_1\">11<\/span> Sahadan Notlar: Etiket Disiplini, Bellek ve Sorgu H\u0131z\u0131<\/a><\/li><li><a href=\"#Uygulamadan_Ornekler_Nginx_Nodejs_systemd\"><span class=\"toc_number toc_depth_1\">12<\/span> Uygulamadan \u00d6rnekler: Nginx, Node.js, systemd<\/a><\/li><li><a href=\"#Gozlemlenebilirlik_Haritasini_Genisletmek_Metrikler_ve_Uptime\"><span class=\"toc_number toc_depth_1\">13<\/span> G\u00f6zlemlenebilirlik Haritas\u0131n\u0131 Geni\u015fletmek: Metrikler ve Uptime<\/a><\/li><li><a href=\"#Degisiklikleri_Guvenle_Yaymak_Konfigurasyon_Surumleme_Geri_Alma\"><span class=\"toc_number toc_depth_1\">14<\/span> De\u011fi\u015fiklikleri G\u00fcvenle Yaymak: Konfig\u00fcrasyon, S\u00fcr\u00fcmleme, Geri Alma<\/a><\/li><li><a href=\"#Sorun_Giderme_Baglantilar_Roll-uplar_Gurultu\"><span class=\"toc_number toc_depth_1\">15<\/span> Sorun Giderme: Ba\u011flant\u0131lar, Roll-up\u2019lar, G\u00fcr\u00fclt\u00fc<\/a><\/li><li><a href=\"#Kapanis_Derli_Toplu_Log_Sakin_Operasyon\"><span class=\"toc_number toc_depth_1\">16<\/span> Kapan\u0131\u015f: Derli Toplu Log, Sakin Operasyon<\/a><\/li><\/ul><\/div>\n<h2 id=\"section-1\"><span id=\"Bir_Gece_Yarisi_Log_Pesinde_Neden_Merkezi_Loglama\">Bir Gece Yar\u0131s\u0131 Log Pe\u015finde: Neden Merkezi Loglama?<\/span><\/h2>\n<p>Hi\u00e7 gece yar\u0131s\u0131 telefondaki bildirimle irkilip, \u201cSunucu bir anl\u0131\u011f\u0131na nefesini tuttu\u201d hissini ya\u015fad\u0131n m\u0131? Ben ya\u015fad\u0131m. SSH ile sunucuya girdim, bir bakt\u0131m her \u015fey da\u011f\u0131n\u0131k; Nginx ba\u015fka yerde f\u0131s\u0131ld\u0131yor, uygulama kendi k\u00f6\u015fesinde m\u0131r\u0131ldan\u0131yor, systemd ise bamba\u015fka bir defter tutmu\u015f. Kimin ne dedi\u011fini tek tek dinlemek, uykulu bir kafayla pek \u015f\u0131k bir \u00e7\u00f6z\u00fcm olmuyor. \u0130\u015fte o an merkez\u00ee loglaman\u0131n k\u0131ymeti insan\u0131n i\u00e7ine i\u015fliyor. Tek pencereden her \u015feyi g\u00f6rmek, ak\u0131\u015f\u0131 geriye sarabilmek, \u201cO s\u0131rada ne oldu?\u201d sorusunu bir iki sorguda yan\u0131tlayabilmek m\u00fcthi\u015f bir konfor.<\/p>\n<p>Bu yaz\u0131da tam da bu rahatl\u0131\u011f\u0131 kuraca\u011f\u0131z. Bir <a href=\"https:\/\/www.dchost.com\/tr\/vps\">VPS<\/a> \u00fczerinde <strong>Loki<\/strong>, <strong>Promtail<\/strong> ve <strong>Grafana<\/strong> \u00fc\u00e7l\u00fcs\u00fcyle loglar\u0131 toplayacak, saklayacak, ar\u015fivleyecek ve uyar\u0131larla kendimizi emniyete alaca\u011f\u0131z. Uygulaman\u0131n sesi, Nginx\u2019in f\u0131s\u0131lt\u0131s\u0131, sistem servislerinin i\u00e7 \u00e7eki\u015fi\u2026 Hepsi tek yerde, okunakl\u0131, aranabilir ve g\u00f6rselle\u015ftirilebilir olacak. Arada k\u00fc\u00e7\u00fck t\u00fcyolar, hatalara d\u00fc\u015fmemek i\u00e7in deneyim k\u0131r\u0131nt\u0131lar\u0131 ve g\u00fcnl\u00fck hayattan k\u00fc\u00e7\u00fck hikayeler de var. Hadi ba\u015flayal\u0131m.<\/p>\n<h2 id=\"section-2\"><span id=\"Parcalari_Sakin_Sakin_Taniyalim_Loki_Promtail_Grafana\">Par\u00e7alar\u0131 Sakin Sakin Tan\u0131yal\u0131m: Loki, Promtail, Grafana<\/span><\/h2>\n<p>Mesela \u015f\u00f6yle d\u00fc\u015f\u00fcn: Mahalleden bir s\u00fcr\u00fc s\u00f6ylenti geliyor ve sen bunlar\u0131 tek bir masada toplay\u0131p anlamland\u0131rmak istiyorsun. <strong>Promtail<\/strong> d\u0131\u015far\u0131daki t\u00fcm sesleri kay\u0131t alt\u0131na alan muhabir. <strong>Loki<\/strong> bu kay\u0131tlar\u0131 saklayan ve d\u00f6n\u00fcp d\u00f6n\u00fcp dinleyebildi\u011fin ar\u015fiv. <strong>Grafana<\/strong> ise bunlar\u0131 renkli grafiklere, h\u0131zl\u0131 aramalara ve pratik uyar\u0131lara d\u00f6n\u00fc\u015ft\u00fcren bir anlat\u0131c\u0131. Birlikte \u00e7al\u0131\u015ft\u0131klar\u0131nda tam bir \u201colay defteri\u201d kuruyorlar. Loki taraf\u0131n\u0131 tan\u0131mak istersen, <a href=\"https:\/\/grafana.com\/oss\/loki\/\" rel=\"nofollow noopener\" target=\"_blank\">Loki\u2019nin resmi sayfas\u0131<\/a> iyi bir durak.<\/p>\n<p>G\u00fczel olan \u015fu: Loglar\u0131 \u201cmetrik\u201d gibi etiketlerle sakl\u0131yor, ama ham metinleri de kaybetmiyor. Yani istersen \u201cson 1 saatte 500 hatay\u0131 a\u015fm\u0131\u015f m\u0131y\u0131z?\u201d diye say\u0131 bakabiliyor, istersen o hatalar\u0131n metnini oldu\u011fu gibi okuyabiliyorsun. Bu, kopuk kopuk tutulan dosya loglar\u0131ndan \u00e7ok daha rahat bir d\u00fcnya. \u00dcstelik tek bir VPS\u2019te bile gayet keyifle \u00e7al\u0131\u015f\u0131yor.<\/p>\n<h2 id=\"section-3\"><span id=\"Kurulum_Stratejisi_Kucuk_Adimlar_Net_Sonuclar\">Kurulum Stratejisi: K\u00fc\u00e7\u00fck Ad\u0131mlar, Net Sonu\u00e7lar<\/span><\/h2>\n<p>Ben genelde b\u00f6yle \u015feyleri iki yoldan kuruyorum: Ya sistem servisleriyle (systemd) tek tek aya\u011fa kald\u0131r\u0131yorum ya da hepsini ufak bir <strong>Docker Compose<\/strong> dosyas\u0131nda topluyorum. Tek VPS senaryosunda Compose kullanmak pratik oluyor; s\u00fcr\u00fcmleri g\u00fcncellemek, config dosyalar\u0131n\u0131 bir arada tutmak, ar\u0131za durumunda kald\u0131r\u0131p yeniden denemek daha rahat. Ama \u201cDocker istemiyorum\u201d diyorsan, ayn\u0131 yap\u0131land\u0131rmay\u0131 systemd ile de kurabilirsin. \u00d6nemli olan, ilk g\u00fcn basit ba\u015flay\u0131p, ihtiya\u00e7 b\u00fcy\u00fcd\u00fck\u00e7e katman eklemek.<\/p>\n<p>\u0130lk i\u015f, ufak bir \u00e7al\u0131\u015fma dizini a\u00e7mak. \u0130\u00e7ine \u00fc\u00e7 dosya koyaca\u011f\u0131z: docker-compose.yml, loki-config.yaml ve promtail-config.yml. B\u00f6yle d\u00fczenli bir ba\u015flang\u0131\u00e7, ileride neyin nerede oldu\u011funu hat\u0131rlamay\u0131 kolayla\u015ft\u0131r\u0131yor. Sonra tek komutla ayaklanacaklar. Haz\u0131rsan, bir taslak g\u00f6relim.<\/p>\n<h2 id=\"section-4\"><span id=\"Docker_Compose_ile_Hizli_Baslangic\">Docker Compose ile H\u0131zl\u0131 Ba\u015flang\u0131\u00e7<\/span><\/h2>\n<p>A\u015fa\u011f\u0131daki dosyay\u0131 \u00e7al\u0131\u015fma dizinine docker-compose.yml ad\u0131yla kaydet. Portlar yerel ortam i\u00e7in a\u00e7\u0131k, veriler kal\u0131c\u0131 hacimlerde tutuluyor. Versiyon numaralar\u0131 \u00f6rnek; istersen g\u00fcncel etiketleri kullan.<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\">version: '3.9'\nservices:\n  loki:\n    image: grafana\/loki:2.9.0\n    command: -config.file=\/etc\/loki\/local-config.yaml\n    volumes:\n      - .\/loki-config.yaml:\/etc\/loki\/local-config.yaml:ro\n      - loki-data:\/var\/lib\/loki\n    ports:\n      - &quot;3100:3100&quot;\n    restart: unless-stopped\n\n  promtail:\n    image: grafana\/promtail:2.9.0\n    command: -config.file=\/etc\/promtail\/config.yml\n    volumes:\n      - .\/promtail-config.yml:\/etc\/promtail\/config.yml:ro\n      - \/var\/log:\/var\/log\n      - \/run\/log\/journal:\/run\/log\/journal:ro\n      - \/var\/lib\/promtail:\/var\/lib\/promtail\n      - \/etc\/machine-id:\/etc\/machine-id:ro\n      - \/var\/lib\/docker\/containers:\/var\/lib\/docker\/containers:ro\n    depends_on:\n      - loki\n    restart: unless-stopped\n\n  grafana:\n    image: grafana\/grafana:10.4.0\n    ports:\n      - &quot;3000:3000&quot;\n    volumes:\n      - grafana-data:\/var\/lib\/grafana\n    environment:\n      - GF_INSTALL_PLUGINS=grafana-piechart-panel\n    restart: unless-stopped\n\nvolumes:\n  loki-data:\n  grafana-data:\n<\/code><\/pre>\n<p>Bu dosya haz\u0131rsa, tek bir komutla aya\u011fa kald\u0131rabilirsin. Klas\u00f6re gelip \u201cdocker compose up -d\u201d demek yeterli. Sonras\u0131nda taray\u0131c\u0131da 3000\u2019e gidince Grafana seni kar\u015f\u0131layacak. \u0130lk \u015fifreyle girip (admin\/admin gibi bir \u015feyse de\u011fi\u015ftir), sonra Loki\u2019yi veri kayna\u011f\u0131 olarak ekleyece\u011fiz. Ama \u00f6nce Loki\u2019ye do\u011fru bir d\u00fckkan d\u00fczeni verelim.<\/p>\n<h2 id=\"section-5\"><span id=\"Lokiyi_Ayarlamak_Saklama_Arsiv_Retention\">Loki\u2019yi Ayarlamak: Saklama, Ar\u015fiv, Retention<\/span><\/h2>\n<p>Loki\u2019yi k\u00fc\u00e7\u00fck bir VPS\u2019te \u00e7al\u0131\u015ft\u0131r\u0131rken a\u015f\u0131r\u0131 ayr\u0131nt\u0131ya bo\u011fmadan, tek kopya, dosya tabanl\u0131 bir ar\u015fivle ba\u015flamak rahat. \u201cSonraki a\u015famada S3\u2019e ta\u015f\u0131yabilir miyim?\u201d diye soruyorsan, evet; ayn\u0131 mant\u0131k S3 deposuyla da \u00e7al\u0131\u015f\u0131yor. A\u015fa\u011f\u0131daki \u00f6rnek config, dosya sistemi \u00fczerinde boltdb-shipper ile saklama yap\u0131yor, derli toplu bir retention sa\u011fl\u0131yor.<\/p>\n<pre class=\"language-nginx line-numbers\"><code class=\"language-nginx\"># loki-config.yaml\nserver:\n  http_listen_port: 3100\n  grpc_listen_port: 9095\n\ncommon:\n  instance_addr: 127.0.0.1\n  path_prefix: \/var\/lib\/loki\n  storage:\n    filesystem:\n      chunks_directory: \/var\/lib\/loki\/chunks\n      rules_directory: \/var\/lib\/loki\/rules\n  replication_factor: 1\n  ring:\n    kvstore:\n      store: inmemory\n\nschema_config:\n  configs:\n    - from: 2024-01-01\n      store: boltdb-shipper\n      object_store: filesystem\n      schema: v13\n      index:\n        prefix: index_\n        period: 24h\n\nstorage_config:\n  boltdb_shipper:\n    active_index_directory: \/var\/lib\/loki\/index\n    cache_location: \/var\/lib\/loki\/boltdb-cache\n    shared_store: filesystem\n  filesystem:\n    directory: \/var\/lib\/loki\/chunks\n\nchunk_store_config:\n  max_look_back_period: 168h  # 7 g\u00fcn geriye bak\n\ntable_manager:\n  retention_deletes_enabled: true\n  retention_period: 168h\n\ncompactor:\n  working_directory: \/var\/lib\/loki\/compactor\n  compaction_interval: 5m\n  retention_enabled: true\n\nruler:\n  rule_path: \/var\/lib\/loki\/rules-temp\n  storage:\n    type: local\n    local:\n      directory: \/var\/lib\/loki\/rules\n  alertmanager_url: http:\/\/localhost:9093\n  enable_api: true\n<\/code><\/pre>\n<p>Burada retention basit\u00e7e 7 g\u00fcn. \u0130lk denemede k\u0131sa tutmak iyi; diski, sorgu h\u0131z\u0131n\u0131 ve al\u0131\u015fkanl\u0131klar\u0131n\u0131 g\u00f6rd\u00fck\u00e7e uzatabilirsin. Dosya sistemi yerine bir \u201cobject store\u201d kullanmak istersen, filesystem k\u0131sm\u0131n\u0131 S3 ile de\u011fi\u015ftirmen yeterli. Yedekleme taraf\u0131nda i\u015fin kolayla\u015fs\u0131n istersen, benim sevdi\u011fim yakla\u015f\u0131m\u0131 anlatt\u0131\u011f\u0131m <a href=\"https:\/\/www.dchost.com\/blog\/restic-ve-borg-ile-s3-uyumlu-uzak-yedekleme-surumleme-sifreleme-ve-saklama-ne-zaman-nasil\/\">S3 uyumlu uzak yedekleme rehberine<\/a> g\u00f6z atabilirsin.<\/p>\n<h2 id=\"section-6\"><span id=\"Promtail_VPSin_Icindeki_Sesleri_Toplamak\">Promtail: VPS\u2019in \u0130\u00e7indeki Sesleri Toplamak<\/span><\/h2>\n<p>Promtail, loglar\u0131n kap\u0131s\u0131ndaki g\u00fcvenilir muhabir. Neleri toplayaca\u011f\u0131n\u0131 s\u00f6yle, o da titizlikle ta\u015f\u0131s\u0131n. Systemd g\u00fcnl\u00fckleri, Nginx access\/error loglar\u0131, uygulama klas\u00f6r\u00fcndeki dosyalar, hatta Docker container loglar\u0131\u2026 Hepsini toparlamak m\u00fcmk\u00fcn. \u00d6nemli olan, etiketleri (labels) sade tutmak. Her iste\u011fin ID\u2019sini etiket yapmak kula\u011fa ho\u015f gelir ama belle\u011fi yorar. Ben genelde job, environment, service name, host gibi sabit etiketlerle ba\u015fl\u0131yorum.<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\"># promtail-config.yml\nserver:\n  http_listen_port: 9080\n  grpc_listen_port: 0\n\npositions:\n  filename: \/var\/lib\/promtail\/positions.yaml\n\nclients:\n  - url: http:\/\/loki:3100\/loki\/api\/v1\/push\n\nscrape_configs:\n  - job_name: journal\n    journal:\n      max_age: 12h\n      labels:\n        job: systemd\n        host: ${HOSTNAME}\n    relabel_configs:\n      - source_labels: ['__journal__systemd_unit']\n        target_label: unit\n\n  - job_name: nginx\n    static_configs:\n      - targets: [localhost]\n        labels:\n          job: nginx\n          env: prod\n          __path__: \/var\/log\/nginx\/*.log\n\n  - job_name: app\n    static_configs:\n      - targets: [localhost]\n        labels:\n          job: app\n          env: prod\n          service: webshop\n          __path__: \/var\/www\/app\/storage\/logs\/*.log\n    pipeline_stages:\n      - regex:\n          expression: '^[(?P&lt;level&gt;w+)]s+(?P&lt;msg&gt;.*)$'\n      - labels:\n          level:\n      - output:\n          source: msg\n<\/code><\/pre>\n<p>Burada systemd g\u00fcnl\u00fcklerini \u00fcnite ad\u0131na g\u00f6re etiketliyoruz, Nginx loglar\u0131n\u0131 tek etikette birle\u015ftiriyoruz, uygulama loglar\u0131n\u0131 da seviyeyi (INFO, ERROR gibi) ay\u0131klayarak zenginle\u015ftiriyoruz. B\u00f6yle olunca Grafana\u2019dan \u201cson 15 dakikadaki ERROR say\u0131s\u0131 50\u2019yi ge\u00e7ti mi?\u201d gibi alarm kurmak kolay. Promtail\u2019in boru hatt\u0131 a\u015famalar\u0131n\u0131 merak edersen, <a href=\"https:\/\/grafana.com\/docs\/loki\/latest\/send-data\/promtail\/stages\/\" rel=\"nofollow noopener\" target=\"_blank\">Promtail a\u015famalar\u0131<\/a> belgeleri ho\u015f bir anlat\u0131mla \u00f6zetliyor.<\/p>\n<h2 id=\"section-7\"><span id=\"Grafana_Loglari_Gozle_Okumaktan_Gozlemlenebilirlige\">Grafana: Loglar\u0131 G\u00f6zle Okumaktan G\u00f6zlemlenebilirli\u011fe<\/span><\/h2>\n<p>Grafana a\u00e7\u0131ld\u0131\u011f\u0131nda, \u00f6nce \u201cData Sources\u201d men\u00fcs\u00fcnden Loki\u2019yi ekle. URL olarak http:\/\/loki:3100 yazman yeterli, Compose a\u011f\u0131 i\u00e7inde isimle eri\u015filecek. Sonra \u201cExplore\u201d b\u00f6l\u00fcm\u00fcne girip ufak bir deneme yapal\u0131m. Mesela son 5 dakikada Nginx\u2019te 500 hatas\u0131 var m\u0131 diye soral\u0131m. LogQL dili tam bu i\u015f i\u00e7in var; sade, niyetini belli eden bir dille konu\u015fuyor.<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\">{job=&quot;nginx&quot;} |= &quot; 500 &quot;<\/code><\/pre>\n<p>Bu sorgu, Nginx loglar\u0131nda 500 ge\u00e7en sat\u0131rlar\u0131 getirir. Saymak istersen bir ad\u0131m daha atars\u0131n, \u201crate\u201d gibi metrik benzeri operat\u00f6rleri devreye sokars\u0131n. \u00d6rnek olsun:<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\">sum by (job) (rate({job=&quot;nginx&quot;} |= &quot; 500 &quot; [5m]))<\/code><\/pre>\n<p>Biraz daha tatl\u0131 bir \u00f6rnek: Uygulama loglar\u0131nda ERROR\u2019lar\u0131 seviyeye g\u00f6re sayal\u0131m, panellerde \u0131s\u0131nma varsa k\u0131rm\u0131z\u0131ya d\u00f6ns\u00fcn. Bunun i\u00e7in \u00f6nce Explore\u2019da oynar, sonra panelleri kaydedersin. LogQL\u2019i tan\u0131mak istersen, <a href=\"https:\/\/grafana.com\/docs\/loki\/latest\/query\/\" rel=\"nofollow noopener\" target=\"_blank\">LogQL ile sorgulama<\/a> sayfas\u0131 k\u0131sa \u00f6rneklerle iyi bir e\u015flik\u00e7i.<\/p>\n<h2 id=\"section-8\"><span id=\"Uyarilar_Hata_Sesini_Zamaninda_Duymak\">Uyar\u0131lar: Hata Sesini Zaman\u0131nda Duymak<\/span><\/h2>\n<p>Uyar\u0131 dedi\u011fin, bardak devrilmeden \u00f6nce \u201cMasada bir sallant\u0131 var\u201d diyen i\u00e7 ses. Grafana\u2019n\u0131n yeni nesil alarm sistemiyle log tabanl\u0131 kurallar olu\u015fturmak epey kolay. \u00d6rne\u011fin, \u201cSon 10 dakikada ERROR say\u0131s\u0131 100\u2019\u00fc a\u015farsa Slack\u2019e haber ver\u201d gibi bir kural yazabiliriz. Explore\u2019da \u00e7al\u0131\u015fan sorgunu bir panele koy, panelden Alert sekmesine ge\u00e7, e\u015fi\u011fi belirle, bir ileti\u015fim noktas\u0131 (Slack, e\u2011posta) se\u00e7 ve kaydet.<\/p>\n<p>Bazen metin aramak yetmez; belirli bir servis ad\u0131n\u0131n hata h\u0131z\u0131n\u0131 da izlemek istersin. O zaman etiketleri kullanarak se\u00e7ici olursun. Diyelim ki \u201cwebshop\u201d servisi i\u00e7in ERROR ak\u0131\u015f\u0131n\u0131 sayal\u0131m:<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\">sum by (service) (rate({job=&quot;app&quot;, service=&quot;webshop&quot;, level=&quot;ERROR&quot;}[10m]))<\/code><\/pre>\n<p>Bu de\u011fer 0.2\u2019yi a\u015farsa alarm ver, h\u0131zl\u0131ca bak. Paneldeki e\u015fi\u011fi d\u00fc\u015f\u00fck tutup sonra kademeli y\u00fckseltmek pratik oluyor. Bir de sevdi\u011fim k\u00fc\u00e7\u00fck al\u0131\u015fkanl\u0131k: Uyar\u0131 metnine, bak\u0131lacak sorgunun ve ilgili dashboard\u2019un ba\u011flant\u0131s\u0131n\u0131 eklemek. Gece uykusu b\u00f6l\u00fcnd\u00fc\u011f\u00fcnde, \u201cBen nereye bak\u0131yordum?\u201d derdini azalt\u0131yor.<\/p>\n<h2 id=\"section-9\"><span id=\"Arsiv_ve_Saklama_Ne_Kadar_Nerede_Nasil\">Ar\u015fiv ve Saklama: Ne Kadar, Nerede, Nas\u0131l?<\/span><\/h2>\n<p>Logun \u00f6mr\u00fc biraz da ihtiyac\u0131nla alakal\u0131. Geli\u015ftirme a\u015famas\u0131nda 7 g\u00fcn yetebilir, \u00fcretimde belki 30 g\u00fcne uzat\u0131rs\u0131n. Loki\u2019nin retention ayar\u0131 burada anahtar. Disk daral\u0131yorsa \u00f6nce gereksiz etiketleri azalt, sonra saklama s\u00fcresini toparla. S3 gibi bir object store\u2019a ge\u00e7mek istersen de configte \u201cobject_store\u201d k\u0131sm\u0131n\u0131 S3\u2019e \u00e7evirip eri\u015fim bilgilerini eklemen kafi. G\u00fcn\u00fcn birinde \u201cBen bu ar\u015fivi d\u0131\u015far\u0131 da alay\u0131m\u201d dersen, log klas\u00f6rlerinin yede\u011fini planl\u0131 bir boru hatt\u0131na koymak iyi fikir. Ben bunun i\u00e7in zaman\u0131nda anlatt\u0131\u011f\u0131m <a href=\"https:\/\/www.dchost.com\/blog\/restic-ve-borg-ile-s3-uyumlu-uzak-yedekleme-surumleme-sifreleme-ve-saklama-ne-zaman-nasil\/\">S3 uyumlu uzak yedekleme prati\u011fini<\/a> seviyorum; \u015fifreleme, s\u00fcr\u00fcmleme ve saklama politikas\u0131 bir arada y\u00fcr\u00fcyor.<\/p>\n<p>Ar\u015fiv demi\u015fken, k\u00fc\u00e7\u00fck ama etkili bir al\u0131\u015fkanl\u0131k: Rotasyonlar\u0131n\u0131 ve retention\u2019\u0131 \u00e7ak\u0131\u015ft\u0131rma. Uygulama kendi i\u00e7inde \u00e7ok h\u0131zl\u0131 rotasyon yap\u0131yorsa Promtail\u2019in pozisyon dosyas\u0131 \u015fa\u015f\u0131rabilir. Rotasyon aral\u0131klar\u0131n\u0131 biraz rahat b\u0131rakmak, Promtail\u2019in acele etmeden kuyru\u011fu ta\u015f\u0131mas\u0131na f\u0131rsat verir.<\/p>\n<h2 id=\"section-10\"><span id=\"Guvenlik_ve_Erisim_Sadece_Ihtiyaci_Olan_Gorsun\">G\u00fcvenlik ve Eri\u015fim: Sadece \u0130htiyac\u0131 Olan G\u00f6rs\u00fcn<\/span><\/h2>\n<p>Grafana\u2019y\u0131 3000\u2019den, Loki\u2019yi 3100\u2019den a\u00e7t\u0131k, g\u00fczel. Ama bu portlar\u0131 herkese a\u00e7\u0131k b\u0131rakmak istemeyebilirsin. Ben \u00e7o\u011fu zaman Nginx\u2019in arkas\u0131na al\u0131p basit bir kimlik do\u011frulama ekliyorum. \u0130stersen mTLS, istersen IP k\u0131s\u0131tlamas\u0131, istersen temel kimlik do\u011frulama\u2026 K\u00fc\u00e7\u00fck bir \u00f6rnek, Grafana i\u00e7in:<\/p>\n<pre class=\"language-nginx line-numbers\"><code class=\"language-nginx\">server {\n  listen 443 ssl;\n  server_name logs.example.com;\n\n  ssl_certificate \/etc\/ssl\/certs\/fullchain.pem;\n  ssl_certificate_key \/etc\/ssl\/private\/privkey.pem;\n\n  auth_basic &quot;Logs&quot;;\n  auth_basic_user_file \/etc\/nginx\/.htpasswd;\n\n  location \/ {\n    proxy_set_header Host $host;\n    proxy_set_header X-Real-IP $remote_addr;\n    proxy_set_header X-Forwarded-Proto $scheme;\n    proxy_pass http:\/\/127.0.0.1:3000;\n  }\n}\n<\/code><\/pre>\n<p>Bu \u00f6rnekle temel bir koruma sa\u011flars\u0131n. E\u011fer websiteni zaten Nginx ve modern \u015fifreleme ile g\u00fc\u00e7lendiriyorsan, oradaki prensipleri burada da uygula. Geli\u015ftirici ortamlar\u0131nda ise \u015fifreyi bir ekip kasas\u0131nda saklamak, eri\u015fimi gerekti\u011finde a\u00e7\u0131p kapatmak i\u015fleri d\u00fczenli tutuyor. Uygulama loglar\u0131na gere\u011finden fazla detay basmamak da g\u00fcvenlikte ilk ad\u0131m; kimlik bilgileri veya ki\u015fisel veriler loga d\u00fc\u015fmesin.<\/p>\n<h2 id=\"section-11\"><span id=\"Sahadan_Notlar_Etiket_Disiplini_Bellek_ve_Sorgu_Hizi\">Sahadan Notlar: Etiket Disiplini, Bellek ve Sorgu H\u0131z\u0131<\/span><\/h2>\n<p>Uzun vadede en \u00e7ok fayda sa\u011flayan al\u0131\u015fkanl\u0131k, <strong>etiket disiplini<\/strong>. Her iste\u011fe \u00f6zel, s\u00fcrekli de\u011fi\u015fen de\u011ferleri etiket yapmamak gerekiyor. Request ID, kullan\u0131c\u0131 ID, token gibi de\u011ferler metin i\u00e7inde kals\u0131n; filtrelerken \u201c|= &#8220;.user_id=123&#8243;\u201d gibi metin aramas\u0131na g\u00fcven. Etiketlerde; job, service, env, host, level gibi sakin de\u011ferleri tercih et. B\u00f6ylece Loki\u2019nin kartopu gibi b\u00fcy\u00fcmesini engellersin, sorgular da seri akar.<\/p>\n<p>\u0130kincisi, sorgu pencerelerini ak\u0131ll\u0131 se\u00e7mek. \u00c7ok geni\u015f bir zaman aral\u0131\u011f\u0131nda \u201cher \u015feyi\u201d istemek zorlar. \u00d6nce yak\u0131n bir aral\u0131\u011f\u0131 taray\u0131p ipucunu bul, sonra geriye geni\u015fle. Bir de unutma: \u00c7ok g\u00fcr\u00fclt\u00fcl\u00fc loglar varsa, uygulama taraf\u0131nda seviyeyi ayarlamak ve gereksiz sat\u0131rlar\u0131 azaltmak \u00e7ift tarafl\u0131 bir kazan\u0131m.<\/p>\n<h2 id=\"section-12\"><span id=\"Uygulamadan_Ornekler_Nginx_Nodejs_systemd\">Uygulamadan \u00d6rnekler: Nginx, Node.js, systemd<\/span><\/h2>\n<p>Nginx\u2019te access ve error dosyalar\u0131 klasik. Access loglar\u0131nda \u201crequest_time\u201d ve \u201cupstream_status\u201d gibi alanlar varsa, metin aramalar\u0131yla performans kokusu alan sorgular yazabilirsin. Uygulamada Node.js kullan\u0131yorsan, anlaml\u0131 ve tek sat\u0131rl\u0131k log format\u0131 i\u015fleri \u00e7ok kolayla\u015ft\u0131r\u0131r. Nas\u0131l canl\u0131ya al\u0131rken panik yapmadan derli toplu bir ortam kuraca\u011f\u0131n\u0131 anlatt\u0131\u011f\u0131m <a href=\"https:\/\/www.dchost.com\/blog\/node-jsi-canliya-alirken-panik-yapma-pm2-systemd-nginx-ssl-ve-sifir-kesinti-deploy-nasil-kurulur\/\">Node.js\u2019i canl\u0131ya al\u0131rken PM2\/systemd ve Nginx notlar\u0131<\/a>, log d\u00fczeni i\u00e7in de ilham verebilir.<\/p>\n<p>Systemd taraf\u0131nda ise servis isimlerine g\u00f6re ay\u0131rmak, \u00f6zellikle \u201cneden yeniden ba\u015flad\u0131?\u201d soru i\u015faretini \u00e7\u00f6zer. Journal\u2019dan \u00fcnite ad\u0131na etiketleme yap\u0131nca, hangi servis ne zaman inlemi\u015f g\u00f6r\u00fcrs\u00fcn. Promtail burada hayati; positions dosyas\u0131n\u0131 korur, koptu\u011fu yerden devam eder, panik yok.<\/p>\n<h2 id=\"section-13\"><span id=\"Gozlemlenebilirlik_Haritasini_Genisletmek_Metrikler_ve_Uptime\">G\u00f6zlemlenebilirlik Haritas\u0131n\u0131 Geni\u015fletmek: Metrikler ve Uptime<\/span><\/h2>\n<p>Loglar tek ba\u015f\u0131na yetmez, do\u011fru. Ama iyi bir ba\u015flang\u0131\u00e7. \u00dczerine metrikleri ve uptime kontrollerini koydu\u011funda tablo tamamlan\u0131yor. Ben genelde Loki ile loglar\u0131 oturttuktan sonra, ayn\u0131 Grafana i\u00e7inde Prometheus ve k\u00fc\u00e7\u00fck bir uptime izleyici ekliyorum. Bu konuda \u201cilk ta\u015flar\u0131 nas\u0131l dizerim?\u201d dersen, <a href=\"https:\/\/www.dchost.com\/blog\/vps-izleme-ve-alarm-kurulumu-prometheus-grafana-ve-uptime-kuma-ile-baslangic\/\">VPS izleme ve alarm kurulumuna dair rehber<\/a> ho\u015f bir yolda\u015f olur. Loglardaki ERROR artarken CPU, bellek ve yan\u0131t s\u00fcresi ne yap\u0131yor, birlikte bak\u0131nca hikaye tamamlan\u0131yor.<\/p>\n<h2 id=\"section-14\"><span id=\"Degisiklikleri_Guvenle_Yaymak_Konfigurasyon_Surumleme_Geri_Alma\">De\u011fi\u015fiklikleri G\u00fcvenle Yaymak: Konfig\u00fcrasyon, S\u00fcr\u00fcmleme, Geri Alma<\/span><\/h2>\n<p>G\u00fcn\u00fcn sonuna do\u011fru ufak bir Promtail kural\u0131 ekledin diyelim. Canl\u0131da denemek istiyorsun ama \u201cya bir \u015feyi bozarsam\u201d \u00e7ekincesi hep var. O noktada k\u00fc\u00e7\u00fck bir CI\/CD hatt\u0131 kurtar\u0131c\u0131. Konfig\u00fcrasyon dosyalar\u0131n\u0131 versiyon kontrol\u00fcne al, bir \u201cstaging\u201d VPS\u2019te dene, sonra \u00fcretime g\u00fcvenle at. Benzer bir yakla\u015f\u0131m\u0131 ad\u0131m ad\u0131m anlatt\u0131\u011f\u0131m <a href=\"https:\/\/www.dchost.com\/blog\/vpse-sifir-kesinti-ci-cd-nasil-kurulur-rsync-sembolik-surumler-ve-systemd-ile-sicacik-bir-yolculuk\/\">VPS\u2019e s\u0131f\u0131r kesinti CI\/CD yaz\u0131s\u0131<\/a> burada harika \u00e7al\u0131\u015f\u0131yor. Bir de k\u00fc\u00e7\u00fck \u00f6neri: Loki ve Promtail\u2019in s\u00fcr\u00fcmlerini birlikte g\u00fcncelle, b\u00fcy\u00fck atlamalarda \u00f6nce test et.<\/p>\n<h2 id=\"section-15\"><span id=\"Sorun_Giderme_Baglantilar_Roll-uplar_Gurultu\">Sorun Giderme: Ba\u011flant\u0131lar, Roll-up\u2019lar, G\u00fcr\u00fclt\u00fc<\/span><\/h2>\n<p>Olur ya, Promtail g\u00f6nderiyor ama Loki\u2019de g\u00f6r\u00fcnm\u00fcyor. \u0130lk kontrol adresi Promtail aray\u00fcz\u00fc; 9080 portundan \u201ctargets\u201d sayfas\u0131na bak, durum \u201cready\u201d mi? Sonra firewall veya reverse proxy araya giriyor mu diye bakars\u0131n. G\u00f6r\u00fcn\u00fcyor ama yava\u015fsa, sorgu penceresini daralt, gereksiz etiket var m\u0131 diye incele. Loglar \u00e7ok g\u00fcr\u00fclt\u00fcl\u00fc ise, uygulamada seviyeyi INFO yerine WARN\u2019a \u00e7ekmek bazen en kestirme \u00e7\u00f6z\u00fcm. Bir de kompakt\u00f6r\u00fcn \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin ol; ar\u015fivi toparlarken o g\u00f6revli.<\/p>\n<p>Grafana\u2019da panel bo\u015f d\u00f6n\u00fcyorsa, zaman aral\u0131\u011f\u0131 ayar\u0131 ve sorgu ifadesine yeniden g\u00f6z at. LogQL basit ama k\u00fc\u00e7\u00fck t\u0131rnak ve e\u015fittir oyunlar\u0131 \u00f6nemli. Emin olamad\u0131\u011f\u0131nda Explore ekran\u0131nda ad\u0131m ad\u0131m ilerlemek en temiz yol.<\/p>\n<h2 id=\"section-16\"><span id=\"Kapanis_Derli_Toplu_Log_Sakin_Operasyon\">Kapan\u0131\u015f: Derli Toplu Log, Sakin Operasyon<\/span><\/h2>\n<p>Merkez\u00ee loglama, ilk bak\u0131\u015fta bir \u201cnice to have\u201d gibi duruyor. Oysa gece yar\u0131s\u0131 bir hata patlay\u0131nca, sabah trafi\u011fi art\u0131nca ya da ekip b\u00fcy\u00fcy\u00fcp el de\u011fi\u015fmeye ba\u015flay\u0131nca, de\u011ferini \u00e7ok net g\u00f6r\u00fcyorsun. Loki + Promtail + Grafana \u00fc\u00e7l\u00fcs\u00fc, tek VPS\u2019te bile hafif ad\u0131mlarla kurulup g\u00fcnl\u00fck hayata uyumlanan bir sistem. \u00dcstelik b\u00fcy\u00fcmek istedi\u011finde, ayn\u0131 al\u0131\u015fkanl\u0131klar\u0131 daha geni\u015f bir oyunca\u011fa ta\u015f\u0131yorsun.<\/p>\n<p>Ba\u015flang\u0131\u00e7 i\u00e7in k\u00fc\u00e7\u00fck \u00f6nerilerimi toparlayay\u0131m. Etiketleri sade tut; job, env, service, host sana yeter. Retention\u2019\u0131 kademeli art\u0131r, diski ve sorgu s\u00fcresini izleyerek karar ver. Uyar\u0131lar\u0131 erken kur, e\u015fikleri zamanla finetune et. De\u011fi\u015fiklikleri s\u00fcr\u00fcm kontrol\u00fcnde sakla, k\u00fc\u00e7\u00fck ad\u0131mlarla yay\u0131mla, bir \u015fey olursa geri almas\u0131 kolay olsun. Ve unutmadan, uygulamay\u0131 canl\u0131ya al\u0131rken log format\u0131n\u0131 basit ve tek sat\u0131rl\u0131 tutmak, ileride sana dakikalar kazand\u0131r\u0131r; nitekim bu konuda payla\u015ft\u0131\u011f\u0131m <a href=\"https:\/\/www.dchost.com\/blog\/node-jsi-canliya-alirken-panik-yapma-pm2-systemd-nginx-ssl-ve-sifir-kesinti-deploy-nasil-kurulur\/\">canl\u0131ya alma notlar\u0131<\/a> log d\u00fczenini sadele\u015ftirmeye de g\u00f6z k\u0131rp\u0131yor.<\/p>\n<p>Umar\u0131m bu yolculuk sana iyi gelmi\u015ftir. Bir sonraki k\u00fc\u00e7\u00fck krizde elinin alt\u0131ndaki bu d\u00fczenle nefes alaca\u011f\u0131n\u0131 bilmek g\u00fczel. Sorun, deneyim payla\u015f, kendi mutfa\u011f\u0131nda i\u015fe yarayan minik teknikleri anlat; hep birlikte daha sakin bir operasyon k\u00fclt\u00fcr\u00fc kuruyoruz. G\u00f6r\u00fc\u015fmek \u00fczere.<\/p>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>\u0130&ccedil;indekiler1 Bir Gece Yar\u0131s\u0131 Log Pe\u015finde: Neden Merkezi Loglama?2 Par\u00e7alar\u0131 Sakin Sakin Tan\u0131yal\u0131m: Loki, Promtail, Grafana3 Kurulum Stratejisi: K\u00fc\u00e7\u00fck Ad\u0131mlar, Net Sonu\u00e7lar4 Docker Compose ile H\u0131zl\u0131 Ba\u015flang\u0131\u00e75 Loki\u2019yi Ayarlamak: Saklama, Ar\u015fiv, Retention6 Promtail: VPS\u2019in \u0130\u00e7indeki Sesleri Toplamak7 Grafana: Loglar\u0131 G\u00f6zle Okumaktan G\u00f6zlemlenebilirli\u011fe8 Uyar\u0131lar: Hata Sesini Zaman\u0131nda Duymak9 Ar\u015fiv ve Saklama: Ne Kadar, Nerede, Nas\u0131l?10 G\u00fcvenlik [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1529,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[26],"tags":[],"class_list":["post-1528","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-teknoloji"],"_links":{"self":[{"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/posts\/1528","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/comments?post=1528"}],"version-history":[{"count":0,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/posts\/1528\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/media\/1529"}],"wp:attachment":[{"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/media?parent=1528"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/categories?post=1528"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/tags?post=1528"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}