มีวิธีใดบ้างในการสร้างล็อกไฟล์สำหรับเก็บรักษาข้อมูลบางอย่างใน / var / log / ด้วยความช่วยเหลือของฟังก์ชั่นไลบรารีบางอย่างหรือการเรียกระบบในภาษา c ใน linux และฉันต้องการทราบมาตรฐานที่เราควรทำตามเพื่อเขียนและประมวลผลบันทึก ขอบคุณ
มีวิธีใดบ้างในการสร้างล็อกไฟล์สำหรับเก็บรักษาข้อมูลบางอย่างใน / var / log / ด้วยความช่วยเหลือของฟังก์ชั่นไลบรารีบางอย่างหรือการเรียกระบบในภาษา c ใน linux และฉันต้องการทราบมาตรฐานที่เราควรทำตามเพื่อเขียนและประมวลผลบันทึก ขอบคุณ
คำตอบ:
วิธีมาตรฐานในการเข้าสู่ระบบจากโปรแกรม 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_LOCAL0
LOG_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
หรือถ้าคุณวางแผนที่จะแจกจ่ายซอฟต์แวร์ของคุณให้ผู้อื่นอาจไม่ควรใช้LOG_LOCAL
หรือrsyslog
ตัวกรอง
ในกรณีที่คุณควรใช้LOG_USER
(ถ้ามันเป็นโปรแกรมปกติ) หรือLOG_DAEMON
(ถ้ามันเป็นเซิร์ฟเวอร์) เขียนข้อความเริ่มต้นของคุณและข้อความผิดพลาดโดยใช้แต่เขียนทั้งหมดของข้อความเข้าสู่ระบบของคุณไปยังนอกไฟล์syslog
syslog
ตัวอย่างเช่น Apache HTTPd เข้าสู่ระบบ/var/log/apache2/*
หรือ/var/log/httpd/*
ฉันถือว่าใช้ปกติopen
/ fopen
และwrite
/ printf
โทร
rpm -qa | grep syslog
หรือdpkg -l '*syslog*'
อาจจะบอกคุณว่า
sysklogd
เป็นเกมเดียวในเมืองสำหรับซอฟต์แวร์ syslog ซอฟแวร์ในปัจจุบันเช่นsyslog-ng
, rsyslog
และdsyslog
ที่มีอยู่และมีความสามารถในการกรองมากความซับซ้อนมากขึ้นกว่าบริการเพียง / ระดับ
คุณจะต้องการ#include <syslog.h>
จากนั้นใช้syslog()
ฟังก์ชั่นในการส่งข้อมูลไปยังโปรแกรมการบันทึกของระบบที่ใช้งานอยู่
มีความเป็นไปได้มากมายแผนของคุณคืออะไร คุณต้องการตัวเลือกในการเข้าสู่ระบบจากบรรทัดคำสั่งหรือไม่ ดูที่logger
(รวมอยู่ในbsdutils ) เพียงพิมพ์:
usr@srv % logger test
และมันจะบันทึกบางอย่างเช่นนี้กับคุณ/var/log/syslog
:
Apr 25 07:55:15 localhost usr: test
ดูman logger
เพิ่มเติม คุณสามารถเรียงลำดับข้อความเหล่านี้ไปยังไฟล์ที่ระบุหรือกรองตามลำดับความสำคัญ
นอกจากนี้ยังมีวิธีแก้ปัญหาสำหรับภาษาการเขียนโปรแกรมที่แตกต่างกันดังนั้นโปรดบอกฉันว่าคุณต้องการทำอะไร ;-)
การกรองตามชื่อโปรแกรมนั้นเขียนแตกต่างจากที่กล่าวไว้ข้างต้นสำหรับเวอร์ชั่นล่าสุดของrsyslog
(เวอร์ชั่นในเครื่องของฉันคือ 5.8.6) ดังที่แสดงด้านล่าง:
if $programname == 'popa3d' then /var/log/popa3d.log
สำหรับข้อมูลเพิ่มเติมดูที่นี่