Skip to content


linux日志集中管理查看syslog-ng+splunk

syslog-ng ,可以简单的看成取代 syslog 的的日志服务器,企业级的.目前我们使用的 syslog-ng 开源版本是启动于十年之前的 syslog-ng 项目的“直系后代”.syslog-ng可运行与“server”和“agent”模式,分别支持 UDP、可靠的TCP和加密的TLS协议.syslog 可以用来在混合复杂的环境里建立灵活的、可靠的日志服务器.

syslog-ng开源版本的特性还有:

1. 支持SSL/TSL协议
2. 支持将日志写入数据库中,支持的数据库有MySQL, Microsoft SQL (MSSQL), Oracle, PostgreSQL, and SQLite.
3. 支持标准的syslog协议
4. 支持filter、parse以及rewrite
5. 支持更多的平台
6. 更高的负载能力

syslog-ng 对性能进行了优化,可以处理巨大的数据量.一般的硬件,在正确的配置下,可以实时地处理75000个消息每秒钟,超过24GB的RAW日志每小时.

前言
在标准的 Linux 中有一个 syslog .通常设置格式为

  1. <设备 facility>.<严重性 priority>.<动作>

默认系统预先定义了12+8个(mail、news、auth等)facility,八个不同的优先级(alert到debug).通常我们也只能根据这些来做一些操作.备注中有详细的解释.

在 syslog-ng 中.就不一样,非常强大,只需要定义来源,和目标位置,有可能需要定义一个过滤.
示例为:

  1. {Source;filter;destination;}

其中的每一个字段的会在下面进行详细的说明,这也必须在 syslog_ng.conf 文件中定义你想要的.

一.安装 syslog-ng
直接用 yum

  1. yum install syslog-ng

源码安装
http://www.balabit.com/downloads/files?path=/libol

wget http://www.balabit.com/downloads/files?path=/libol/0.3/libol-0.3.18.tar.gz
wget http://www.balabit.com/downloads/files?path=/syslog-ng/open-source-edition/3.3.7/source/eventlog_0.2.12.tar.gz
wget http://www.balabit.com/downloads/files?path=/syslog-ng/open-source-edition/3.3.7/source/syslog-ng_3.3.7.tar.gz

1.安装eventlog

  1. tar -zxvf eventlog_0.2.12.tar.gz
  2. cd  eventlog-0.2.12
  3. ./configure --prefix=/usr/local/eventlog
  4. make && make install

2.安装libol

  1. mv files\?path\=%2Flibol%2F0.3%2Flibol-0.3.18.tar.gz libol-0.3.18.tar.gz
  2. tar -zxvf libol-0.3.18.tar.gz
  3. cd libol-0.3.18
  4. ./configure --prefix=/usr/local/libol
  5. make && make install

3.安装syslog-ng

  1. yum install pcre
  2. # 设置环境变量
  3. export PKG_CONFIG_PATH=/usr/local/eventlog/lib/pkgconfig/
  4.  
  5. tar -zxvf syslog-ng_3.3.7.tar.gz
  6. cd syslog-ng-3.3.7
  7. ./configure --prefix=/usr/local/syslog-ng --with-libol=/usr/local/libol/
  8. make && make install

二.配置syslog-ng

1.打开iptables接收端口,这里只开放给内网

  1. iptables -A INPUT -p tcp -m tcp -s 192.168.0.0/16 --dport 514 -j ACCEPT
  2. iptables -A INPUT -p udp -m udp -s 192.168.0.0/16 --dport 514 -j ACCEPT

2.配置全局配置
全局配置的是在 /etc/syslog-ng/syslog-ng.conf 中.
新板本中sync变成flush_lines,long_hostnames变成 chain_hostnames.
Your configuration file uses an obsoleted keyword, please update your configuration; keyword=’sync’, change=’flush_lines’
Your configuration file uses an obsoleted keyword, please update your configuration; keyword=’long_hostnames’, change=’chain_hostnames’

