Logrotate taşıdıktan sonra stdout'u bir dosyaya yönlendirmeye nasıl devam edilir?


22

Ekrana birkaç günlük çıkaran basit bir betiğim var ve günlükleri depolamak için STDOUT'u bir dosyaya aktardım. Bu komut dosyası uzun süredir çalıştığından, günlük dosyalarını daha küçük ve yönetilebilir dosyalara dönüştürmek için döndürmem gerekiyordu.

Karşılaştığım sorun logrotate, geçerli günlük dosyasını yeni bir dosyaya taşıdıktan sonra, yeni oluşturulan günlük dosyasının artık günlüklerle doldurulmamasıydı. Orijinal günlük dosyası bir kez silindikten sonra, dosya işleyicisi kaybolur ve yönlendirme artık çalışmaz.

Ben de aynı sorunu yaşayan bu yazıyı buldum ve çıktıyı yönlendirmek >>yerine kullanarak düzeltebileceğini iddia ediyorum >. Çözümünü test ettim ama işe yaramadı. Yeniden yönlendirmenin nasıl devam edeceğini bilen var mı?


4
Kesin bir dosyaya yazmak istiyorsanız, ">" yerine ">>" yerine ">>" kullanmanızı öneririm: "son" modunda açık olarak, dosyanın sonuna kadar arayacaktır. her yazdığında. Bu şekilde, dosyayı kısaltırsanız (XXXX bayttan 0 bayta kadar çıkarırsa), "sonuna kadar arar" olur, bu nedenle şimdi bayt 0'dan sonra yazması gerektiğini bilir. Aksi takdirde bayt XXXX'tan sonra yazabilir ve Öncesinde XXXX boş bayt ile seyrek bir dosya oluşturun (yani, ">" olduğunda, fd bu dosyanın neresinde olduğunu hatırlayabilir ve dosya boyutunun küçültüldüğünü fark etmeden oradan yazabilir!)
Olivier Dulac

Yanıtlar:


25

Copytruncate direktifini bu günlük dosyası için logrotate configinizde kullanmalısınız.

copytruncate Eski günlük dosyasını taşımak ve isteğe bağlı olarak yeni bir tane oluşturmak yerine, bir kopya oluşturduktan sonra orijinal günlük dosyasını yerinde kesin. Bazı programların günlük dosyasını kapatması söylenemediğinde kullanılabilir ve böylece sonsuza dek önceki günlük dosyasına yazmaya (eklemeye) devam edebilir. Dosyanın kopyalanması ve kesilmesi arasında çok küçük bir zaman dilimi olduğunu unutmayın; bu nedenle bazı günlük verileri kaybolabilir. Bu seçenek kullanıldığında, eski günlük dosyası yerinde kaldığından, oluşturma seçeneğinin etkisi olmaz


2
Söylemeye değer olabilir: Kısa bir süre için compressişlemden önce veriler kopyalanır. Bu bir zamanlar bize bir soruna neden oldu, ancak lvuzay sınırına bu kadar yakın olmamamız gerektiğinden kötüydü . Ayrıca mansnippet'te belirtildiği gibi , kopyalama ve kesme işlemleri arasında bazı günlük verilerini kaybedebilirsiniz.
Belmin Fernandez,

6

Alternatif olarak şunları da yapabilirsiniz:

  • komut satırınızdaki logger yardımcı programını piping yerine, özel bir tesisle (örneğin, local5) kullanın, örneğin:

    logger -p local5.info -t myscriptname "this is some log data"

  • syslog'u bu özelliği istenen günlük dosyasına yazacak şekilde yapılandırın, örneğin (rsyslog.conf):

    local5.* /var/log/mylogfile

  • Bu günlük için logrotate kuralını ayarlayın.


Bu, yalnızca açık çıktı komutlarınız varsa işe yarar echo. Komut dosyasından çağrılan ve aynı zamanda bir şey çıkaran üçüncü taraf araçların çıktısı, kaydediciye bu şekilde yönlendirilemez
Daniel Alder,

4

Iain çözümüne bir başka alternatif postrotate, rotasyon gerçekleştikten sonra betiğinizi yeniden başlatmak için bir komut dosyası kullanmaktır . Bu, pek çok daemon için yapılır (daemon'u yeniden başlatır veya yeniden yükler), ancak senaryonuzu bilmeden bu çözümün size uygun olup olmayacağını bilmiyorum (komut dosyanız bir süre önce oluşturulan bir duruma bağlı mı?).

İçeriği /etc/logrotate.d/your-script-name:

/var/log/your-script-name.log {
    # your current logrotate options
    ...
    postrotate
        # this supposing you have the current pid stored
        cat /run/your-script-name.pid | xargs -r kill
        #relaunch it again
        /usr/local/bin/your-script-name
    endscript
}

0

Stdout'u "split" e (linux'taki coreutils'in bir kısmı) yönlendirebilirsiniz. Dosyayı / stdin'i boyut, satır sayısı vb. Temelli parçalara ayırmanıza olanak tanır. Bir kere tıkadıktan sonra gerekirse logrotate ile yönetebilirsiniz.

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.