存档

2011年12月 的存档

lua日期与时间操作

2011年12月20日 16hot 没有评论

os.time() <== 返回当前系统的日历时间
os.date() <== 返回本地化的时间字符串,这里是”11/28/08 17:23:37″
os.date(“%x”, os.time()) <== 返回自定义格式化时间字符串(完整的格式化参数),这里是”11/28/08″
os.clock() <== 返回执行该程序CPU花去的时钟秒数,这里是1156.726
附录
完整的格式化参数
这些时间输出的字符串表示是经过本地化的。所以如果是在巴西(葡萄牙语系),”%B” 得到的就是 “setembro”(译者按:大概是葡萄牙语九月?),”%x” 得到的就是 “16/09/98″(月日次序不同)。标记的意义和显示实例总结如下表。实例的时间是在1998年九月16日,星期三,23:48:10。返回值为数字形式的还列出了它们的范围。(都是按照英语系的显示描述的,也比较简单,就不烦了)
%a abbreviated weekday name (e.g., Wed)
%A full weekday name (e.g., Wednesday)
%b abbreviated month name (e.g., Sep)
%B full month name (e.g., September)
%c date and time (e.g., 09/16/98 23:48:10)
%d day of the month (16) [01-31]
%H hour, using a 24-hour clock (23) [00-23]
%I hour, using a 12-hour clock (11) [01-12]
%M minute (48) [00-59]
%m month (09) [01-12]
%p either “am” or “pm” (pm)
%S second (10) [00-61]
%w weekday (3) [0-6 = Sunday-Saturday]
%x date (e.g., 09/16/98)
%X time (e.g., 23:48:10)
%Y full year (1998)
%y two-digit year (98) [00-99]
%% the character ‘%’
事实上如果不使用任何参数就调用date,就是以%c的形式输出。这样就是得到经过格式化的完整时间信息。
注意%x、%X和%c由所在地区和计算机系统的改变会发生变化。
如果该字符串要确定下来(例如确定为mm/dd/yyyy),可以使用明确的字符串格式方式(例如”%m/%d/%Y”)。

分类: LUA 标签:

LUA中的字符串函数库

2011年12月20日 16hot 没有评论

Lua解释器对字符串的支持很有限。一个程序可以创建字符串并连接字符串,但不能截取子串,检查字符串的大小,检测字符串的内容。在Lua中操纵字符串的功能基本来自于string库。

字符串库中的一些函数是非常简单的:

string.len(s) 返回字符串s的长度;
string.rep(s, n) 返回重复n次字符串s的串;你使用string.rep(“a”, 2^20)可以创建一个1M bytes的字符串(比如,为了测试需要);
string.lower(s) 将s中的大写字母转换成小写(string.upper将小写转换成大写)。如果你想不关心大小写对一个数组进行排序的话,你可以这样:
table.sort(a, function (a, b) return string.lower(a) < string.lower(b) end)
string.upper(s) 将s中的小写字母转换成大写
string.upper和string.lower都依赖于本地环境变量。所以,如果你在 European Latin-1环境下,表达式:
string.upper("a??o") --> “A??O”
string.sub(s,i,j) 函数截取字符串s的从第i个字符到第j个字符之间的串。Lua中,字符串的第一个字符索引从1开始。你也可以使用负索引,负索引从字符串的结尾向前计数:-1指向最后一个字符,-2指向倒数第二个,以此类推。所以, string.sub(s, 1, j)返回字符串s的长度为j的前缀;string.sub(s, j, -1)返回从第j个字符开始的后缀。如果不提供第3个参数,默认为-1,因此我们将最后一个调用写为string.sub(s, j);string.sub(s, 2, -2)返回去除第一个和最后一个字符后的子串。
s = “[in brackets]”
print(string.sub(s, 2, -2)) –> in brackets
记住:Lua中的字符串是恒定不变的。string.sub函数以及Lua中其他的字符串操作函数都不会改变字符串的值,而是返回一个新的字符串。一个常见的错误是:
string.sub(s, 2, -2)
认为上面的这个函数会改变字符串s的值。如果你想修改一个字符串变量的值,你必须将变量赋给一个新的字符串:
s = string.sub(s, 2, -2)
string.char函数和string.byte函数用来将字符在字符和数字之间转换。string.char获取0个或多个整数,将每一个数字转换成字符,然后返回一个所有这些字符连接起来的字符串。string.byte(s, i)将字符串s的第i个字符的转换成整数;第二个参数是可选的,缺省情况下i=1。下面的例子中,我们假定字符用ASCII表示:

print(string.char(97)) –> a
i = 99; print(string.char(i, i+1, i+2)) –> cde
print(string.byte(“abc”)) –> 97
print(string.byte(“abc”, 2)) –> 98
print(string.byte(“abc”, -1)) –> 99

