Logrotate Başarılı, orijinal dosya orijinal boyutuna geri döner


11

Daha önce logrotate ile ilgili herhangi bir sorun yaşadı mı? İşte bulgularım:

Logrotate Komut Dosyası:

/var/log/mylogfile.log {
    7 döndür
    günlük
    kompres
    olddir / log_archives
    missingok
    notifempty
    copytruncate
}

Logrotate'in Ayrıntılı Çıkışı:

/var/log/mylogfile.log dosyasını /log_archives/mylogfile.log.1 klasörüne kopyalama
truncating /var/log/mylogfile.log
günlüğü sıkıştırma: / bin / gzip
eski günlük kaldırılıyor /log_archives/mylogfile.log.8.gz

Kesilme gerçekleştikten sonra günlük dosyası

[root @ sunucu ~] # ls -lh /var/log/mylogfile.log
-rw-rw-r-- 1 bölüm1 bölüm1 0 Oca 11 17:32 /var/log/mylogfile.log

Kelimenin Sonunda Saniye:

[root @ sunucu ~] # ls -lh /var/log/mylogfile.log
-rw-rw-r-- 1 bölüm1 bölüm1 3.5G 11 Ocak 17:32 /var/log/mylogfile.log

RHEL Sürümü:

[root @ server ~] # kedi / etc / redhat-release 
Red Hat Enterprise Linux ES sürüm 4 (Nahant Güncellemesi 4)

Logrotate Sürümü:

[kök @ DAA21529WWW370 ~] # rpm -qa | grep logrotate
logrotate-3.7.1-10.RHEL4

Birkaç Not:

  • Hizmet anında yeniden başlatılamaz, bu yüzden copytruncate kullanıyorum
  • Günlükleri, her gece olddirgünlük dosyalarını içeren dizine göre, her gece dönüyor .

Yanıtlar:


18

Bunun nedeni büyük olasılıkla dosyayı kısaltmanıza rağmen, dosyaya yazma işleminin son olarak hangi ofset olursa olsun yazmaya devam etmesidir. Yani, logrotate'in dosyayı kesmesi, boyut sıfır olması, işlemin dosyaya tekrar yazması, bıraktığı ofsette devam etmesi ve şimdi kesildiğiniz noktaya kadar NULL baytlı bir dosyanız var ve yeni giriş günlüğüne yazılır.

od -c kesilen + ani büyümeden sonra, aşağıdaki satırlarda üretilen çıktı:

0000000  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
*
33255657600  \0   C   K   B   -   s   e   r   v   e   r       [   h   t   t
33255657620 <more log output>

Bu, 0 ile 33255657600 arasındaki uzaklıktan dosyanızın boş baytlardan ve sonra bazı okunaklı verilerden oluştuğunu belirtir. Bu duruma ulaşmak, tüm bu boş baytları yazmak için gereken süreyi almaz. Ext {2,3,4} dosya sistemleri seyrek dosyalar adı verilen bir şeyi destekler, bu nedenle hiçbir şey içermeyen bir dosyanın bölgesini geçerseniz, bu bölgenin boş bayt içerdiği varsayılır ve yer kaplamaz disk üzerinde. Bu boş baytlar aslında yazılmayacaktır, sadece orada olduğu varsayılır, bu nedenle 0 ila 3.5GB'a gitmek için gereken zaman çok fazla zaman almaz. (Gibi bir şey yaparak geçen süreyi test edebilirsiniz dd if=${HOME}/.bashrc of=largefile.bin seek=3432343264 bs=1, bu birkaç milisaniyede 3GB'ın üzerinde bir dosya oluşturmalıdır).

ls -lsGünlük dosyalarınızı kesildikten ve tekrar ani bir büyümeden sonra çalıştırırsanız , şimdi satırın başlangıcında gerçek boyutu (diskte işgal edilen bloklarda) temsil eden ve muhtemelen büyüklük sırası olan bir sayı rapor etmelidir. tarafından bildirilen boyuttan daha küçük ls -l.


Sanmıyorum - saniyeler içinde, günlük dosyası 0 bayttan 3,5 GB'a gider. Logrotate'in tamamlanması için gereken toplam süre yaklaşık 5 dakikadır. Günlük dosyaları bu kadar hızlı yazılmaz VE boyut her zaman orijinal boyuttadır, bu da çok rastlantısal görünüyor.
drewrockshard

Bunu doğrulamanın kolay bir yolu olmalı, dosyayı inceleyin ve içinde gerçekten bir şey olup olmadığını görün. Od -c dosya adını çalıştırarak başlayın | head -n 100. Muhtemelen birkaç satırda bir kamyon dolusu boş bayt artı en son günlük girişleri olduğunu söyleyecektir.
Kjetil Joergensen

