วันอาทิตย์ที่ 13 เมษายน พ.ศ. 2557

Config Syslog-ng Sent Logs to Database Mysql Base on ubuntu การคอนฟิก Syslog-ng ลง database mysql บนระบบปฎิบัติการ Ubuntu

เนื่องจากมีปัญหามากมายในการ คอนฟิก เพื่อเก็บ Logs ลงบน Database โดยใช้เจ้าตัว Syslog-ng  ซึ่งส่วนตัวผมนั้น อ่านทั้งเว็ปที่เป็นภาษาไทย และเว็ปที่เป็นภาษาประกิด แล้วเกิดความฉงน งงงวยมากให้การ Config ให้อีเจ้า Log เนียะ มันลง Database ให้ได้ วันนี้ผมก็จะมาเขียน แบบ Step by Step เลยนะครับ บอกเลยว่าได้แน่นอน 100%

1.ทำการลง mysql database ก่อนนะครับ ตามลิ้งนี้ 

2.ทำการลง Syslog-ng ด้วยคำสั่ง sudo apt-get install syslog-ng 
รอจนมันลงเสร็จนะครับ

3.ทำการ restart syslog-ng ด้วยคำสั่ง  /etc/init.d/syslog-ng restart








4.start mysql service ด้วยคำสั่ง chkconfig --level 2345 mysqld on; service mysqld start


5.ทำการ test service ของ mysql ด้วยคำสั่ง mysql -u username -p แล้ว Enter แล้ว ใส่ password












แล้วพิมพ์ คำสั่ง exit เพื่อออกจาก mysql

