ทำไฟล์บันทึก


22

มีวิธีใดบ้างในการสร้างล็อกไฟล์สำหรับเก็บรักษาข้อมูลบางอย่างใน / var / log / ด้วยความช่วยเหลือของฟังก์ชั่นไลบรารีบางอย่างหรือการเรียกระบบในภาษา c ใน linux และฉันต้องการทราบมาตรฐานที่เราควรทำตามเพื่อเขียนและประมวลผลบันทึก ขอบคุณ


โปรดทราบว่าคำถามทั่วไปเกี่ยวกับการเขียนโปรแกรมไม่ใช่หัวข้อที่นี่ คุณควรถามพวกเขาในกองมากเกิน คำอธิบายของ API นั้นใช้ได้ที่นี่ แต่คำอธิบายวิธีการใช้ใน C หรือภาษาการเขียนโปรแกรมอื่น ๆ มักจะเป็นของ Stack Overflow
Gilles 'ดังนั้น - หยุดความชั่วร้าย'

คำตอบ:


31

วิธีมาตรฐานในการเข้าสู่ระบบจากโปรแกรม C syslogคือ

เริ่มต้นด้วยการรวมไฟล์ส่วนหัว:

#include <syslog.h>

จากนั้นในช่วงต้นโปรแกรมของคุณคุณควรกำหนดค่า syslog โดยโทรopenlog:

openlog("programname", 0, LOG_USER);

อาร์กิวเมนต์แรกคือการระบุตัวตนหรือแท็กซึ่งจะถูกเพิ่มโดยอัตโนมัติเมื่อเริ่มต้นของแต่ละข้อความ ใส่ชื่อโปรแกรมของคุณที่นี่

อาร์กิวเมนต์ที่สองคือตัวเลือกที่คุณต้องการใช้หรือ0สำหรับพฤติกรรมปกติ man 3 syslogรายการเต็มรูปแบบของตัวเลือกอยู่ใน หนึ่งที่คุณอาจพบว่ามีประโยชน์คือLOG_PIDซึ่งทำให้ syslog ยังบันทึกรหัสกระบวนการในข้อความบันทึก

จากนั้นทุกครั้งที่คุณต้องการเขียนข้อความบันทึกคุณเรียกsyslog:

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

อาร์กิวเมนต์แรกคือลำดับความสำคัญ ช่วงที่มีความสำคัญจากDEBUG(สำคัญน้อย) ไปEMERG(เฉพาะสำหรับกรณีฉุกเฉิน) ด้วยDEBUG, INFOและERRถูกนำมาใช้กันมากที่สุด ดูman 3 syslogตัวเลือกของคุณ

อาร์กิวเมนต์ที่สองและสามเป็นรูปแบบและข้อความเช่นเดียวกับ printf

ไฟล์บันทึกใดที่ปรากฎขึ้นอยู่กับการตั้งค่า syslog ของคุณ

/var/log/messagesด้วยการติดตั้งเริ่มต้นก็อาจจะเข้าสู่


คุณสามารถตั้งค่าล็อกไฟล์ที่กำหนดเองโดยใช้หนึ่งของสิ่งอำนวยความสะดวกในช่วงการLOG_LOCAL0LOG_LOCAL7

คุณใช้พวกเขาโดยการเปลี่ยน:

openlog("programname", 0, LOG_USER);

ไปยัง

openlog("programname", 0, LOG_LOCAL0);

หรือ

openlog("programname", 0, LOG_LOCAL1);

เป็นต้น

และการเพิ่มรายการที่สอดคล้องกับ/etc/syslog.confเช่น

local1.info /var/log/programname.log

และรีสตาร์ทเซิร์ฟเวอร์ syslog เช่น

pkill -HUP syslogd

.infoส่วนหนึ่งของlocal1.infoวิธีการดังกล่าวข้างต้นว่าข้อความทั้งหมดที่อยู่INFOหรือมีความสำคัญมากขึ้นจะลงทะเบียนรวมทั้งINFO, NOTICE, ERR(ข้อผิดพลาด) CRIT(ที่สำคัญ) ฯลฯ DEBUGแต่ไม่ได้


หรือถ้าคุณมีrsyslogคุณสามารถลองใช้ตัวกรองตามคุณสมบัติเช่น

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

syslogtag ควรมี ":"

หรือถ้าคุณวางแผนที่จะแจกจ่ายซอฟต์แวร์ของคุณให้ผู้อื่นอาจไม่ควรใช้LOG_LOCALหรือrsyslogตัวกรอง

