Nginx günlüklerini döndürmenin uygun yolu


12

Ben nginx günlükleri rotasyon elde etmek istiyorum:

  1. herhangi bir ekstra yazılım olmadan çalışır (yani - "logrotate" olmadan en iyisi)
  2. tarihe göre isimleriyle döndürülmüş dosyalar oluşturur

En iyi yaklaşım PostgreSQL'in sahip olduğu gibi bir şeydir - yani log_filename config değişkeninde strftime tarzı% Y-% m-% d belirtebilirim ve otomatik olarak oturum açma tarihi (veya saati) değişikliğini değiştirir.

Apache'den başka bir yaklaşım - günlükleri boru yoluyla rotatelogs programına gönderme.

Arama yapabildiğim kadarıyla böyle bir yaklaşım yok. Tüm yapabileceğim, dateext seçeneği ile logrotate kullanmaktır, ancak kendi dezavantajları vardır ve PostgreSQL'de | rotatelogs veya log_filename gibi çalışan bir şey kullanmayı tercih ederim.


Bu blog makalesinde , sorununuz için olası bir çözüm açıklanmaktadır. Ama bir sorum var: Neden logrotate kullanmak istemiyorsun? İşi çok iyi yapıyor, neredeyse hiç bağımlılığı yok ve çalıştığı kanıtlandı (eğer dövüştüysen savaş sertleşti). Logoptate'i kullanabiliyorsanız (bu makinedeki diğer bazı günlükleri döndürmek için de yararlı olabilir) neden çemberlerden atlayın ve daha düşük ve hataya eğilimli olabilecek ev yapımı bir çözüm kullanıyorsunuz?
joschi

logrotate (dateext ile) neredeyse çalışıyor, ama bunu sevmiyorum çünkü cron ile çalıştırılması gerekiyor ve bu bazı dezavantajları var.

Nginx, günlüklerinin diğer programlara bağlanmasını desteklemediğinden, günlük dönüşünü tek başına desteklemediğinden ve cron tabanlı bir yaklaşımı sevmediğinizden, istediğinizi elde edemeyebilirsiniz. Bazen "neredeyse çalışır" olduğu kadar iyidir. ;) Tabii ki, nginx'i kendiniz yamalamak istemediğiniz sürece.
joschi

Yanıtlar:


7

Dünya, mütevazı adlandırılmış borunun arkadaş mı yoksa düşman mı olduğuna bölünmüş olsa da, muhtemelen probleminize en basit çözümdür. Birkaç dezavantajı var (boruları önceden yaratmanız gerekiyor), ancak bir cron ihtiyacını ortadan kaldırıyor ve seçtiğiniz günlük boru filtresini kullanmanıza izin veriyor.

İşte kronolog kullanan bir örnek access.log:

  1. Adlandırılmış borumuz için bir yol seçin. Kütüklerimi saklamak istiyorum /var/log/nginx, bu yüzden borularımı da oraya koyacağım. İsim size kalmış; Ben ekliyorum .fifo, ve bu access.logyüzden benim olacak /var/log/nginx/access.log.fifo.
  2. Varsa dosyayı silin.
  3. Günlük dosyası için adlandırılmış bir kanal oluşturun:

    mkfifo /var/log/nginx/access.log.fifo
    
  4. nginx.confGünlüğü az önce yaptığınız boruya işaret edecek şekilde yapılandırın :

    access_log /var/log/nginx/access.log.fifo;
    
  5. Sunucuyu başlatmadan önce boruyu dinleyen günlük döndürücüyü başlatmak için init.d komut dosyanızı değiştirin :

    LOGS="/var/log/nginx"
    pkill -f "/usr/sbin/cronolog --symlink $LOGS/access.log"
    ( cat $LOGS/access.log.fifo | /usr/sbin/cronolog --symlink $LOGS/access.log "$LOGS/%Y/%m/%d/access.log" ) &
    

    Benzer bir komut satırı , sözdizimi için dokümanlarını görmeyi rotatelogstercih ederseniz kullanılır cronolog.

    Eğer dağıtımınız bir ise start-stop-daemon, bunun yerine bunu kullanmalısınız, çünkü teorik olarak platformunuz hakkında özel bir bilgi kaynağına sahiptir ve pkillsizin için ilgilenir . Sadece bir komut komutu sarmak ve aynı geçmek --execiçin start-stop-daemonsenin içinde init.d/nginx.