接收远程日志并按年月日和主机地址集中的一个文件中,示例:

  1. options {
  2. keep_hostname(off);
  3. chain_hostnames(off);
  4. flush_lines(1);
  5. log_fifo_size(1024);
  6. create_dirs(yes);     # if a dir does not exist create it
  7. owner(root);          # owner of created files
  8. group(root);          # group of created files
  9. perm(0600);              # permissions of created files
  10. dir_perm(0700);    # permissions of created dirs
  11. };
  12. source s_local {
  13. system();
  14. unix-stream("/dev/log");     # local system logs
  15. file("/proc/kmsg");          # local kernel logs
  16. internal();
  17. };
  18. source s_all {
  19. udp(ip(0.0.0.0) port(514));   # remote logs # arriving at 514/udp
  20. };
  21. destination d_local_file {
  22. file("/var/syslog/$YEAR.$MONTH/$HOST/log-$DAY.log" owner(root) group(root) perm(0600) dir_perm(0700) create_dirs(yes));
  23. };
  24. destination d_net_file {
  25. file("/var/syslog/$YEAR.$MONTH/$HOST/log-$DAY.log" owner(root) group(root) perm(0600) dir_perm(0700) create_dirs(yes));
  26. };
  27.  
  28. log {
  29. source(s_local);
  30. destination(d_local_file);
  31. };
  32. log {
  33. source(s_all);
  34. destination(d_net_file);
  35. };

全局选项(option)
chain_hostnames 是否使用长主机名记录,也就是使用完全符合标准的域名.
flush_lines 设置一次向目的地发送几行消息.如果设成0,一收到消息就发送
sync_freq 在写入文件之前,可以缓冲的日志消息行数
use_dns 是否使用 DNS ,选项包括:yes、no和persist_only.选项设成了‘persist_only’,
因而会检查 /etc/hosts 文件,以解析主机名,这时并不依赖DNS 服务器.
stats_freq 两个状态消息(关于丢失日志消息的统计消息)消息之间间隔的时间(以秒为单位).0表示禁用发送STATS消息.
normalize_hostnames 是否对主机名转换成小写.
keep_hostname 如果要进行转发或透过外部服务器传送,该选项就会保留主机名,那样主机最终到达中央服务器后,
主机名会一并到达,而不是依赖DNS(或/etc/hosts)
来源(source)
internal syslog-ng 内部产生的消息
unix-stream 打开指定的SOCK_STREAM模式的unix套接字,接收日志消息
unix-dgram 打开指定的SOCK_DGRAM模式的unix套接字,接收日志消息
file 打开指定的文件读取日志信息
pipe,fifo 打开指定的管道或者FIFO设备,读取日志信息
tcp 在指定的TCP端口接收日志消息
udp 在指定的UDP端口接收日志消息
program 来自程序
syslog 来自网络上syslog格式的信息

目的地(destination)
file() file 是 syslog-ng 最重要的日志消息目的驱动器之一.使用它,你可以把日志消息定向到一些文件中.
logstore() 存储成二进制格式可以加密压缩
pipe() 通过pipe()日志消息目的驱动器把日志消息发送到/dev/xconsole之类的命名管道.
program() 驱动器fork出一个进程,使用给定的参数执行一个特定的程序,然后把日志消息送到这个进程的标准输入设备.
sql() 存储到mysql,oracel,mssql等数据库中
syslog() 转发到远程日志服务器上
unix-stream()和unix0dgram() 通过这两个日志消息目的驱动器把日志消息发送到一个SOCK_STREAM或者SOCK_DGRAM模式的UNIX套接字.
udp()和tcp() 使用TCP或者UDP协议把日志消息送到本地网络上或者internet上的另外的主机.
usertty() 使用这个日志消息目的驱动器把日志消息送到一个登录用户使用的终端.

3.启动
/usr/local/syslog-ng/sbin/syslog-ng

关闭
pkill syslog-ng

4.调试
在其它的节点的 Linux 上在 syslog.conf 或rsyslog.conf 中配置
vi /etc/syslog.conf 或vi /etc/rsyslog.conf

  1. *.*                   @syslog-ng 服务器 ip
  1. /etc/init.d/syslog restart

用 logger 来进行测试

  1. logger -p local3.info hello

这样在syslog-ng 的服务器上就能见到 message 的信息了