上面最后一行,我们使用负数索引访问字符串的最后一个字符。
Lua提供了string.format()函数来生成具有特定格式的字符串, 函数的第一个参数是格式(formatstring), 之后是对应格式中每个代号的各种数据. 由于格式字符串的存在, 使得产生的长字符串可读性大大提高了. 这个函数的格式很像C语言中的printf().函数string.format在用来对字符串进行格式化的时候,特别是字符串输出,是功能强大的工具。这个函数有两个参数,你完全可以照C语言的printf来使用这个函数。第一个参数为格式化串:由指示符和控制格式的字符组成。指示符后的控制格式的字符可以为:十进制’d';十六进制’x';八进制’o';浮点数’f';字符串’s'。在指示符’%'和控制格式字符之间还可以有其他的选项:用来控制更详细的格式,比如一个浮点数的小数的位数:
格式字符串可能包含以下的转义码:
%c – 接受一个数字, 并将其转化为ASCII码表中对应的字符
%d, %i – 接受一个数字并将其转化为有符号的整数格式
%o – 接受一个数字并将其转化为八进制数格式
%u – 接受一个数字并将其转化为无符号整数格式
%x – 接受一个数字并将其转化为十六进制数格式, 使用小写字母
%X – 接受一个数字并将其转化为十六进制数格式, 使用大写字母
%e – 接受一个数字并将其转化为科学记数法格式, 使用小写字母e
%E – 接受一个数字并将其转化为科学记数法格式, 使用大写字母E
%f – 接受一个数字并将其转化为浮点数格式
%g(%G) – 接受一个数字并将其转化为%e(%E, 对应%G)及%f中较短的一种格式
%q – 接受一个字符串并将其转化为可安全被Lua编译器读入的格式
%s – 接受一个字符串并按照给定的参数格式化该字符串
为进一步细化格式, 可以在%号后添加参数. 参数将以如下的顺序读入:
(1) 符号: 一个+号表示其后的数字转义符将让正数显示正号. 默认情况下只有负数显示符号.
(2) 占位符: 一个0, 在后面指定了字串宽度时占位用. 不填时的默认占位符是空格.
(3) 对齐标识: 在指定了字串宽度时, 默认为右对齐, 增加-号可以改为左对齐.
(4) 宽度数值
(5) 小数位数/字串裁切: 在宽度数值后增加的小数部分n, 若后接f(浮点数转义符, 如%6.3f)则设定该浮点数的小数只保留n位, 若后接s(字符串转义符, 如%5.3s)则设定该字符串只显示前n位.
在这些参数的后面则是上述所列的转义码类型(c, d, i, f, …).

print(string.format(“pi = %.4f”, PI))
–> pi = 3.1416
d = 5; m = 11; y = 1990
print(string.format(“%02d/%02d/%04d”, d, m, y))
–> 05/11/1990
tag, title = “h1″, “a title”
print(string.format(“<%s>%s“, tag, title, tag))
–>

a title

第一个例子,%.4f代表小数点后面有4位小数的浮点数。第二个例子%02d代表以固定的两位显示十进制数,不足的前面补0。而%2d前面没有指定0,不足两位时会以空白补足。对于格式串部分指示符得详细描述清参考lua手册,或者参考C手册,因为Lua调用标准C的printf函数来实现最终的功能。

以下是一些例子:

string.format(“%%c: %c”, 83) 输出S
string.format(“%+d”, 17.0) 输出+17
string.format(“%05d”, 17) 输出00017
string.format(“%o”, 17) 输出21
string.format(“%u”, 3.14) 输出3
string.format(“%x”, 13) 输出d
string.format(“%X”, 13) 输出D
string.format(“%e”, 1000) 输出1.000000e+03
string.format(“%E”, 1000) 输出1.000000E+03
string.format(“%6.3f”, 13) 输出13.000
string.format(“%q”, “One\nTwo”) 输出”One\
  Two”
string.format(“%s”, “monkey”) 输出monkey
string.format(“%10s”, “monkey”) 输出 monkey
string.format(“%5.3s”, “monkey”) 输出 mon

分类: LUA, 转载 标签:

下一代系统日志工具(syslog-ng) 转载

