Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1188754
  • 博文数量: 253
  • 博客积分: 5892
  • 博客等级: 大校
  • 技术积分: 1942
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-24 14:20
文章分类

全部博文(253)

文章存档

2012年(98)

2011年(155)

分类: LINUX

2011-10-11 22:41:42

一、syslog-ng的编译及安装

       在syslog-ng的官网说的很清楚,这里不再赘言,详见 ... g-system/compiling/,需要注意的是,编译syslog-ng需要glib的库。可以在下到最新的glib,解压后直接make make install就可以了。

二、syslog-ng的使用

       在 contrib目录下有一个关于syslog-ng配置的文档syslog-ng.conf.doc。如果是2.0.X的版本,在 doc\reference目录下还有个syslog-ng.txt,不知道为什么在我下的3.0.4这个版本中无此文档。个人感觉这个文档比先前的那个 doc要详细。

       先介绍下syslog-ng的几个常用的参数:
-?帮助,v3.0.4还出现了: --help-all、--help-process、--help-log;
-s 解析配置文件语法正确性;
-f 指定配置文件;
-F 前台执行程序;
-d 打印调试信息,一半是-Fd组合使用。

       在安装成功后可以看到/etc/syslog-ng.conf这个配置文件模板(和doc\examples\syslog- ng.conf.sample完全一样),但是对于版本3.0.4,运行syslog-ng会提示这个配置模板有语法错误:
1.在配置文件的顶部添加一行:@version:3.0
2.v3.0.4的options没有sync,将sync(0)改为flush_lines(0)
3.v3.0.4的syslog-ng在运行的时候需要在程序当前路径的var中创建个pid文件,所以我们需要mkdir个var目录
       按照上述方法就可以使用运行自带的模板了,但是有时候我们需要记录些特殊的日志。下面是我测试时使用的配置文件:
[root:/home #] cat /gdconf/syslog-ng.conf
@version:3.0
#
# Syslog-ng example configuration for for Debian GNU/Linux
#
# Copyright (c) 1999 anonymous
# Copyright (c) 1999 Balazs Scheidler
# $Id: syslog-ng.conf.sample,v 1.3 2003/05/20 08:57:27 asd Exp $
#
# Syslog-ng configuration file, compatible with default Debian syslogd
# installation.
#

options { long_hostnames(off); flush_lines(0); };

#日志信息来
source src { unix-stream("/dev/log"); internal(); };

#过滤日志级别,这里定义所有级别的日志
filter f_msg { level(debug..emerg); };
#指定产生日志的程序
filter f_program { program("syslog_test"); };

#设置日志信息格式
template t_log { template("<$LEVEL> $YEAR-$MONTH-$DAY $HOUR:$MIN:$SEC $HOST VEAD: $MSGONLY\n"); template-escape(yes); };

#指定本地日志存放文件
destination local_file { file("/var/log/syslog_test.log" template(t_log)); };
#将日志发送到日志服务器或者其他监听程序
destination local_wlogd { udp("192.168.133.99" port(8383)); };
#将日志写入sqlite数据库
destination sqlite { program("/usr/bin/sqlite3 /var/log/system.db"
     template("INSERT INTO logs VALUES NUULL,'$HOST','$FACILITY','$PRIORITY','$LEVEL','$TAG',
'$YEAR-$MONTH-$DAY','$HOUR:$MIN:$SEC','$PROGRAM','$MSG');\n") template-escape(yes); };

#将日志写入mysql数据库
destination mysql { pipe("/tmp/mysql.pipe"
     template("INSERT INTO logs (host, facility, priority, level, tag, date, time, program, msg)    VALUES ( '$HOST', '$FACILITY', '$PRIORITY', '$LEVEL', '$TAG', '$YEAR-$MONTH-$DAY',      '$HOUR:$MIN:$SEC', '$PROGRAM', '$MSG' );\n") template-escape(yes)); };

#记录日志
log { source(src); filter(f_msg); filter(f_program); destination(local_file); };
log { source(src); filter(f_msg); filter(f_program); destination(local_wlogd); };
#log { source(src); filter(f_msg); filter(f_program); destination(sqlite); };
#log { source(src); filter(f_msg); filter(f_program); destination(mysql); };

       linux提 供了syslog函数将日志写到设备文件/dev/log,然后syslogd进程去读取这个文件中的日志。查看内核中sys-syslog 的代码可以发现syslog函数和syslogd在维护一个缓冲区,如果没有启动syslogd进程,而且缓冲区已经满了的话,syslog会将旧的日志 丢弃写入新的日志,这个缓冲区的大小是可以设置的。linux产生的内核错误日志记录在/proc/kmesg中,由klogd进程读取后提交给 syslogd进程。下面是一个使用syslog函数记录日志的例子。
       #include
       #include

      int main()
       {
                syslog(LOG_USER|LOG_EMERG, "this err is just for test syslog-ng");
                syslog(LOG_USER|LOG_ALERT, "this err is just for test syslog-ng");
                syslog(LOG_USER|LOG_CRIT, "this err is just for test syslog-ng");
                syslog(LOG_USER|LOG_ERR, "this err is just for test syslog-ng");
                syslog(LOG_USER|LOG_WARNING, "this err is just for test syslog-ng");
                syslog(LOG_USER|LOG_NOTICE, "this err is just for test syslog-ng");
                syslog(LOG_USER|LOG_INFO, "this err is just for test syslog-ng");
                syslog(LOG_USER|LOG_DEBUG, "this err is just for test syslog-ng");

               return 0;
        }
       syslog函数的用法:man syslog就可以了。第一个参数是priority,是facility及level的组合;后面的参数就是format了。man syslog的时候可以看到其他的几个函数:opensyslog和closesyslog、vsyslog。opensyslog和 closesyslog不是必须得,可以直接使用syslog函数,如果没有使用opensyslog在此函数内部会调用opensyslog。

三、进阶
       通过上述配置文件可以将日志记录到本地日志文件、本地sqlite和mysql数据库,但是这种配置存在着一种缺陷,即:不论是数据库还是日志文件都没有控制其大小。
        鉴于上述的顾虑,可以构造一个专门的服务程序用来写数据库,可以使用类似于“destination local_wlogd { udp("192.168.133.99" port(8383)); };”的思路将消息发送给服务程序,通过服务程序可以控制数据库的大小。对于本地日志文件,可以改写afuser.c使之满足我们的需求。
阅读(4068) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~