ในกรณีที่คุณควรใช้LOG_USER(ถ้ามันเป็นโปรแกรมปกติ) หรือLOG_DAEMON(ถ้ามันเป็นเซิร์ฟเวอร์) เขียนข้อความเริ่มต้นของคุณและข้อความผิดพลาดโดยใช้แต่เขียนทั้งหมดของข้อความเข้าสู่ระบบของคุณไปยังนอกไฟล์syslog syslogตัวอย่างเช่น Apache HTTPd เข้าสู่ระบบ/var/log/apache2/*หรือ/var/log/httpd/*ฉันถือว่าใช้ปกติopen/ fopenและwrite/ printfโทร


ขอบคุณข้อมูลนี้มีประโยชน์มาก แต่คุณช่วยอธิบายเพิ่มเติมเกี่ยวกับตัวเลือก log_local0-7 ได้ไหม สำหรับเช่น ฉันต้องการเขียนข้อมูลของฉัน (ที่มี <elf> คำในบรรทัดบันทึกข้อมูล) ในไฟล์ self.log และบางบันทึกในไฟล์อื่น
Sushant Jain

@Sushant Jain: คุณมีการแจกจ่ายและเวอร์ชั่นใดบน Linux? คุณมี syslog (ksyslogd) หรือ rsyslog เก่าหรือไม่? rpm -qa | grep syslogหรือdpkg -l '*syslog*'อาจจะบอกคุณว่า
มิเคล

log_local * ตรงไปตรงมาเป็นโบราณวัตถุจากหลังเมื่อsysklogdเป็นเกมเดียวในเมืองสำหรับซอฟต์แวร์ syslog ซอฟแวร์ในปัจจุบันเช่นsyslog-ng, rsyslogและdsyslogที่มีอยู่และมีความสามารถในการกรองมากความซับซ้อนมากขึ้นกว่าบริการเพียง / ระดับ
Shadur

ขอบคุณมาก. ปัญหาของฉันได้รับการแก้ไขแล้ว ฉันมีคำถามเพิ่มเติมเกี่ยวกับการแยกวิเคราะห์ข้อมูลที่เก็บไว้ในล็อกไฟล์ มีวิธีที่ดีในการทำเช่นนี้หรือไม่ ที่จริงฉันพยายามสร้างเครื่องมือสถิติระบบ ดังนั้นฉันต้องการมัน
Sushant Jain

@Santant เชน ดีใจที่ได้ช่วยเหลือ โปรดโพสต์คำถามแยกวิเคราะห์บันทึกของคุณเป็นคำถามแยกต่างหากเพื่อให้ผู้คนเห็นและให้คำตอบที่เหมาะสม
Mikel

2

คุณจะต้องการ#include <syslog.h>จากนั้นใช้syslog()ฟังก์ชั่นในการส่งข้อมูลไปยังโปรแกรมการบันทึกของระบบที่ใช้งานอยู่

ดูหน้าคนที่นี่


syslog () ฟังก์ชันเขียนข้อมูลลงใน / var / log / syslog ในขณะที่ฉันต้องการเขียนบันทึกในไฟล์ของฉันเอง
Sushant Jain

ดังที่Mikel อธิบายไว้ด้านล่างคุณสามารถแท็กข้อความบันทึกของคุณในแบบที่ syslog เข้าใจว่าคุณเป็นโปรแกรมอะไรจากนั้นกำหนดค่า syslog ให้เขียนข้อความบันทึกโปรแกรมลงในไฟล์อื่น
คาเลบ

1

มีความเป็นไปได้มากมายแผนของคุณคืออะไร คุณต้องการตัวเลือกในการเข้าสู่ระบบจากบรรทัดคำสั่งหรือไม่ ดูที่logger(รวมอยู่ในbsdutils ) เพียงพิมพ์:

usr@srv % logger test

และมันจะบันทึกบางอย่างเช่นนี้กับคุณ/var/log/syslog:

Apr 25 07:55:15 localhost usr: test

ดูman loggerเพิ่มเติม คุณสามารถเรียงลำดับข้อความเหล่านี้ไปยังไฟล์ที่ระบุหรือกรองตามลำดับความสำคัญ

นอกจากนี้ยังมีวิธีแก้ปัญหาสำหรับภาษาการเขียนโปรแกรมที่แตกต่างกันดังนั้นโปรดบอกฉันว่าคุณต้องการทำอะไร ;-)


ที่จริงฉันอยากจะใช้ภาษาค และฉันได้รับข้อมูลในโพสต์มิเคล
Sushant Jain

1

การกรองตามชื่อโปรแกรมนั้นเขียนแตกต่างจากที่กล่าวไว้ข้างต้นสำหรับเวอร์ชั่นล่าสุดของrsyslog(เวอร์ชั่นในเครื่องของฉันคือ 5.8.6) ดังที่แสดงด้านล่าง:

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

สำหรับข้อมูลเพิ่มเติมดูที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.