buat file log

22

Apakah ada cara untuk membuat file log untuk mempertahankan beberapa data di / var / log / dengan bantuan beberapa fungsi pustaka atau system call dalam bahasa c di linux. Dan saya juga ingin tahu standar yang harus kita ikuti untuk menulis dan memproses log. Terima kasih

Sushant Jain
sumber
Harap perhatikan bahwa pertanyaan pemrograman biasanya di luar topik di sini; Anda harus bertanya pada mereka di Stack Overflow . Penjelasan tentang API tidak masalah di sini, tetapi penjelasan tentang bagaimana menggunakannya dalam bahasa pemrograman C atau lainnya biasanya berada pada Stack Overflow.
Gilles 'SO- berhenti bersikap jahat'

Jawaban:

31

Cara standar untuk log dari program C adalah syslog.

Mulai dengan memasukkan file header:

#include <syslog.h>

Kemudian di awal program Anda, Anda harus mengkonfigurasi syslog dengan memanggil openlog:

openlog("programname", 0, LOG_USER);

Argumen pertama adalah identifikasi atau tag, yang secara otomatis ditambahkan pada awal setiap pesan. Masukkan nama program Anda di sini.

Argumen kedua adalah opsi yang ingin Anda gunakan, atau 0untuk perilaku normal. Daftar lengkap opsi ada di man 3 syslog. Salah satu yang mungkin berguna bagi Anda LOG_PID, yang membuat syslog juga merekam proses id dalam pesan log.

Kemudian, setiap kali Anda ingin menulis pesan log, Anda menelepon syslog:

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

Argumen pertama adalah prioritas. Rentang prioritas dari DEBUG(paling tidak penting) ke EMERG(hanya untuk keadaan darurat) dengan DEBUG, INFO, dan ERRyang paling umum digunakan. Lihat man 3 syslogopsi Anda.

Argumen kedua dan ketiga adalah format dan pesan, seperti printf.

File log ini muncul tergantung pada pengaturan syslog Anda.

Dengan pengaturan default, mungkin masuk ke /var/log/messages.


Anda dapat mengatur file log khusus dengan menggunakan salah satu fasilitas dalam kisaran LOG_LOCAL0ke LOG_LOCAL7.

Anda menggunakannya dengan mengubah:

openlog("programname", 0, LOG_USER);

untuk

openlog("programname", 0, LOG_LOCAL0);

atau

openlog("programname", 0, LOG_LOCAL1);

dll.

dan menambahkan entri yang sesuai /etc/syslog.conf, misalnya

local1.info /var/log/programname.log

dan memulai kembali server syslog, mis

pkill -HUP syslogd

The .infobagian dari local1.infoatas berarti bahwa semua pesan yang INFOatau lebih penting akan login, termasuk INFO, NOTICE, ERR(error), CRIT(kritis), dll, tapi tidak DEBUG.


Atau, jika sudah rsyslog, Anda bisa mencoba filter berbasis properti , mis

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

Syslogtag harus mengandung ":".

Atau, jika Anda berencana mendistribusikan perangkat lunak Anda kepada orang lain, mungkin itu bukan ide yang baik untuk mengandalkan penggunaan LOG_LOCALatau rsyslogfilter.

Dalam hal ini, Anda harus menggunakan LOG_USER(jika ini adalah program normal) atau LOG_DAEMON(jika itu server), menulis pesan startup Anda dan menggunakan pesan kesalahan syslog, tetapi tulis semua pesan log Anda ke file di luar syslog. Sebagai contoh, Apache HTTPd mencatat /var/log/apache2/*atau /var/log/httpd/*, saya berasumsi menggunakan panggilan reguler open/ fopendan write/ printf.

Mikel
sumber
Terima kasih. Ini info yang cukup berguna. Tapi tolong jelaskan lebih lanjut tentang opsi log_local0-7. Untuk misalnya. Saya ingin menulis data saya (yang memiliki kata <self> di baris log) di file self.log. dan beberapa log di file lain.
Sushant Jain
@Sushant Jain: Distribusi dan versi Linux apa yang Anda targetkan? Apakah Anda memiliki syslog lama (ksyslogd) atau rsyslog? rpm -qa | grep syslogatau dpkg -l '*syslog*'mungkin akan memberitahu Anda yang mana.
Mikel
log_local *, sejujurnya, adalah peninggalan dari masa lalu ketika sysklogditu satu-satunya permainan di kota untuk perangkat lunak syslog. Saat ini perangkat lunak suka syslog-ng, rsyslogdan dsyslogada dan memiliki kemampuan penyaringan yang jauh lebih canggih dari sekadar layanan / level.
Shadur
Terima kasih banyak. Masalah saya sudah terpecahkan. Saya punya satu pertanyaan lagi tentang parsing data yang disimpan dalam file log. Apakah ada cara yang baik untuk melakukannya? Sebenarnya saya sedang mencoba membuat alat statistik sistem. Jadi saya membutuhkannya.
Sushant Jain
@ Sushant Jain. Senang untuk membantu. Silakan kirim pertanyaan parsing log Anda sebagai pertanyaan terpisah sehingga orang dapat melihatnya dan memberikan jawaban yang tepat.
Mikel
2

Anda ingin #include <syslog.h>, kemudian menggunakan syslog()fungsi untuk mengirim data ke program logging sistem apa pun yang aktif.

Lihat halaman manual di sini .

Caleb
sumber
syslog () berfungsi menulis data ke / var / log / syslog. sedangkan saya ingin menulis log di file saya sendiri.
Sushant Jain
Seperti yang dijelaskan oleh Mikel di bawah ini, Anda dapat menandai pesan log Anda sedemikian rupa sehingga syslog memahami program apa Anda, kemudian mengkonfigurasi syslog untuk menulis pesan log program Anda ke file yang berbeda.
Caleb
1

Ada banyak kemungkinan, apa rencanamu? Apakah Anda hanya perlu opsi untuk masuk dari baris perintah? Lihatlah logger(termasuk dalam bsdutils ). Ketik saja:

usr@srv % logger test

dan itu akan mencatat sesuatu seperti ini untuk Anda /var/log/syslog:

Apr 25 07:55:15 localhost usr: test

lihat juga man logger. Bergantung pada daemon logging Anda, Anda dapat mengurutkan pesan-pesan ini ke file tertentu atau memfilternya berdasarkan prioritas.

Ada juga beberapa solusi untuk berbagai bahasa pemrograman, jadi tolong beri tahu saya apa yang ingin Anda lakukan ;-)

binfalse
sumber
Sebenarnya saya ingin melakukannya menggunakan bahasa c. dan saya sudah mendapat info di posting mikel.
Sushant Jain
1

Pemfilteran menurut nama program ditulis berbeda dari yang disebutkan di atas, untuk versi terbaru rsyslog(versi pada mesin saya adalah 5.8.6) seperti yang ditunjukkan di bawah ini:

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

Untuk info lebih lanjut, lihat di sini

Suresh
sumber