三 splunk

splunk看着比LogZilla(php-syslog-ng)强.
Splunk 是一款顶级的日志分析软件,如果你经常用 grep、awk、sed、sort、uniq、tail、head 来分析日志,那么你需要 Splunk。能处理常规的日志格式,比如 apache、squid、系统日志、mail.log 这些。对所有日志先进行 index,然后可以交叉查询,支持复杂的查询语句。然后通过直观的方式表现出来。日志可以通过文件方式传倒 Splunk 服务器,也可以通过网络实时传输过去。或者是分布式的日志收集。总之支持多种日志收集方法。

这个软件分为免费版本和专业版本。专业版本的价格是 3 万多刀。免费版本的功能也足够强大了。

下载后为企业试用版,可以转为免费版,免费版和收费版的差异
The Free license includes 500 MB/day of indexing volume, is free (as in beer), and has no expiration date.

The following features that are available with the Enterprise license are disabled in Splunk Free:

Multiple user accounts and role-based access controls
Distributed search
Forwarding in TCP/HTTP formats (you can forward data to other Splunk instances, but not to non-Splunk instances)
Deployment management (including for clients)
Alerting/monitoring

1.安装aplunk
从 http://www.splunk.com 注册个用户,乱填的可能不通过
下载 splunk tarball
当前最新为splunk-5.0.1
解压 splunk tarball 并将其移动到 /usr/local/splunk

2.打开iptables
splunk默认运行在8000端口,打开iptables设置充许访问的ip

  1. iptables -A INPUT -p tcp -m tcp -s 192.168.0.39 --dport 8000-j ACCEPT

3.启动

  1. /usr/local/splunk/bin/splunk start

第一次运行会进行一些设置,按”y”同意

4.设置日志分析目录
进入http://localhost:8000 第一次需要重设密码
然后点击添加数据,选择本地文件,还有tcp端口接收syslog-ng转发

