Bir günlük dosyasını bir tür dairesel arabelleğe dönüştürme


22

Millet, günlük dosyasını dairesel bir tampon görevi görecek bir * nix çözümü var mı? Örneğin, günlük dosyalarının en fazla 1 GB veri depolamasını ve sınıra ulaşıldığında eski girişleri atmasını istiyorum.

Bütün bunlar mümkün mü? Bir günlük dosyasının bir tür özel cihaza dönüştürülmesi gerektiğine inanıyorum ...

PS Misc logrotating araçlarının farkındayım ama ihtiyacım olan bu değil. Logrotating çok sayıda G / Ç gerektirir, genellikle "çalışma zamanı" çözümüne ihtiyaç duyduğumda günde bir kez olur.


3
Günlük rotasyonunun neden çok sayıda G / Ç'ye ihtiyacı olacağını düşündüğünüzden emin değilim. 10 günlük dosyasını döndürmek, 10 yeniden adlandırma işlemi ve hizmetin bir HUP'udur. Tam olarak öldürücü bir operasyon değil ... Ve probleminize standart çözüm :)
pehrs

2
Biri HUP ile iyi oynatılmayan bir komut dosyası / yürütülebilir olabilir.
Scott

1
Bu, sorunuz için başka bir kullanım durumu sağlamaktır. Şeytan bir müzik çalarım var. Sadece birkaç satır uzunluğunda bir günlük istiyorum, böylece neyin oynandığını ve ondan önce neyin oynandığını görebiliyorum. A tail -f somefilebunu yapardı. Sadece döndürülmüş günlükleri denedim ve tail -fbunlarla çalışmıyor.
Vorac19

Yanıtlar:


14

Linux'un çekirdek halka arabelleği vardır. Sen kullanabilirsiniz dmesgetmek göstermek .

Ya da burada istediğinizi yapan bir Linux çekirdek modülü var.

Emlog nedir?

emlog, bir işlemden en yeni (ve yalnızca en son) çıktıya erişmeyi kolaylaştıran bir Linux çekirdek modülüdür. Bir depolama dosyasındaki "tail -f" gibi çalışır, ancak gereken depolama alanı hiçbir zaman büyümez. Bu, tam günlük dosyalarını tutmak için yeterli bellek veya disk alanı bulunmayan gömülü sistemlerde yararlı olabilir, ancak en son hata ayıklama mesajlarına bazen ihtiyaç duyulur (örneğin, bir hata gözlendikten sonra).

Emlog çekirdek modülü basit karakter aygıt sürücüsünü uygular. Sürücü, sonlu, dairesel bir tamponu olan adlandırılmış bir boru gibi davranır. Tamponun boyutu kolayca yapılandırılabilir. Arabelleğe daha fazla veri yazıldıkça, en eski veriler atılır. Bir emlog cihazından okunan bir işlem önce mevcut arabelleği okuyacak, daha sonra "tail -f" kullanarak bir günlük dosyasını izlemeye benzer şekilde yeni metni yazıldığı gibi görecektir. (Bir işlemin yeni verileri beklemek için bloğun mevcut içeriğini engellemeden alması gerekiyorsa, engellemeyen okumalar da desteklenir.)


1
Bağlantı için teşekkürler! BTW, emlog ana sayfasında muhtemelen benim için daha uygun bir çözüm olan ulogbufd bağlantısı var.
pachanga

Emlog çekirdek modülü şimdi github korunur: github.com/nicupavel/emlog
dbernard

4