Kronolog seviyorum; kullanan / tavsiye eden daha fazla kişi görmek güzel.
natacado

1

Günlük satırı program tarafından görüldüğünde geçerli sistem saatinin aksine, günlükleri günlük tarihine göre bölmek için basit bir program, datelog yazdım. Bu, kronolog veya başka bir günlük ayırıcısının tam olarak yaptığı şey olabilir veya olmayabilir, ancak kendi yazımı yazmak, başkalarının ne yaptığını bulmaktan daha hızlıydı.

Günlüğe kaydedilen istekte yıl ve ay kullanılarak, satır daha sonra günlüğe kaydedilen verilerden hesaplanan YYYYMM'yi içeren bir dosyaya veya boruya yazılır. Evet, bu genel günlük formatı için biraz belirgindir. İlk [tarihin sınırlandırıldığı varsayılır. IPv6 adreslerine dikkat edin. :)

Günlük analizi için, her günlüğün gerçekten yalnızca ilgili aylara ilişkin istekleri içermesi önemlidir ve her günlük, doğru analiz sonuçları için ideal olarak eksiksiz olmalıdır. Dosya ayırıcıyı günlük ayırıcıdaki geçerli saate göre belirlemek yeterli değildir, çünkü 23:59:59 'dan başlayan yavaş bir istek, yanlış ay için günlük dosyasında son bulur.

Bunu nginx başlamadan önce varlığını kontrol eden adlandırılmış bir fifo aracılığıyla nginx ile kullanıyorum. Programda, hata tespiti ve arabelleğe alınmış çıktı arasında bir tradeoff olduğuna dikkat edin, burada datelog şu anda performans nedenlerinden dolayı arabelleğe alınmış çıktıyı tercih etmektedir, bu nedenle herhangi bir günlük verisini kaybetmemek için kurulumunuzun özellikle kabuk boruları kullanırken gerçekten çalıştığından emin olun. .

Kaynak kodu: http://stuge.se/datelog.c

Lütfen bana herhangi bir geri bildirim ve elbette yamalar göndermek için çekinmeyin!


1

Bunu basit bir bash betiği ve cron kullanarak yapabilirsiniz:

#!/bin/bash
DATE=$(date +%Y-%m-%d-%H%M)
mv /var/log/nginx/access.log /var/log/nginx/nginx.access.log.$DATE
mv /var/log/nginx/error.log /var/log/nginx/nginx_error.log.$DATE
kill -USR1 `cat /var/run/nginx.pid`
sleep 1
gzip /var/log/nginx/access.log.$DATE
gzip /var/log/nginx/error.log.$DATE

Burada bulunan crontab vb. Ayarlarını yapma hakkında daha fazla bilgi: Nginx günlük dosyalarını Cron üzerinden döndürme


0

Korkarım sorunuzu gerçekten anlamıyorum: nginx herhangi bir yerleşik logrotasyonu desteklemediğinden, aşağıdaki gibi bir şeyle gitmeniz gerekecek

mv access.log access.log.$(date "+%Y-%m%d")
kill -USR1 $(cat master.nginx.pid)

/etc/cron.daily adresindeki bir yerde (elbette yukarıdaki dosya adlarını tam yol adlarıyla nitelemeniz gerekir) veya rotatelog'lara erişebilmek için apache2 yardımcı programlarını yüklemeniz gerekir.


Bu logrotate ile yapabildiğim gibi. Ve daha iyi istiyorum.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.