5.修改syslog-ng配置
过滤不同日志存入不同文件,并转发至splunk

  1. options {
  2. use_dns (no);
  3.         use_fqdn(no);
  4.         chain_hostnames(off);
  5.         keep_hostname(off);
  6.         flush_lines(0);
  7.         stats_freq(43200);
  8.         create_dirs(yes);
  9. };
  10. source s_internal { internal(); };
  11. destination d_syslognglog { file("/var/log/syslog-ng.log"); };
  12. log { source(s_internal); destination(d_syslognglog); };
  13.  
  14. source s_sys { system();file("/proc/kmsg"); unix-stream("/dev/log");};
  15. destination d_cons { file("/dev/console"); };
  16. destination d_mesg { file("/var/log/messages"); };
  17. destination d_auth { file("/var/log/secure"); };
  18. destination d_mail { file("/var/log/maillog"); };
  19. destination d_spol { file("/var/log/spooler"); };
  20. destination d_boot { file("/var/log/boot.log"); };
  21. destination d_cron { file("/var/log/cron"); };
  22. destination d_rsync { file("/var/log/rsync"); };
  23. destination d_mlal { usertty("*"); };
  24.  
  25. filter f_filter1     { facility(kern); };
  26. filter f_filter2     { level(info) and
  27.                      not (facility(mail)
  28.                         or facility(authpriv) or facility(cron)); };
  29. filter f_filter3     { facility(authpriv); };
  30. filter f_filter4     { facility(mail); };
  31. filter f_filter5     { level(emerg); };
  32. filter f_filter6     { facility(uucp) or
  33.                      (facility(news) and level(crit)); };
  34. filter f_filter7     { facility(local7); };
  35. filter f_filter8     { facility(cron); };
  36. filter f_filter9     { facility(daemon); };
  37. filter f_filter10     { facility(local6); };
  38.  
  39. #log { source(s_sys); filter(f_filter1); destination(d_cons); };
  40. log { source(s_sys); filter(f_filter2); destination(d_mesg); };
  41. log { source(s_sys); filter(f_filter3); destination(d_auth); };
  42. log { source(s_sys); filter(f_filter4); destination(d_mail); };
  43. log { source(s_sys); filter(f_filter5); destination(d_mlal); };
  44. log { source(s_sys); filter(f_filter6); destination(d_spol); };
  45. log { source(s_sys); filter(f_filter7); destination(d_boot); };
  46. log { source(s_sys); filter(f_filter8); destination(d_cron); };
  47.  
  48. # Remote logging
  49. source s_remote {
  50.         udp(ip(192.168.0.39) port(514));
  51. };
  52.  
  53. destination r_mesg { file("/var/log/syslog-ng/$YEAR.$MONTH/$HOST/messages" owner("root") group("root") perm(0640) dir_perm(0750) create_dirs(yes)); };
  54. destination r_auth { file("/var/log/syslog-ng/$YEAR.$MONTH/$HOST/secure" owner("root") group("root") perm(0640) dir_perm(0750) create_dirs(yes)); };
  55. destination r_mail { file("/var/log/syslog-ng/$YEAR.$MONTH/$HOST/maillog" owner("root") group("root") perm(0640) dir_perm(0750) create_dirs(yes)); };
  56. destination r_spol { file("/var/log/syslog-ng/$YEAR.$MONTH/$HOST/spooler" owner("root") group("root") perm(0640) dir_perm(0750) create_dirs(yes)); };
  57. destination r_boot { file("/var/log/syslog-ng/$YEAR.$MONTH/$HOST/boot.log" owner("root") group("root") perm(0640) dir_perm(0750) create_dirs(yes)); };
  58. destination r_cron { file("/var/log/syslog-ng/$YEAR.$MONTH/$HOST/cron" owner("root") group("root") perm(0640) dir_perm(0750) create_dirs(yes)); };
  59. destination r_daemon { file("/var/log/syslog-ng/$YEAR.$MONTH/$HOST/daemon" owner("root") group("root") perm(0640) dir_perm(0750) create_dirs(yes)); };
  60. destination r_local6 { file("/var/log/syslog-ng/$YEAR.$MONTH/network/messages" owner("root") group("root") perm(0640) dir_perm(0750) create_dirs(yes)); };
  61. #destination d_separatedbyhosts {
  62. #       file("/var/log/syslog-ng/$HOST/messages" owner("root") group("root") perm(0640) dir_perm(0750) create_dirs(yes));
  63. #};
  64.  
  65.  
  66. #log { source(s_remote); destination(d_separatedbyhosts); };
  67. log { source(s_remote); filter(f_filter2); destination(r_mesg); };
  68. log { source(s_remote); filter(f_filter3); destination(r_auth); };
  69. log { source(s_remote); filter(f_filter4); destination(r_mail); };
  70. log { source(s_remote); filter(f_filter6); destination(r_spol); };
  71. log { source(s_remote); filter(f_filter7); destination(r_boot); };
  72. log { source(s_remote); filter(f_filter8); destination(r_cron); };
  73. log { source(s_remote); filter(f_filter9); destination(r_daemon); };
  74. log { source(s_remote); filter(f_filter10); destination(r_local6); };
  75.  
  76. #splunk use 1999 port
  77. destination d_tcp { tcp("localhost" port(1999) localport(999)); };
  78. log { source(s_remote); destination(d_tcp); };

6.加入自运行
echo ‘/usr/local/syslog-ng/sbin/syslog-ng’ >> /etc/rc.local
echo ‘/usr/local/splunk/bin/splunk start’ >> /etc/rc.local

参考:
http://www.php-oa.com/2012/01/13/linux-syslog-ng.html
http://blog.163.com/dingding_jacky/blog/static/1669127872011113011048416/
http://andyxu.blog.51cto.com/2050315/888583
http://bbs.linuxtone.org/thread-2082-1-3.html
http://www.phpwebgo.com/2012/05/14/318.html
http://www.balabit.com/sites/default/files/documents/syslog-ng-v3.0-guide-admin-en.html/bk01-toc.html
http://docs.splunk.com/Documentation/Splunk
http://www.syslog.org/syslog-ng

Posted in 技术, 日志.

Tagged with , .


No Responses (yet)

Stay in touch with the conversation, subscribe to the RSS feed for comments on this post.



Some HTML is OK

or, reply to this post via trackback.