ฉันมีเซิร์ฟเวอร์ประมาณ 30 ตัวและฉันใช้ syslog เพื่อส่งบันทึกทั้งหมดไปยังเซิร์ฟเวอร์การบันทึกเดียว สำหรับการสำรองข้อมูลเครื่องทั้งหมดจะได้รับการกำหนดค่าให้จัดเก็บบันทึกของตนเองภายในเครื่องเป็นเวลาสองสามวันโดยใช้ logrotate เพื่อดูแลการหมุนเวียนและการลบบันทึกเก่า
เซิร์ฟเวอร์แอปพลิเคชันของฉันแต่ละตัวรันสคริปต์ perl ขนาดเล็กเพื่อส่งบันทึกไปยัง syslog ซึ่งส่งต่อไปยัง loghost (สคริปต์ perl ด้านล่าง)
จากนั้นใน loghost เรามีสคริปต์ที่กำหนดเองที่คล้ายกับ logcheck ที่โดยทั่วไปดูบันทึกที่เข้ามาสำหรับสิ่งที่น่าสงสัย
นอกจากนี้เรายังมีอีเมลทั้งหมดจากโฮสต์ทุกแห่งที่ไปที่เดียวดังนั้นหากมีโปรแกรมใดบ่นเราก็จะได้รับข้อความทั้งหมด ในทางทฤษฎีสามารถไปที่กล่องจดหมายเดียวที่โปรแกรมสามารถทำงานและวิเคราะห์ได้
นี่คือสคริปต์การบันทึกของฉัน มันทำงานได้โดยการไพพ์เอาท์พุทของโปรแกรมลงไปจากนั้นมันจะ syslogs เอาท์พุทแล้วคายมันออกมาเพื่อให้คุณสามารถส่งมันไปที่อื่น (ฉันส่งไปที่ multilog) คุณสามารถให้ตัวเลือก -q เพื่อไปยัง syslog
#!/usr/bin/perl
use Sys::Syslog;
use Getopt::Long;
$SERVER_NAME = `hostname`;
chomp $SERVER_NAME;
$FACILITY = 'local0';
$PRIORITY = 'info';
GetOptions ('s=s' => \$SERVER_NAME, 'f=s' => \$FACILITY, 'p=s' => \$PRIORITY, 'q+' => \$quiet);
#print "$SERVER_NAME\n$FACILITY\n$PRIORITY\n";
#Sys::Syslog::setlogsock('unix');
openlog ($SERVER_NAME,'ndelay',$FACILITY);
if (!($quiet)) {syslog($PRIORITY,"Logging Started -- Logger version 1.1");}
$| = 1;
while (<>) {
if (!($quiet)) {print $_ unless $_ =~ /^\s+$/};
chomp;
syslog($PRIORITY,$_) if $_;
}
closelog;
$| = 0;