2011年12月20日 16hot 没有评论

  1.syslog-ng简介

  在UNIX系统的维护中,经常会忽略系统事件的处理。经常检查系统日志对于保持系统的安全和正常运行是至关重要的。但是,系统日志中有太多的噪音,一些不是很重要的信息会掩盖重要的信息。目前的工具很难甄别出系统管理者感兴趣的信息。

  用户可以通过指定facility/priority,把消息发到不同的地方。系统预先定义了12+8个(mail、news、auth等)facility,八个不同的优先级(alert到debug)。

  这其中存在一个问题,大量的程序使用同样的facility(daemon),把日志都保存到一个文件中(messages),即使它们毫无关联。这样就造成用户很难筛选出自己感兴趣的东西。

  第二个问题是,大多数的程序无法改变日志配置,只能修改软件的源代码。

  因此,使用facility作为过滤不是一个好办法。最好能够有一些runtime选项,使用这些选项指定日志facility,建立新的facility。

  syslog-ng的一个设计原则就是建立更好的消息过滤粒度。syslog-ng能够进行基于内容和优先权/facility的过滤。另一个设计原则是更容易进行不同防火墙网段的信息转发,它支持主机链,即使日志消息经过了许多计算机的转发,也可以找出原发主机地址和整个转发链。最后的一个设计原则就是尽量使配置文件强大和简洁。

  2.消息路径

  一个消息路径是由一个或者多个日志消息源、一个或者多个过滤规则以及一个或者多个日志消息目的组成的。来自某个日志消息源的消息进入syslog-ng,如果消息命中某条规则,syslog-ng就把它发送到对应的日志消息目的。

  消息源

  一些日志消息源驱动器(source driver)组成一个消息源,这些驱动器使用给定的方法收集日志消息。譬如,有的syslog()系统调用使用的AF_UNIX、SOCK_STREAM风格的套接字源驱动器。

  在配置文件中,你可以使用下面的语法声明一个日志消息源:

  source { source-driver(params); source-driver(params); … };

  identifier是给定消息源的唯一标志,但是这个标志符不能和保留字有冲突。

  你可以控制使用哪个驱动器来收集日志消息,因而你需要知道你的系统和他的内部syslogd是如何通讯的。下面介绍一下某些平台中,syslogd是如何工作的。

  Linux 一个叫作/dev/log的SOCK_STREAM unix套接字
  BSD 一个叫作/var/run/log的SOCK_STREAM unix套接字
  Solaris(2.5或以下) 一个叫做/dev/log的SVR4风格的STREAMS设备

  solaris(2.6或以上) 除了2.6之前版本使用的STREAMS设备之外,使用了一种新的多线程IPC方法调用门。默认情况下,这个调用门是/etc/syslog_door,由syslogd使用。

  在syslog-ng中,每个可能的通讯机制都有对应的日志消息源驱动器。例如:如果要打开一个SOCK_DGRAM风格的UNIX套接字进行通讯,你就会用到unix-dgram驱动器,同样SOCK_STREAM式的通讯需要unix-stream驱动器。

  例2-1.Linux中的一个源指令

  source src { unix-stream(”/dev/log”); internal(); udp(ip(0.0.0.0) port(514)); };

  驱动器可以使用参数,参数有些是必需的,有些是可选的。必需的参数一般在前面。上面的指令中,  /dev/log就是必需参数。

  下面是可用的源驱动器:

  internal syslog-ng内部产生的消息
  unix-stream 打开指定的SOCK_STREAM模式的unix套接字,接收日志消息
  unix-dgram 打开指定的SOCK_DGRAM模式的unix套接字,接收日志消息
  file 打开指定的文件读取日志信息
  pipe,fifo 打开指定的管道或者FIFO设备,读取日志信息
  tcp 在指定的TCP端口接收日志消息
  udp 在指定的UDP端口接收日志消息
  sun-stream(s) 在solaris系统中,打开一个(多个)指定的STREAM设备,从其中读取日志消息

  过滤器

  在syslog-ng中,过滤器执行日志路由。你可以使用syslog-ng的内部函数编写布尔表达式,来决定日志信息是否通过。

  过滤器也都有唯一的标志符,语法如下:

  fileter { expression;};

  表达式中可以包含逻辑操作符(and、or、not)和函数。

  例2-2.一个搜索来自blurp主机,包含deny的日志消息的过滤指令。

  filter f_blurp_deny { host(”blurp”) and match(”deny”); };
  下面是syslog-ng的过滤函数:

  facility() 根据设备选择日志消息
  level()或者priority() 根据优先级选择日志消息
  program() 日志消息的程序名是否匹配一个正则表达式
  host() 日志消息的主机名是否和一个正则表达式匹配
  match() 对日志消息的内容进行正则匹配
  filter() 调用另一条过滤规则并判断它的值

  关于这些函数,后面的章节中将有更为详细的介绍。

  有一个特殊的过滤器标志符DEFAULT,用于捕获所有没有处理的日志消息。例如:

  options { keep_hostname(yes); };
  source src { unix-stream(”proba2″); internal(); };
  destination ftpd { file(”ftplog”); };
  destination named { file(”namedlog”); };
  destination daemon { file(”daemonlog”); };
  filter f_ftpd { match(”ftp”); };
  filter f_named { match(”named”); };
  filter f_daemon { facility(daemon); };
  log { source(src); filter(f_ftpd); destination(ftpd); };
  log { source(src); filter(f_named); destination(named); };
  log { source(src); filter(f_daemon); filter(DEFAULT); destination(daemon); };

  在这个例子中,default过滤器捕获所有没有被f_ftpd和f_named过滤器捕获的facility是daemon的日志消息。

  日志消息目的

  destination指定匹配过滤规则的日志消息的去处。和日志消息源类似,日志消息目的可以包括一些目的驱动器,指定日志的派发方向。你需要使用如下语法来声明日志消息目的:

  destination { destination-driver(params); destination-driver(params); … };
