Günlükleri temizlemenin uygun bir yolu var mı?


64

Günlükleri genel olarak temizlemenin uygun bir yolu olup olmadığını merak ediyordum.

Ubuntu'da yeniyim ve Postfix'i kurmaya çalışıyorum. Söz konusu günlük /var/log/mail.log. İçine girip tüm çizgileri silmekten ve saklamak yerine, onu temizlemenin doğru bir yolu olup olmadığını merak ediyordum. Kütükleri temizleyip kaydettikten hemen sonra hataların derhal yazılmayacağını buluyorum.

Not: Postfix'i kurmakta zorlanıyorum ve tüm yolu aşağı kaydırmak yerine, bana yardımcı olacağı umuduyla günlükleri okumamı kolaylaştırıyorum.


2
Eğer sadece dosyanın sonunu görmek istiyorsanız kuyruk arkadaşınızdır. tail /var/log/mail.log, son 5 satırı görüntülemek için tail -f /var/log/mail.log, dosyanın sonuna yazılan tüm satırları görmek için.
user9517,

Yanıtlar:


79

Kullanabilirsiniz:

> /var/log/mail.log

Bu dosyayı düzenlemek zorunda kalmadan günlüğü kesecek. Ayrıca, alanı geri almanın güvenilir bir yolu. Bazen insanlar kütükte rm kullanma ve ardından dosya adını yeniden oluşturma hatası yaparlar, eğer başka bir işlem dosya açılmışsa, o zaman bu işlem üstesinden gelene kadar alanı geri alamazsınız ve izinlerini karıştırırsınız.

Ayrıca, günlüğün içeriğini izliyorsanız, tailkomutu kullanmak isteyebilirsiniz :

tail -f /var/log/mail.log

Ctrl-C uçları kıracak.


2
/bin/csh(FreeBSD için ortaktır) bunu "Geçersiz boş komut" ile kurtarır, bu arada zsh(popüler bashoyuncu değişikliği ) EOF'u beklerdi. Bakınız serverfault.com/a/381380/67675
poige

nasıl programlayabilirim? >crontab içine sözdizimi koymak , bir sözdizimi olarak
algılayamayacağından, çalışmaz

26

Evet, uygun bir yol var: Günlükleri hiç temizlemiyorsunuz . Sen döndürmek onları. Döndürme, günlük çıktısının aynı isim altında, bir önceki N günlük dosyası ile ilgili bir N dosya ismi altında tutulan yeni bir dosyaya geçirilmesini içerir.

Birinin günlükleri nasıl döndürdüğü, birinin onları ilk sırada nasıl yazdığına bağlıdır. Bu, gözden kaçan bir nokta. Buradaki cevapların bazıları, en azından bazı günlükleme programlarının günlük dosyası için açık bir dosya tanımlayıcısı bulundurduğundan bahseder, bu nedenle sadece dosyayı silmek, alanı boşaltamaz veya çıktıyı bile yeni bir günlük dosyasına geçirmez.

Günlük dosyasını yazma programı ise multiloggelen daemontoolspaketin hiçbir manuel komut, hayır - örneğin, o zaman hiç günlükleri döndürmek için bir şey yapmayın cronişler. Basitçe multilog, log çıktısının bir dizine ait olduğunu ve o dizinde otomatik olarak döndürülmüş ve boyutlandırılmış bir N log dosyası seti tutacağını söyleyin .

Günlük dosyalarını yazma programı ise svlogdgelen runitpaketin başka örneğin ardından hemen aynı geçerlidir. Aracı bir dizinden noktadan başka hiçbir şey yapmıyorsunuz. Kendisi, bu dizinde otomatik olarak döndürülmüş ve boyutlandırılmış bir N günlüğü dosyası seti tutacaktır.

rsyslogGünlük dosyalarını yazmak için kullanıyorsanız , günlük programına belirli bir boyuta ulaştıktan sonra bir komut dosyasını çalıştırdıktan sonra günlük programına durması söylenebilir . Aslında günlük dosyasını yeniden adlandırmak ve toplam günlük kısıtlamalarına dayanarak eski günlük dosyalarını silmek için betiğin etini yazmanız gerekir, ancak en azından günlük programı dosyayı kapattı ve bu sırada günlük yazmayı duraklattı.

syslogdGünlükleri döndürmenin eski yolu, sysloging gibi programları günlüğe kaydetmeyi beklemekte ve burada başka bir cevapta logrotatebelirtildiği gibi araçlarla örneklenerek beklenmektedirdjangofan . Biri cron, günlük dosyalarını belirli aralıklarla yeniden adlandıran bir işi çalıştırır ve günlük tutma arka planını yeniden başlatır (altında çalışan herhangi bir arka plan denetleyicisini kullanarak). Bununla ilgili sorun elbette genel bir büyüklük sınırını zorlamamasıdır. Yavaş haftalarda kişi günlük N çok küçük günlük dosyaları alabilirken, yoğun günlerde kişi boyut sınırının çok üstünde olan 1 büyük günlük dosyası alabilir.