Bu durumda, cat / dev / null> /var/log/mylogfile.log dosyasının, copytruncate'te yerleşik logrotate kullanmak yerine bu sorunu çözecek şekilde kesip kesmediğini test edebilir miyiz?
mtinberg

2
Sorun, dosyanın kısaltılma biçiminde değil, sorun programın günlük dosyasını nasıl yazdığıyla ilgilidir. Günlük dosyasının uygun bir yaklaşım olması için kesilmesi için, programın günlük dosyasına yazmayı bir şekilde 0 konumuna getirmeniz gerekir. Seyrek dosyaları desteklemeyen bir dosya sisteminin bu kadar güvenilir olmamasına rağmen, şu anda bunu test etmenin bir yolu yok.
Kjetil Joergensen

1
Bu son cevap aslında daha mantıklıydı ve düzeltme muhtemelen uygulamayı yeniden başlatmak olacak.
drewrockshard

2

Ben son derece Kjetil isabet etti emindir. Drew, açıklamasından henüz ikna olmayabilirsiniz ama söylediklerini dikkatlice okumanızı tavsiye ediyorum.

Kabul ederseniz, düzeltme, günlükler döndürüldüğünde uygulamanızı durdurup yeniden başlatmaktır veya günlük çıktısını araca bir boru yoluyla beslediğiniz ve araç ile ilgilenen apache'nin "rotatelogs" gibi bir araç kullanmaktır. günlük dosyasını sık sık döndürme. Örneğin, apache örneklerimden biri aşağıdakilerle günlüğe kaydediyor:

ErrorLog "|/usr/sbin/rotatelogs /www/logs/error_log 604800"

Bu, adların olduğu çok sayıda günlük dosyasına neden olur

-rw-r--r--    1 root     root         4078 Dec 21 01:04 error_log.1292457600
-rw-r--r--    1 root     root         4472 Dec 29 08:41 error_log.1293062400
-rw-r--r--    1 root     root        78630 Jan  4 12:57 error_log.1293667200
-rw-r--r--    1 root     root        15753 Jan 12 01:10 error_log.1294272000

apache yeniden başlatılmadan görünmek; Ondan sonra bunları manuel olarak sıkıştırabilirim. Döndürmenin her hafta, her 604800 saniyede bir nasıl yapıldığına dikkat edin rotatelogs.

Uygulamayı durduramaz ve yeniden başlatamazsanız ve bir kanal üzerinden oturum açamazsa, gerçek bir sorununuz olduğunu düşünüyorum. Belki başkalarının önerileri olacaktır.


0

tüm logrotat gönderebilirseniz gerçekten harika olurdu.

Neden kill -HUP'u kullanmaya çalışıyorsunuz? (Klasik yeniden yükleme yeniden başlatılmıyor ) yöntemi.

Ayrıca ... lsof dosyaya kimin eriştiğini kontrol edin .


Kullanamıyorum kill -HUPbu uygulama herhangi bir şekilde dokundu edilemez - bu benim yaptığım o hassas bir uygulama değil (ben bile onu yönetmek değil - Ben sadece OS tarafını yönetmek) kendi Bunu logrotations yapmak gerekiyor bu yüzden yol.
drewrockshard

1
Üzgünüz, orijinal mesaj erken gönderildi, işte orijinal mesajımın geri kalanı: Bu sabah sisteme giriş yaptım ve programlanan oturum açma /etc/cron.dailyişlemi başlatıldıktan sonra dosya normale döndü . Herkes için soru: Logrotate betiğinin logrotate'i manuel olarak çalıştırmaktan farklı yaptığı bir şey var mı? Logrotate script'im tam anlamıyla benziyor /usr/sbin/logrotate /etc/logrotate.conf. Bu oldukça şaşırtıcı.
drewrockshard

-1

Bu dosyaya yazan komut dosyalarınızdan oluşturma anlamına gelen ">" yerine ekleme anlamına gelen ">>" ifadesini kullanmanız yeterlidir. Aynı sorunu yaşadım ve betiğime append kullanarak düzelttim.

SomeScript.sh >> output.txt

Umarım daha açıktır.


Günlük dosyasına yazmanın >bir komut dosyasından yapıldığına dair bir gösterge yoktur . Üstelik bu cevap kafa karıştırıcıdır çünkü senaryolar arasında >ve >( )senaryolar arasında büyük bir fark vardır . Son olarak, yazmayı yapan kod güncellenirse, sadece yeni bir günlük dosyasına yazmaya başladıktan sonra daha iyi olur logrotate.
kasperd

Cevabımı daha net olacak şekilde düzenliyorum.
user578558
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.