下面是syslog-ng支持的日志消息目的驱动器:

  file 日志消息写到指定的文件
  fifo,pipe 把日志消息写到指定的管道
  unix-stream 把日志消息发送到给定的SOCK_STREAM类型的UNIX套接字(Linux)
  unix-dgram 把日志消息发送到给定的SOCK_DGRAM类型的UNIX套接字(BSD)
  udp 把日志消息发送到指定主机的UDP端口
  TCP 把日志消息发送到指定主机的TCP端口
  usertty 如果用户登录,把日志发送到指定的终端
  program fork并启动指定的程序,把日志消息发送到这个进程的标准输出。

  详情请参考下面的章节。

  日志路径

  前面的章节中,我们学习了如何定义消息源、过滤器和消息目的。现在我们要把这些结合起来形成一条完整的指令。凡是来源于指定的消息源,匹配所有指定的过滤器,并送到指定的地址。其语法如下:

  log { source(s1); source(s2); …
  filter(f1); filter(f2); …
  destination(d1); destination(d2); … };

  日志路径中的成员是顺序执行的。

  选项

  你可以通过设置一些选项来改变syslog-ng的行为。设置选项的语法一般是:

  options { option1(params); option2(params); … };

  每个选项也可以有自己的参数。
  以下是syslog-ng支持的参数:

名字 参数类型 描述
time_reopen() 数字 一个断开的连接重新连接之前需要等待的时间
time_reap() 数字 一个闲置的目标文件关闭之前需要等待的时间
sync_freq() 数字 在写入文件之前,可以缓冲的日志消息行数
mark_freq() 数字 目前尚未实现
log_fifo_size() 数字 输出队列的行数
chain_hostnames() yes/no 打开/关闭主机名链(用于日志转发)
use_time_recvd() yes/no 使用收到日志消息的时间,不用日志消息中指定的时间
use_dns() yes/no 打开/关闭DNS查询功能。因为DNS查询无法返回会造成syslog-ng处于阻塞状态,从而造成拒绝服务攻击。为了避免这种情况的出现,应该使用防火墙严格保护使用syslog-ng的网络节点,并确认syslog-ng使用的所有主机都是可以解析的。
use_fqdn() yes/no 使用完整的域名
gc_idle_threshold() 数字 当syslog-ng空闲时,设置其进入垃圾信息收集状态的阀值。一旦分配的对象数达到了这个数字,syslog-ng就启动垃圾信息收集状态。默认值是1000。
gc_busy_threshold() 数字 当syslog-ng忙时,设置其进入垃圾信息收集状态的阀值。一旦分配的对象数达到这个数字,syslog-ng就启动垃圾信息收集状态。默认值是3000。

  3.参考

  本章,将详细介绍配置文件中使用的驱动器和选项。

  消息源驱动器
  internal()

  所有syslog-ng内部产生的日志消息都来自这个日志消息源。如果你需要syslog-ng自身山城的警告、错误和提醒信息,就需要在配置文件中加入以下声明:

  Declaration: internal()

  如果这个消息源驱动器没有被引用,syslog-ng会向你输出报警信息。

  例3-1.使用inernal()日志消息源驱动器

  source s_local { internal(); };
  unix-stream()和unix-dgram()

  这两个日志消息源驱动器比较相似,都打开AF_UNIX类型的套接字,在套接字上监听日志消息。unix-stream()主要用在Linux,使用SOCK_STREAM参数,是面向连接的,不会造成日志消息的丢失;unix-dgram()用在BSD系统上,使用SOCK_DGRAM参数,是无连接的,如果系统过载,会造成日志消息丢失。

  在使用面向连接的协议时,为了避免造成拒绝服务攻击,需要对同时接受的连接数量进行闲置。这由max-connections()参数实现。

  Declaration:
  unix-stream(filename [options]);
  unix-dgram(filename [options]);
  以下选项可以用于unix-stream和unix-dgram日志消息源驱动器的声明:

名字 参数数据类型 描述
owner() 字符串 设置套接字的uid,默认是:root
group() 字符串 设置套接字的gid,默认是:root
perm() 数字 设置权限掩码。八进制数字以0开头,例如:0755表示rwxr-xr-x。
keep-alive() yes/no 当syslog-ng重启动,选择是否保持连接,只用于unix-stream()。默认是yes
max-connections() 数字 同时打开的连接的数目限制,只用于unix-stream()日志消息源驱动器。默认是10。

  例3-2.使用unix-stream()和unix-dgram()日志消息源驱动器

  source s_stream { unix-stream(”/dev/log” max-connections(10)); };
  source s_dgram { unix-dgram(”/var/run/log”); };
  tcp()和udp()

  使用这两个日志消息源驱动器,你可以使用TCP或者UDP协议从网络上接受日志消息。

  UDP是一种简单的用户数据报协议,使用这种协议可能会发生日志消息的丢失,而且这种协议没有重传机制;TCP是一种面向连接的传输层协议,不会造成日志消息的丢失。

  这两种消息源驱动器都不需要位置参数。默认情况下,syslog-ng会绑定到0.0.0.0:514,在所有有效的端口上监听。可以使用localip()参数来限制其接受连接的端口。

  注意:514端口是rshell使用的端口,因此如果syslog-log和rshell同时使用,你需要为syslog-ng选择另外的端口。

  Declaration:
  tcp([options]);
  udp([options]);
  下面是udp()和tcp()可用的选项:

选项名 数据类型 描述 默认值
ip或者iplocalip 字符串 绑定的IP地址 0.0.0.0

  udp()和tcp()使用示例:

  source s_tcp { tcp(ip(127.0.0.1) port(1999); max-connections(10); };
  source s_udp { udp(); };
  file()

  通常,内核会把自己的消息送到一个特殊的文件(BSD系统是/dev/kmsg,Linux系统是/proc/kmsg),因此你需要使用file()日志消息源驱动器来指定这个文件。在Linux中,klogd会读取内核信息,并转发到syslogd进程,klogd在转发之前会对内核消息进行处理,使用/boot/System.map文件中的符号名代替原来的地址。如果你不需要这种功能,可以使用-x参数运行klogd。

  Declaration:
  file(filename);
  file()日志消息源驱动器示例:
  source s_file { file(”/proc/kmsg”); };
  pipe()

  pipe日志消息源驱动器打开一个命名管道,在这个命名管道监听日志消息。在HP-UX系统中,它用于内部日志消息的获得。

  Declaration:
  pipe(filename);

  注意首先你需要使用mkfifo建立命名管道。

  例3-6.使用pipe()日志消息源驱动器

  source s_pipe { pipe(”/dev/log”); );
  sun-streams()

  solaris使用STREAMS API把日志消息发送到syslogd进程。你必须在编译syslog-ng时加入这个特征。
新版solaris(>=2.51)中,STREAMS使用一个新的IPC调用门来投递日志消息。syslog-ng支持这种IPC机制。

  日志消息目的驱动器

  日志目的驱动器把日志消息从syslog-ng输出到其它地方:一个文件或者一个网络套接字。

  file()

  file是syslog-ng最重要的日志消息目的驱动器之一。使用它,你可以把日志消息定向到一些文件中。

  在设置日志目的文件时,可以使用宏,从而使用一个简单的file日志消息目的驱动器就可以设置很多目的文件。和PHP/PERL一样,宏也是以$开头。

  如果文件所在的目录不存在,则由create_dirs()来决定是否创建这个目录。
  警告:由于syslog-ng必须跟踪建立的每个文件,因此会消耗一些内存。如果在60秒钟内(也可以由time_reap选项设置)没有新的消息到达某个文件,syslog-ng就会关闭这个文件,释放占用的资源。如果目的文件数和所需内存超出日志服务器的的能力,就会造成拒绝服务攻击。

  最危险的宏是$PROGRAM,因此在不可信的环境中不要使用这个宏。

  以下是可以用于扩展file的宏:

  HOST 日志消息的源发主机名。如果日志消息穿过几个主机,并且chain_hostname()功能已经打开,就使用第一个主机名。

  FACILITY 日志消息来自的日志设备
  PRIOPRITY/LEVEL 日志消息的优先级
  PROGRAM 发送日志消息的程序
  YEAR 发送日志消息的年份,这个宏既可以指定日志消息送出的时间,也可以指定日志消息收到的时间。这由use_time_recvd()选项控制
  MONTH 发送日志消息的月份
  DAY 发送日志消息的日子
  HOUR 顾名思义,嘿嘿:)
  MIN 同上
  SEC 当然是秒了^_^
  file()日志消息目的驱动器的选项:

选项 数据类型 描述 默认值
log_file_size() 数字 输出文件的条目数 使用全局设定
sync_freq() 数字 当日志消息达到一定数目就写入文件 使用全局设定
encrypt() yes/no 给日志文件加密 使用全局设定
compress() yes/no 压缩日志文件 使用全局设定
owner() 字符串 指定日志文件的所有者 root
group() 字符串 指定日志文件所有者的组 root
perm() 数字 建立时日志文件的权限掩码 0600
dir_per() 数字 建立目录时的权限掩码 0600
create_dirs() yes/no 如果目录不存在就建立 no

  pipe()

  syslog-ng通过pipe()日志消息目的驱动器把日志消息发送到/dev/xconsole之类的命名管道。

  unix-stream()和unix0dgram()

  syslog-ng通过这两个日志消息目的驱动器把日志消息发送到一个SOCK_STREAM或者SOCK_DGRAM模式的UNIX套接字。

  udp()和tcp()

  使用TCP或者UDP协议把日志消息送到本地网络上或者internet上的另外的主机。

  usertty()

  syslog-ng使用这个日志消息目的驱动器把日志消息送到一个登录用户使用的终端。

  program()

  program()驱动器fork出一个进程,使用给定的参数执行一个特定的程序,然后把日志消息送到这个进程的标准输入设备。

  4.优化syslog-ng

  syslog-ng的默认设置是针对单服务器或者工作站的,而对于一个网络的中央日志主机却远远不够。因此,需要对其进行一些调整和优化。
  设置垃圾收集参数

  syslog-ng有自己的垃圾收集器,而且一旦进入垃圾收集状态就不再接受日志消息。从而造成非连接的传输协议的信息丢失。因此,需要对syslog-ng的垃圾收集状态进行控制,你可以通过以下两个选项来控制其垃圾收集状态。

  gc_idle_threshold()

  这个选项能够设置垃圾收集器在syslog-ng处于空闲状态时的阀值。如果分配的的对象达到这个数字,而且系统处于空闲状态(100msec内没有日志消息到达),syslog-ng就启动垃圾收集器。此时系统处于空闲状态,因此基本不会造成日志信息的丢失。这个值应该比较小,不过要大于已分配对象的最小值。已分配对象的最小值取决于你的配置,也可以通过-v命令行参数指定。

  gc_busy_threshold()

  如果syslog-ng正忙于接受日志消息(日志消息的间隔小于100msec),为了防止其吃掉所有内存,也应该运行垃圾收集器。这个值应该比较高,以便在正常情况下不打断日志消息的接收。

  设置输出队列的大小

  为了防止发送日志的daemon程序阻塞,syslog-ng一直在读取其向内的日志通道。如果输出队列已满,就可能造成日志消息的丢失。因此,设置输出队列的大小非常重要,你可以设置全局输出队列的大小,也可以为每个日志消息驱动器设置输出队列的大小。

  options { log_fifo_size(1000); };

  或者

  destination d_dmessages { file(”/var/log/messages” log_fifo_size(1000); };

  输出队列的大小应该合理,这对于大量的日志消息涌来特别重要。如果蜂拥而至的日志信息占据了目标通道的所有带宽,syslog-ng能够把日志消息消息保存到输出队列中,等高峰过去再发出。

  当然,syslog-ng不能测试你的网络带宽,因此如果目的主机在一个噪音很大的网络上,而且日志流量超过网络带宽,syslog-ng也无能为力。

  设置同步(sync)参数

  syslog-ng一般先对日志消息进行缓存。当达到一定的数量,就写入磁盘。注意syslog-ng是对每条日志消息分别使用write()系统调用,而不是成匹写入(why?I can’t understand*_*)。
source s_sys { file (“/proc/kmsg” log_prefix(“kernel: “)); unix-stream (“/dev/log”); internal(); };
source s_udp { udp(); };
destination d_cons { file(“/dev/console”); };
destination d_mesg { file(“/var/log/messages”); };
destination d_auth { file(“/var/log/secure”); };
destination d_mail { file(“/var/log/maillog”); };
destination d_spol { file(“/var/log/spooler”); };
destination d_boot { file(“/var/log/boot.log”); };
destination d_cron { file(“/var/log/cron”); };
destination d_mlal { usertty(“*”); };

destination d_network { file(“/var/log/network”); };
filter f_filter1 { facility(kern); };
filter f_filter2 { level(info) and
not (facility(mail)
or facility(authpriv) or facility(cron)); };
filter f_filter3 { facility(authpriv); };
filter f_filter4 { facility(mail); };
filter f_filter5 { level(emerg); };
filter f_filter6 { facility(uucp) or
(facility(news) and level(crit)); };
filter f_filter7 { facility(local7); };
filter f_filter8 { facility(cron); };
#log { source(s_sys); filter(f_filter1); destination(d_cons); };
log { source(s_sys); filter(f_filter2); destination(d_mesg); };
log { source(s_sys); filter(f_filter3); destination(d_auth); };
log { source(s_sys); filter(f_filter4); destination(d_mail); };
log { source(s_sys); filter(f_filter5); destination(d_mlal); };
log { source(s_sys); filter(f_filter6); destination(d_spol); };
log { source(s_sys); filter(f_filter7); destination(d_boot); };
log { source(s_sys); filter(f_filter8); destination(d_cron); };

destination d_pipe { pipe(“/tmp/mysql.pipe”
template(“INSERT INTO logs (host, facility, priority, level, tag, date, time, program, msg) VALUES ( ‘$HOST’, ‘$FACILITY’, ‘$PRIORIT
Y’, ‘$LEVEL’, ‘$TAG’, ‘$YEAR-$MONTH-$DAY’, ‘$HOUR:$MIN:$SEC’, ‘$PROGRAM’, ‘$MSG’ );\n”) template-escape(yes));
};log { source(s_udp); destination(d_pipe); };
log { source(s_udp); destination(d_network); };
syslog.sql
CREATE DATABASE syslog;
USE syslog;
CREATE TABLE logs (
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 + mysql + php-syslog-ng 的安裝筆記,用以集中數台Linux主機的 logs 於 Mysql database 上以利於檢視分析.
如有任何錯誤請不吝指正.

http://samlin2004.myweb.hinet.net/docs/log/syslog-ngInstallationGuide.htm

Centralized syslog-ng to Mysql Installation Guide
——————————————————————————–

1.Requirement

OS: Red Hat 9.0
Database: MySQL 4.0.20
Web Server: Apache2
PHP Supported.

Packages:
syslog-ng-1.6.5.tar.gz
libol-0.3.14.tar.gz
php-syslog-ng-2.5.1.tar.gz
 

2.Installation

2.1 Install libol-0.3.14.tar.gz

The Libol package contains support libraries needed by Syslog-ng.

2.1.1 Prepare Libol for compilation
#tar zxvf libol-3.0.14.tar.gz
#./configure –prefix=/usr –enable-shared

2.1.2 Compile Libol
#make

2.1.3 Install
#make install

2.2 Install syslog-ng-1.6.5.tar.gz

2.2.1 Prepare Syslog-ng for compilation
#tar zxvf syslog-ng-1.6.5.tar.gz
#./configure –prefix=/usr –sysconfdir=/etc

2.2.2 Compile Syslog-ng
#make

2.2.3 Install
#make install 

2.3 Extract php-syslog-ng-2.5.1.tar.gz

Extract php-syslog-ng-2.5.1.tar.gz under Apache’s document root (ex: /usr/local/apache2/htdocs)
 

3.Configuration

3.1 Create Database Schema

3.1.1 Edit syslog-ng.sql script for creating log database schema

=== syslog-ng.sql script start here ===

CREATE DATABASE syslog;

USE syslog;

CREATE TABLE logs (
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.sql script end here ===

3.1.2 Run the command to install the database into mysql.

#mysql -u YOURACCOUNT -p < syslog-ng.sql 

3.2 Edit syslog-ng.conf

Edit syslog-ng.conf (default installation path will be /usr/local/etc/syslog-ng/ depends on your installation prefix argument)

=== Configuration file start here ===

options
{
chain_hostnames(no);
create_dirs (no);
dir_perm(0755);
dns_cache(yes);
keep_hostname(yes);
log_fifo_size(204);
log_msg_size(8192);
long_hostnames(on);
perm(0644);
stats(3600);
sync(0);
time_reopen (10);
use_dns(yes);
use_fqdn(yes);
};

#----------------------------------------------------------------------
# Sources
#----------------------------------------------------------------------
# For Linux
#----------------------------------------------------------------------
source s_stream
{ unix-stream("/dev/log"; };

source s_internal
{ internal(); };

source s_kernel
{ pipe("/proc/kmsg" log_prefix("kernel: "); };

source s_tcp
{ tcp(port(4800) keep-alive(yes) max_connections(100)); };

#----------------------------------------------------------------------
# Piping method
#----------------------------------------------------------------------
destination database { 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', '$HOURMINSEC', '$PROGRAM', '$MSG' );\n" template-escape(yes)); };

#----------------------------------------------------------------------
# Logging to a database
#----------------------------------------------------------------------

log { source(s_stream);
source(s_internal);
source(s_kernel); destination(database); };

=== Configuration file end here === 

3.3 Pipe and startup script

3.3.1 Setup syslog-ng run as a daemon

(1)Edit /etc/rc.d/init.d/syslog-ng as below,

=== syslog-ng script start here ===

################################################################################
#
# Program: syslog-ng init script for Red Hat
#
################################################################################
# the following information is for use by chkconfig
# if you are want to manage this through chkconfig (as you should), you must
# first must add syslog-ng to chkconfig's list of startup scripts it
# manages by typing:
#
# chkconfig --add syslog-ng
#
# DO NOT CHANGE THESE LINES (unless you know what you are doing)
# chkconfig: 2345 12 88
# description: syslog-ng is the next generation of the syslog daemon. \
# syslog-ng gives you the flexibility of logging not only by facility and \
# severity, but also by host, message content, date, etc. it can also replace \
# klogd's function of logging kernel messages
#
# This following block of lines is correct, do not change! (for more info, see
# http://www.linuxbase.org/spec/refspecs/LSB_1.1.0/gLSB/facilname.html)
### BEGIN INIT INFO
# Provides: $syslog
### END INIT INFO
################################################################################
#
# This is an init script for syslog-ng on the Linux platform.
#
# It totally relies on the Redhat function library and works the same
# way as other typical Redhat init scripts.
#
#
# Platforms (tested): Linux (Redhat 7.3)
#
#
# Author: Gregor Binder ;
# Changed: October 10, 2000
#
# Last Changed: September 27, 2002
# Updated by: Diane Davidowicz
# changes: Brought the start script up to snuff as far as compliance
# with managing the startup script through chkconfig;
# added PATH variable ability to hook in path to syslog-ng (if
# its necessary); converted init script format to the
# standard init script format in Red Hat (7.3 to be exact)
# including using the /etc/sysconfig/syslog-ng file to
# managed the arguments to syslog-ng without changing this
# script, and disabled klogd but noted where and under what
# conditions it should be enabled. HAPPY LOGGING.
#
# Copyright (c) 2000 by sysfive.com GmbH, All rights reserved.
#
#
################################################################################
#
# configuration
#

INIT_PROG=”/usr/local/sbin/syslog-ng” # Full path to daemon
INIT_OPTS=”" # options passed to daemon

#
# Source Redhat function library.
#
. /etc/rc.d/init.d/functions

# Tack on path to syslog-ng if not already in PATH
SYSLOGNG_PATH=”:/usr/local/sbin”

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin
INIT_NAME=`basename “$INIT_PROG”`

# /etc/sysconfig/ is the standard way to pull in options for a daemon to use.
# Source config
if [ -f /etc/sysconfig/syslog-ng ] ; then
. /etc/sysconfig/syslog-ng
else
SYSLOGNG_OPTIONS=
fi

RETVAL=0

umask 077
ulimit -c 0

# See how we were called.
start() {
echo -n “Starting $INIT_PROG: ”
#daemon $INIT_PROG $SYSLOGNG_OPTIONS
daemon –check $INIT_PROG “$INIT_PROG $INIT_OPTS”
RETVAL=$?
echo

[ $RETVAL -eq 0 ] && touch “/var/lock/subsys/${INIT_NAME}”
return $RETVAL
}

stop() {

echo -n “Stopping $INIT_PROG: ”
killproc $INIT_PROG
RETVAL=$?
echo

[ $RETVAL -eq 0 ] && rm -f “/var/lock/subsys/${INIT_NAME}”
return $RETVAL

}

rhstatus() {
status $INIT_PROG
}

restart() {
stop
start
}

case “$1″ in
start)
start
;;
stop)
stop
;;
status)
rhstatus
;;
restart|reload)
restart
;;
condrestart)
[ -f /var/lock/subsys/syslog-ng ] && restart || :
;;
*)
echo $”Usage: $0 {start|stop|status|restart|reload}”
exit 1
esac

