一、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使之满足我们的需求。
阅读(4085) | 评论(0) | 转发(0) |