Daha sonra ve daha iyi gibi araçlar nedeni budur multilogve svlogddosya boyutu yapılandırma seçenekleri vardır ve aslında günlük dosyası elbette kendilerini boyutları kontrol edin. Dünya, günlükleri cronişlerle veya hatta bir logrotatearka plan programı kullanarak günlüğe kaydetmenin , boyutun yanlış olması için pencereler bıraktığını ve bu denetimlerin yapılması için uygun yerin ve böylece yönetici tarafından tanımlanan boyut sınırlarını zorladığını öğrendi. log dosyaları hiç açılmadıkları bölümü yutmaz, aslında dosyaları ilk sırada yazan programdadır.


Rysyslog'a gelince, kolayca, örneğin, YEAR, MONTH ve DAY gibi bir "model" ile tanımlanan dosya adlarına dayanacak şekilde yapılandırılabilir. Bu bir template(name="DYNmail" type="string" string="/var/log/%$YEAR%/%$MONTH%/%$DAY%/mail.log")yönergeye sahip olmak kadar kolaydır , ardından a if ($syslogfacility-text == 'mail') then -?DYNmail;TraditionalFormat. Bu şekilde, günlük döndürme işlemi en azından günlük başına tek bir dosya tamam olduğunda sorun değildir. Çok yüksek kütük kütükleri için (günde çoklu rotasyona ihtiyaç duyan), $HOURaynı zamanda.
Damiano Verzulli

13

Bunu da kullanabilirsiniz ..

truncate /opt/package/logs/*.log --size 0

Burada / opt / package / logs içindeki bütün log dosyaları boşalır.


Bunun eski cevaplardan daha iyi olabileceğini anlamıyorum.
kasperd

4
Bu aslında çok iyi bir cevap ve gerçekten de logfile kesmenin uygun bir yolu olup olmadığını doğrudan doğruya cevaplayan tek cevap. NASIL diğer cevaplardan daha iyidir, bunun günlük dosyasını SİLMEMESİ, içeriğini doğru bir şekilde sıfırlaması, bu nedenle bazı daemon'ların paniklemesine neden olan izin hatalarının ve eksik günlük dosyalarının bu durumda gerçekleşmemesidir.
hmedia1

11

Evet, linux için LogRotate adında bir araç var .


9
Sadece küçük bir düzeltme: bu bir servis değil, bu genellikle cron servisinden çalışan bir araçtır.
rvs

10

Kaydı silme sebebiniz boş alan açmaksa, içine yazılan programları kesmeden bunlara / dev / null değerini ekleyebilirsiniz. Onları asla silmeyin! bazı yazılımlar çalışmayı durdurarak veya bir sonraki yeniden başlatmaya kadar günlüğü tamamen yok sayarak şikayet edebilir

cat /dev/null > /path/to/logfile

# to empty all the logs in a directory
for i in /var/log/*; do cat /dev/null > $i; done

3
Günlük dosyalarını yinelemeli olarak temizlemek için:for i in $(find /var/log -type f); do cat /dev/null > $i; done
Iurie Malai

4

Kısa ve uyumlu içeriğin üzerine yazma: : > /dest/file

Ancak truncate (2) sistem çağrısı ve truncatebirçok * NIX'te ilgili kullanıcı alanı aracı da var.


1

Dosyayı temizlemeden önce saklamak istiyorsanız, şunları yapabilirsiniz:

cp /var/log/mail.log /var/log/mail.log.1 && echo -n "" > /var/log/mail.log

Günlükte belirli bir metni veya e-postayı aramak istiyorsanız grep kullanabilirsiniz. Posta kullanımıyla ilgili bazı grafikleri saklamak istiyorsanız, AWStats'ı kullanabilirsiniz.


1

İşte bunu nasıl yapıyorum ve bu sadece NGINX içindir, tüm günlük dosyalarında çalışmasını sağlamak için bunu kaldırabilirsiniz.

# Clear nginx logs.
# @usage delnginxlogs
function delnginxlogs() {
  echo "--------------- ⏲  Clearing logs... ---------------"

  # Clear logs.
  for i in /var/log/nginx/*; do cat /dev/null > $i; done

  echo "--------------- ⏲  Deleting .gz log files... ---------------"

  # Delete .gz files.
  find /var/log/nginx -type f -regex ".*\.gz$" -delete

  echo "--------------- 💯 DONE: NGINX logs cleared ... ---------------"
}

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.