exit $?

=== syslog-ng script end here ===

(2)Set as startup script

#chmod ugo+x /etc/rc.d/init.d/syslog-ng
#chkconfig –add syslog-ng 

3.3.2 Setup mysql-pipe file run as startup

(1)Edit /etc/rc.d/init.d/sqlsyslogd as below,

=== sqlsyslogd script start here ===

#!/bin/bash
#
# sqlsyslogd This is a daemon that takes syslog-ng input and pipe it into
# a MySQL database.
#
# chkconfig: 2345 98 10
# description: sqlsyslogd bridges syslog-ng and mysql.
# author: Josh Kuo Thu 2004/08/12 13:21:56 PDT

. /etc/rc.d/init.d/functions

case “$1″ in
start)
if [ -x /tmp/mysql.pipe ]; then
mkfifo /tmp/mysql.pipe
else
# if the service is already running, do not start another one
PIDS=`pidofproc mysql`
if [ "$PIDS" ]; then
echo “sqlsyslogd is already running.”
exit 1
fi
mysql -u YOURACCOUNT -h YOURMYSQLSERVERNAME -pYOURPASSWORD syslog < /tmp/mysql.pipe &

#If you need to collect apache logs into mysql, uncomment the following two lines.
#tail -f /usr/local/apache2/logs/access_log | logger -p info -t apache &
#tail -f /usr/local/apache2/logs/error_log | logger -p notice -t apache &

