Pull to refresh

syslog-ng+MySQL+Net Source

Reading time 6 min
Views 6.2K
Задача: Поднять syslog сервер, с хранением логов в SQL базе и cделать возможным
скидывать туда логи с других клиентов роутеров например

Что нужно: unix like ОС (хотя даже на ОС семейства Windows это можно сделать), syslog-ng, MySQL и понятие, для чего это на фиг нужно.

Предупрежу сразу, все происходить в окружении gentoo linux. И идем по шагам.

syslog-ng

Устанавливаем это чудо, только не забываем добавить пару юзов
user$ echo "app-admin/syslog-ng sql tcpd"|sudo tee -a /etc/portage/packages.use
user$ emerge -av app-admin/syslog-ng


Все супер, далее правим конфиг /etc/syslog-ng/syslog-ng.conf и что бы
получилось, что то похожее на мое:

  1. options {
  2. ## general settings
  3. time_reopen(10); # Reopen a dead connection after this many seconds
  4. time_reap(120); # Close an idle destination file after this many seconds
  5. time_sleep(5); # Wait these many milliseconds between poll iterations
  6. ts_format(rfc3164); # Timestamp format: rfc3164|rfc3339|bsd|iso
  7. log_fifo_size(1000); # Output queue size
  8. log_msg_size(8192); # Max size of a single message
  9. log_fetch_limit(1000); # The maximum number of messages fetched from a source during a single poll loop.
  10. flush_lines(10); # Buffer this many lines of output (0 to send to disk immediately)
  11. flush_timeout(1000); # Wait at most this many milliseconds before forcibly flushing the output buffer
  12. mark_freq(300); # MARK line logging interval
  13. stats_freq(0); # Stats logging interval (0 = disabled)
  14. ## remote logging
  15. normalize_hostnames(yes); # Do normalize hostnames (transform to lower case)
  16. chain_hostnames(on); # Chain hostnames?
  17. keep_hostname(yes); # Keep the hostname the client sent?
  18. keep_timestamp(no); # Do not use the timestamp the client sent -- it might be wrong
  19. use_dns(yes); # Use DNS? Good for log servers.
  20. use_fqdn(no); # Use FQDNs? Good for log servers.
  21. dns_cache(yes); # Cache DNS results?
  22. dns_cache_size(1024); # Number of DNS lookup results to cache
  23. dns_cache_expire(3600); # Expire cached successful DNS lookup results after this many seconds
  24. dns_cache_expire_failed(60); # Expire cached failed DNS lookup results after this many seconds
  25. ## log file handling
  26. create_dirs(yes); # Create directories for log files if they don't exist
  27. dir_owner("root"); # Owner of newly created directories
  28. dir_group("log"); # Group of newly created directories
  29. dir_perm(0750); # Permissions of newly created directories
  30. owner("root"); # Owner of newly created log files
  31. group("log"); # Group of newly created log files
  32. perm(0640); # Permissions of newly created log files
  33. ## misc
  34. bad_hostname("^gconfd$");
  35. };

  36. #От куда мы будем получать локальные логи
  37. source src_local {
  38.    unix-stream("/dev/log" max-connections(1000));
  39.    internal();
  40. };
  41. #Если ядру не хорошо, он жалуется туда
  42. source src_kernel {
  43.     file("/proc/kmsg" flags(kernel) log_prefix("kernel: "));
  44. };
  45. #Открываем доступ к серверу. 0.0.0.0 - можно заменить на какой то конкретный
  46. source src_rem { udp(ip("0.0.0.0") port(514));
  47.             tcp(ip("0.0.0.0") port(514)); };
  48. #Самое интересно, путь назначение логов будет БД.
  49. # syslogpaster - это пользователь которого мы создадим далле, он будет иметь возможность только "вставлять" в БД, больше ему не чего не нужно.
  50. destination d_my_server_mysql {
  51.             program("/usr/bin/mysql --user=syslogpaster --password='MYSUPERPASSWORD' syslog < /var/log/mysql.pipe");
  52.             pipe ("/var/log/mysql.pipe"
  53.             # Так как я не хочу что бы все логи были в одной таблицы, я для каждого устройства создал по таблице, это даллее
  54.             template("INSERT INTO MY_SERVER (host, facility, priority, level, tag, date, time, program, msg) VALUES ( '$HOST', '$FACILITY', '$PRIORITY', '$LEVEL','$TAG','$YEAR-$MONTH-$DAY', '$HOUR:$MIN:$SEC', '$PROGRAM', '$MSG' );")
  55.             template-escape(yes)); };

  56. destination d_dslmodem_mysql {
  57.             program("/usr/bin/mysql --user=syslogpaster --password='MYSUPERPASSWORD' syslog < /var/log/mysql.pipe");
  58.             pipe ("/var/log/mysql.pipe"
  59.             template("INSERT INTO dslmodem (host, facility, priority, level, tag, date, time, program, msg) VALUES ( '$HOST', '$FACILITY', '$PRIORITY', '$LEVEL','$TAG','$YEAR-$MONTH-$DAY', '$HOUR:$MIN:$SEC', '$PROGRAM', '$MSG' );")
  60.             template-escape(yes)); };

  61. destination d_wifi_mysql {
  62.             program("/usr/bin/mysql --user=syslogpaster --password='MYSUPERPASSWORD' syslog < /var/log/mysql.pipe");
  63.             pipe ("/var/log/mysql.pipe"
  64.             template("INSERT INTO wifi (host, facility, priority, level, tag, date, time, program, msg) VALUES ( '$HOST', '$FACILITY', '$PRIORITY', '$LEVEL','$TAG','$YEAR-$MONTH-$DAY', '$HOUR:$MIN:$SEC', '$PROGRAM', '$MSG' );")
  65.             template-escape(yes)); };

  66. # Шаблоны для локальных логов.
  67. template t_logtty   { template("${DATE}; ${FACILITY}.${PRIORITY}; ${MSG}"); template<em>escape(no); };
  68. template t_admintty { template("${DATE}; ${FACILITY}.${PRIORITY}; ${MSG}"); template<em>escape(no); };
  69. template t_local    { template("${YEAR}-${MONTH}-${DAY} ${HOUR}:${MIN}:${SEC} ${TZOFFSET}; ${HOST}; ${FACILITY}.${PRIORITY}; ${MSG}"); template_escape(no); };

  70. #Собираем локальные логи и постим их в бд, host указать свой
  71. #local log to mysql
  72. filter f_my_server { host("MY_SERVER"); };
  73. log { source(src_local); source(src_kernel); filter(f_my_server); destination(d_my_server_mysql); };

  74. # А это уже логи с сетевых узлов
  75. #remote dslmodem(10.39.1.1)
  76. filter f_dslmodem { host("10.39.1.1"); };
  77. log { source(src_rem); filter(f_dslmodem); destination(d_dslmodem_mysql); };

  78. #remote wifi(10.39.0.1)
  79. filter f_wifi { host("10.39.0.1"); };
  80. log { source(src_rem); filter(f_wifi); destination(d_wifi_mysql); };


  81. # Ну и пока сервер работает в режиме отладки, мы еще и в файлах логи сохраняем
  82. #log to file
  83. destination d_kernel { file("/var/log/kernel.log" template(t_local)); };
  84. log { source(src_kernel); destination(d_kernel); };
  85. destination d_logtty { file("/dev/tty10" template(t_logtty)); };
  86. log { source(src_local); source(src_kernel); destination(d_logtty); };
  87. destination d_messages { file("/var/log/messages" template(t_local)); };
  88. log { source(src_local); source(src_kernel); source(src_rem); destination(d_messages); };