Aklıma gelen en yakın şey RRDTools, ama muhtemelen aradığınız şey değil. Başka bir çözüm, günlük dosyasını izlemek (örneğin her saniye veya inotify ile Linux'ta), örneğin aşağıdaki gibi bir komut dosyası yazmanızdır:

while :; do
  if [[ $(stat -c %s $FILE) -gt 10000 ]]; then
    # rotate the log
  fi
  sleep 1
done

inotify ile:

while :; do
  if inotifywait [some options] $FILE; then
    # check size and rotate the file
  fi
done

RRDtool'dan bahsettiği için +1, halka veri yapısı günlüğünün gerçek bir örneği.
Cory J

İnotifywait kabuk komut kullanımını gösteren örneğin teşekkürler
pachanga

4

Sen kullanabilirsiniz multilog djb en daemontools gelen. Sen boru log çıkışı içine o. Evet, günlük dönüşüdür, ancak dönüşler basitçe:

ln current $tai64nlocaltimestamp

Hangi, hemen hemen her modern linux dosya sisteminde süper hızlı bir işlemdir. Kaç günlük dosyası istediğinizi, ne kadar büyük olmasını istediğinizi belirleyebilirsiniz. 10 x 1024mb dosya oluşturun ve 1GB halka arabelleğe sahip olacaksınız.

Otomatik döndürme nedeniyle, bunun çoklu günlük örneği başına bir kaynak olduğunu unutmayın. Ancak netcat ile basit bir sargı yazarak veya elle bu sorunu çözebilirsiniz.


Bahşiş için teşekkürler! Kesinlikle multilog'da da olacağım.
pachanga

1

Bir FIFO kanalı yapabilir ve daha sonra veritabanına ekleyen bir komut dosyası kullanarak okuyabilirsiniz. Sayaç 1.000'e ulaştığında, veritabanına eklenen kimlik numarasını yeniden başlatın. Elbette boyut için işe yaramaz, ama bunu örnek olarak kullandınız, bu yüzden bunun teorik bir soru olduğunu varsayıyorum.


1

İlginç soru; bunu genellikle bir tasarım olarak görmezsiniz. Geçmişi kaydetmek için hafifçe benzer bir tekniği kullanan bir programım var, ancak ikili bir format kullanıyor. 'Günlük dosyası', tümü makineden bağımsız biçimde düzenlenmiş dört bölümden oluşur:

  1. Kullanılan listede ve boş listedeki sihirli numarayı ve (maksimum) girdi sayısını, bir sonraki geçmiş girdisinin sıra numarasını, kullanılan listedeki gerçek girdi sayısını, boş listedeki gerçek girdi sayısını içeren bir başlık ve dosyanın uzunluğu (her biri 4 bayt).
  2. Kullanılan liste, her girdi ofset ve uzunluk verir (her girdinin her bir kısmı için 4 bayt).
  3. Ücretsiz liste, her giriş kullanılan liste girişine benzer.
  4. Ana veriler, her geçmiş kaydı bir boş sonlandırıcı baytı tarafından sonlandırılan bitişik bir bayt kümesinden oluşur.

Yeni bir kayıt tahsis edildiğinde, serbest listede boşluk varsa, oradaki bir girişin üzerine yazar (mutlaka hepsini kullanmanıza gerek yoktur - bu durumda parça serbest listede kalır). Serbest listede yer olmadığında, sonunda yeni alan ayrılır. Eski bir kayıt döndüğünde, alanı serbest listeye taşınır ve bitişikteki serbest kayıtlarla birleştirilir. Kayıtların birçok satıra yayılabilmesi için SQL deyimlerini işlemek üzere tasarlanmıştır. Bu kod, belirtilen sayıda kayıt üzerinde çalışır. Dosyanın boyutunu sınırlandırmaz (ancak bunu yapmak zor olmaz).

Ana kod geçmişi kodu, SQLCMD programının kaynağından temin edilebilen history.c ve history.h olmak üzere iki dosyadadır (benim sürümüm, Microsoft'un değil; benimki Microsoft'tan on yıl veya daha önce var olan) Uluslararası Informix Kullanıcı Grubu Yazılım Arşivi . Ayrıca bir geçmiş dosyası döküm programı (histdump.c) ve bir geçmiş test cihazı (histtest.ec - ESQL / C olduğunu iddia ediyor, ancak kendisi gerçekten C kodu; çağırdığı destek işlevlerinden biri bazı Informix ESQL / C kullanıyor kütüphane fonksiyonları). Informix ESQL / C kullanmadan denemek isterseniz benimle iletişime geçin - profilime bakın. Tasarım ortamının dışında tarih yazısını derlemesi için bazı önemli değişiklikler var, ayrıca bir makefile'a ihtiyacınız var.


0

Pehrs'ın sorunuza yaptığı yorumu kabul ediyorum. Günlük döndürme o kadar da zor değil. İsterseniz, günlük dosyanızı düzenli aralıklarla kontrol etmek için logrotate veya başka bir komut dosyası ayarlayabilirsiniz. Dosyanızın boyut olarak 1 GB'a ulaştığını algıladığında, yalnızca bir G / Ç'nin yanına götüren bir yeniden adlandırma gerçekleştirir. Yeniden adlandırma sırasında işlem günlük dosyasını yazmaya devam eder. Günlük döndürücü sonra (sizin cini senin Syslog'un bir HUP gönderebilir edilir orijinal dosya yolunu yeniden açmak için bu iyi yazılmış ise, o HUP sinyali desteklemelidir Değilse ...? Doğru, syslog aracılığıyla günlüğü) . Bu noktada, orijinal yoldaki yeni bir dosyaya yazmaya başlar ve döndürülmüş sürümü silebilirsiniz.

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.