fi
;;
stop )
killproc mysql
#If you need to collect apache logs into mysql, uncomment the next line.
#killproc tail
;;

*)
echo "Usage: sqlsyslogd {start|stop}"
exit 1;
esac
exit 0;
=== sqlsyslogd script end here ===

(2)Set as startup script

#chmod ugo+x /etc/rc.d/init.d/sqlsyslogd
#chkconfig --add sqlsyslogd

3.4 Start the services

Run the following command or reboot the system.

#service syslog-ng start
#service sqlsyslogd start
 

4.Syslog-ng Monitor
4.1 Modify db_fns.php

(1)Configure the database function of php include file. YOURDOCROOT/YOURFOLDERNAME/includes/db_fns.php

=== db_fns.php start here ===

function db_connect_syslog()
{
$result = mysql_pconnect("YOURMYSQLSERVERNAME", "YOURACCOUNT", "YOURPASSWORD";
if (!$result)
return false;
if (!mysql_select_db("syslog")
return false;

return $result;
}

?>;

分类: BSD/linux 标签:

FreeBSD 9.0-STABLE + KMS补丁[分享]

2011年12月4日 16hot 2 条评论

由于kib提供的KMS补丁是基于HEAD版本的,有人提取了9.0-STABLE的版本补丁出来。

下面是原始下载地址:

https://docs.google.com/open?id=0BxbPi2OX4_B-NDcwZGI1OTAtOTQxOC00YmMxLTg5ZjEtNmIxYTY0M2I0OWI5

访问不了docs.google.com 兄弟,可以从下面地址下载:

http://www.16hot.com/tmp/drm-all.12.3-stable9.patch

打补丁:
代码:

# cd /usr/src
# patch -p3 < drm-all.12.3-stable9.patch

之后是编译和安装内核……

注:我已经使用12.3版本一天左右时间,目前没有发现异常。之前是一直用10.3。

分类: BSD/linux 标签: ,