6.สร้างฐานข้อมูลที่เราจะรับค่าเข้ามา
โดยจะมีข้อมูลประมาณนี้นะครับ 
  1. CREATE TABLE `logs` (
  2. `host` varchar(32) DEFAULT NULL,
  3. `facility` varchar(10) DEFAULT NULL,
  4. `priority` varchar(10) DEFAULT NULL,
  5. `level` varchar(10) DEFAULT NULL,
  6. `tag` varchar(10) DEFAULT NULL,
  7. `datetime` datetime DEFAULT NULL,
  8. `program` varchar(15) DEFAULT NULL,
  9. `msg` text,
  10. `seq` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  11. PRIMARY KEY (`seq`),
  12. KEY `host` (`host`),
  13. KEY `program` (`program`),
  14. KEY `datetime` (`datetime`),
  15. KEY `priority` (`priority`),
  16. KEY `facility` (`facility`)
  17. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;


7.สร้าง pipe 


โดยเราจะเช็ค pipe ว่ามีแล้วหรือยังด้วยคำสั่ง ls -alh /tmp/mysql.syslog-ng.pipe
หากยังไม่มี ให้สร้าง pipe ขึ้นมาด้วยคำสั่ง mkfifo /tmp/mysql.syslog-ng.pipe

8.ทำการ config file syslog-ng.conf โดยเข้าไปที่ /etc/syslog-ng 






เมื่อเข้าไปแล้ว ใช้คำสั่ง vi
ทำการเพิ่มโคตเข้าไปยังส่วนท้ายของ file ดังนี้ โดยการเขียนไฟล์ด้วย vi จะต้องกด s เพื่อทำการเขียนหรือแก้ใขไฟล์ 
ทำการเพิ่ม เข้าไปยังส่วนท้ายของ file 
source src {
    unix-dgram("/var/run/log");
    unix-dgram("/var/run/lobpriv" perm (0600));
    udp(
        ip(0.0.0.0) port(514)
    );
    tcp(
        ip(0.0.0.0) port(514)
    );
    internal();
    #file("/dev/klog");     
};

source net {
    udp();
};



destination d_mysql {
       pipe("/tmp/mysql.syslog-ng.pipe"
                     template("INSERT INTO logs
                    (host, facility, priority, level, tag, datetime,program, msg)
                     VALUES ( '$HOST', '$FACILITY', '$PRIORITY', '$LEVEL','$TAG',
                     '$YEAR-$MONTH-$DAY  $HOUR:$MIN:$SEC','$PROGRAM', '$MSG' );\n") template-escape(yes));
};



log { source(s_src); destination(d_mysql); };
#log { source(src); destination(d_mysql); };
log { source(net); destination(d_mysql); };


เช็คว่า filter f_dbg {level(debug);}; ถูก คอมเม้นไว้หรือไม่ หากถูกคอมเม้นด้วยเครื่องหมาย # ข้างหน้าอยู่ให้ปลดออก 

9. สร้าง  bash script สำหรับ pipe ของ  syslog-ng กับ mysql


10.ทำการเพิ่มคำสั่งลงไปใน file syslogng-mysql-pipe.sh

#!/bin/sh
#
# File: syslogng-mysql-pipe.sh
#
# Take input from a FIFO and run execute it as a query for
# a mysql database.
#
# IMPORTANT NOTE:  This could potentially be a huge security hole.
# You should change permissions on the FIFO accordingly.
#
# this script is taken from http://arttechnologyevolution.blogspot.com/2014/04/config-syslog-ng-sent-logs-to-database.html
#

if [ -e /tmp/mysql.syslog-ng.pipe ]; then
        while [ -e /tmp/mysql.syslog-ng.pipe ]
                do
                        mysql -uYourUsername --password=YourPassword YourDatabase < /tmp/mysql.syslog-ng.pipe
        done
else
        mkfifo /tmp/mysql.syslog-ng.pipe
fi

ในส่วนของ YourUsername ให้ใส่ Username ของในการเข้า Database เรา 
YourPassword คือพาสเวิดที่เข้า Database
YourDatabase คือ Database ที่เราสร้างขึ้น 

11.ทำการรันสคริป ด้วยคำสั่ง 
/etc/syslog-ng/syslogng-mysql-pipe.sh &

12.แล้วทำการ Restart Syslog-ng ด้วยคำสั่ง 
/etc/init.d/syslog-ng restart

13.ทำการเช็คข้อมูล Log ใน Database ว่ามารึยัง


หรือจะเข้าไปดูผ่าน PHPMyadmin ก็ได้นะครับ
 การ Config Syslog-ng ลง Database ก็มีแต่เพียงเท่านี้ หากทำตามกระผมแล้วมีปัญหาก็คอมเม้น ได้นะครับ เพราะผมเข้ามาดูบ่อยอยู่ครับ 
บทความต่อไปจะเป็นการ ทำ central logs database นะครับ (ขอเวลาศึกษาแปบ)









7 ความคิดเห็น:

  1. แล้วถ้าต้องการเก็บ log ลง Mysql แบบ 1Table/1วัน หละครับ จะต้องทำยังไงเหรอครับ
    ขอบคุณครับ

    ตอบลบ
    คำตอบ
    1. อันนี้ผมไม่แน่ใจว่ามีใครเคยทำไม้ แต่ เวลาส่งข้อมูลลง database ผมส่งมันผ่าน pipe ในขั้นตอนที่ผมเขียน ซึ่งถ้าหากเปลี่ยน table code ใน pipe จะต้องเปลี่ยนทุกวัน อะครับ แล้ว ทางฝั่งรับที่เป็น table อะครับ มันต้อง gen table ทุกวัน table มันจะไม่บานเบอะเหรอครับอย่างงี้อะ หรือว่าออกแบบให้ gen table ทุกวัน อะครับ

      ลบ
  2. เวลาต้องการเข้า mysql แล้วมันขึ้นแบบนี้ค่ะ
    root@logserver-Vostro-230:~# mysql -u username -p
    Enter password:
    ERROR 1045 (28000): Access denied for user 'username'@'localhost' (using password: YES)

    ตอบลบ
    คำตอบ
    1. Error 1045 (28000) เป็น error ที่เกิดจากปัญหาที่ user ใน mysql ครับ ลองสร้าง user ใหม่ดูครับ หรือลองถอนการติดตั้ง mysql แล้วติดตั้งใหม่ดูครับ หรือลองเข้าไปดูใน link นี้ดูครับ forums.metal.com/read.pho?11,34014,46593 ครับ ผมก็เอาคำตอบมาจากในนี้แหละครับ

      ลบ
    2. แก้ลิ้งใหม่ครับ ผมพิมพ์ผิด forums.mysql.com/read.php?11,34014,46593

      ลบ
    3. ขอบคุณค่ะเดี๋ยวจะลองดูนะคะ

      ลบ
  3. พี่ถ้า os ของผมเป็น Linux ละครับใช้คำสั่งเดียวกันหรือเปลี่ยนคำสังอะไรบ้างครับครับ

    ตอบลบ