günlük dosyası yap


22

/ Var / log / içindeki bazı verileri, bazı kütüphane işlevleriyle ya da linux’deki c dilinde sistem çağrısı yardımıyla korumak için bir günlük dosyası oluşturmanın bir yolu var mı? Ayrıca log yazmak ve işlemek için izlememiz gereken standartları bilmek istiyorum. Teşekkürler


Lütfen programlama sorularının genellikle konu dışı olduğunu unutmayın; Onlara Stack Overflow'ta sormalısınız . API'nin açıklaması burada tamam ancak C veya başka bir programlama dilinde nasıl kullanılacağına ilişkin açıklamalar normalde Stack Overflow'a aittir.
Gilles 'SO- kötülük olmayı'

Yanıtlar:


31

Bir C programından giriş yapmanın standart yolu syslog.

Başlık dosyasını ekleyerek başlayın:

#include <syslog.h>

Daha sonra programınızın başında, syslog’u aşağıdakileri arayarak yapılandırmanız gerekir openlog:

openlog("programname", 0, LOG_USER);

İlk argüman, her mesajın başında otomatik olarak eklenen tanımlama veya etikettir. Programınızın adını buraya yazın.

İkinci argüman, kullanmak istediğiniz veya 0normal davranış için olan seçeneklerdir . Seçeneklerin tam listesi içinde man 3 syslog. Yararlı bulabileceğiniz bir tanesi LOG_PIDde, syslog'un işlem kimliğini günlük mesajına kaydetmesini sağlayan şeydir.

Ardından, bir günlük mesajı yazmak istediğinizde, aşağıdakileri ararsınız syslog:

syslog(LOG_INFO, "%s", "Message");

İlk argüman önceliktir. Gelen öncelik aralıkları DEBUG(en önemli) için EMERG(yalnızca acil durumlar için) DEBUG, INFOve ERRen olağan olarak kullanılanlardır. man 3 syslogSeçenekleriniz için bakınız .

İkinci ve üçüncü argümanlar tıpkı printf gibi bir biçim ve bir mesajdır.

Bunun göründüğü günlük dosyası, sistem günlüğü ayarlarınıza bağlıdır.

Varsayılan bir kurulumla muhtemelen gider /var/log/messages.


Aralığındaki olanaklardan birini kullanarak özel bir günlük dosyası LOG_LOCAL0oluşturabilirsiniz LOG_LOCAL7.

Bunları değiştirerek kullanıyorsunuz:

openlog("programname", 0, LOG_USER);

için

openlog("programname", 0, LOG_LOCAL0);

veya

openlog("programname", 0, LOG_LOCAL1);

vb.

ve buna karşılık gelen bir girdi eklemek /etc/syslog.conf, örneğin

local1.info /var/log/programname.log

ve syslog sunucusunun yeniden başlatılması, örneğin

pkill -HUP syslogd

Yukarıdakilerin bir .infokısmı , (hata), (kritik), vb. Dahil olmak üzere , ancak önemli olmayan local1.infotüm iletilerin kaydedileceği anlamına gelir .INFOINFONOTICEERRCRITDEBUG


Veya, varsa , örneğin rsyslogbir özellik tabanlı filtre deneyebilirsiniz

:syslogtag, isequal, "programname:"    /var/log/programname.log

Sislog etiketi bir ":" içermelidir.

Veya, yazılımınızı başkalarına dağıtmayı planlıyorsanız, kullanmaya LOG_LOCALveya bir rsyslogfiltreye güvenmek iyi bir fikir olmayabilir .

Bu durumda kullanmanız LOG_USER(normal bir programsa) veya LOG_DAEMON(bir sunucuysa), başlangıç ​​iletilerinizi ve hata iletilerinizi kullanarak yazmanız gerekir syslog, ancak tüm günlük iletilerinizi dışında bir dosyaya yazın syslog. Örneğin, Apache HTTPd oturum açar /var/log/apache2/*ya da /var/log/httpd/*, normal open/ fopenve write/ printfcalls kullanarak varsayırım .


Teşekkürler.Bu oldukça yararlı bir bilgidir. Ancak log_local0-7 seçeneğiyle ilgili daha fazla bilgi verir misiniz? Örneğin Verilerimi (günlük satırında <self> kelimesi olan) self.log dosyasına yazmak istiyorum. ve bazı diğer dosyalara giriş yapar.
Sushant Jain

@Sushant Jain: Hangi Linux dağıtımını ve sürümünü hedefliyorsunuz? Eski syslog (ksyslogd) veya rsyslog var mı? rpm -qa | grep syslogya dpkg -l '*syslog*'da muhtemelen hangisini söyleyeceğim.
Mikel

Açıkçası, log_local * açıkçası, sysklogdsyslog yazılımı için şehirdeki tek oyundu. Günümüzde yazılım syslog-ng, hizmet ve seviyeden çok, daha fazla gelişmiş filtreleme yeteneğine sahip rsyslogve dsyslogvar ve var.
Shadur

Çok teşekkürler. Benim sorunum çözüldü. Günlük dosyasında depolanan verileri ayrıştırma hakkında bir sorgu daha var. Bunu yapmanın iyi bir yolu var mı. Aslında bir sistem istatistik aracı yapmaya çalışıyorum. Bu yüzden ona ihtiyacım var.
Sushant Jain

@Sushant Jain. Yardım etmekten memnun oldum. Lütfen günlük ayrıştırma sorunuzu ayrı bir soru olarak gönderin, böylece insanlar bunu görebilir ve doğru cevaplar verebilir.
Mikel

2

Sistem kayıt programı etkin olan herhangi bir kişiye veri göndermek #include <syslog.h>için syslog()işlevleri kullanmak isteyeceksiniz .

Buradaki man sayfasına bakın .


syslog () işlevi, verileri / var / log / syslog dosyasına yazar. oysa kendi dosyamda günlükleri yazmak istiyorum.
Sushant Jain

As aşağıda Mikel açıklıyor Eğer syslog sen Program anlamak öyle bir şekilde günlük iletilerini etiketleyebileceğiniz ardından yapılandırmak günlüğü programlarınızı farklı bir dosyaya mesajları oturum yazmak için.
Caleb

1

Pek çok ihtimal var, planın nedir? Sadece komut satırından giriş yapmak için bir seçeneğe mi ihtiyacınız var? Bir göz atın logger( bsdutils dahil ). Sadece yaz:

usr@srv % logger test

ve şuna benzer bir şey kaydedecek /var/log/syslog:

Apr 25 07:55:15 localhost usr: test

ayrıca bakınız man logger. Günlük tutma arka planınıza bağlı olarak, bu mesajları belirli dosyalara göre sıralayabilir veya önceliğe göre filtreleyebilirsiniz.

Farklı programlama dilleri için de bazı çözümler var, bu yüzden lütfen bana ne yapmak istediğinizi söyleyin ;-)


Aslında c dilini kullanarak yapmak istiyorum. ve mikel post'unda bilgi var.
Sushant Jain

1

Program adına göre filtreleme, yukarıda belirtilenlerden farklı bir şekilde yazılmıştır rsyslog;

if $programname == 'popa3d' then /var/log/popa3d.log

Daha fazla bilgi için buraya bakın

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.