MySQL
Создаем бд с именем syslog

user$ mysql -u root -p
mysql> CREATE DATABASE syslog;


Заводим трех пользоватлей:
* syslogadmin — пользователь имеет все права на бд
* sysloguser — может только смотреть
* syslogpaster — может только добавлять в бд

CREATE USER syslogadmin IDENTIFIED BY '123456789';
CREATE USER syslogadmin IDENTIFIED BY '123456';
CREATE USER syslogpaster IDENTIFIED BY '123456';

GRANT USAGE ON syslog.* TO 'syslogadmin'@'localhost';
GRANT ALL ON syslog.* TO 'syslogadmin'@'localhost';
GRANT RELOAD ON *.* TO 'syslogadmin'@'localhost';

REVOKE ALL PRIVILEGES ON syslog.* FROM 'sysloguser'@'localhost';
GRANT USAGE ON syslog.* TO 'sysloguser'@'localhost';
GRANT SELECT ON syslog.* TO 'sysloguser'@'localhost';

REVOKE ALL PRIVILEGES ON syslog.* FROM 'syslogpaster'@'localhost';
GRANT USAGE ON syslog.* TO 'syslogpaster'@'localhost';
GRANT INSERT ON syslog.* TO 'syslogpaster'@'localhost';


Теперь создаем таблицы. Структура таблиц одинакова, просто меняем имена:

CREATE TABLE my_server (
host varchar(32) default NULL,
facility varchar(10) default NULL,
priority varchar(10) default NULL,
level varchar(10) default NULL,
tag varchar(10) default NULL,
date date default NULL,
time time default NULL,
program varchar(15) default NULL,
msg text,
seq int(10) unsigned NOT NULL auto_increment,
PRIMARY KEY (seq),
KEY host (host),
KEY seq (seq),
KEY program (program),
KEY time (time),
KEY date (date),
KEY priority (priority),
KEY facility (facility)
) TYPE=MyISAM;

CREATE TABLE dslmodem (
host varchar(32) default NULL,
facility varchar(10) default NULL,
priority varchar(10) default NULL,
level varchar(10) default NULL,
tag varchar(10) default NULL,
date date default NULL,
time time default NULL,
program varchar(15) default NULL,
msg text,
seq int(10) unsigned NOT NULL auto_increment,
PRIMARY KEY (seq),
KEY host (host),
KEY seq (seq),
KEY program (program),
KEY time (time),
KEY date (date),
KEY priority (priority),
KEY facility (facility)
) TYPE=MyISAM;

CREATE TABLE wifi (
host varchar(32) default NULL,
facility varchar(10) default NULL,
priority varchar(10) default NULL,
level varchar(10) default NULL,
tag varchar(10) default NULL,
date date default NULL,
time time default NULL,
program varchar(15) default NULL,
msg text,
seq int(10) unsigned NOT NULL auto_increment,
PRIMARY KEY (seq),
KEY host (host),
KEY seq (seq),
KEY program (program),
KEY time (time),
KEY date (date),
KEY priority (priority),
KEY facility (facility)
) TYPE=MyISAM;


Заключение

Ну в общем и все запускаем syslog-ng, хотя нет, совсем забыл, надо еще перед
этим создать pipe
user$ sudo mkfifo /var/log/mysql.pipe
user$ sudo /etc/init.d/syslog-ng start


И все должно работать )
Tags:
Hubs:
0
Comments 9
Comments Comments 9

Articles