syslog 使用方法小结
Syslog 已被许多日志函数采纳,它用在许多保护措施中——任何程序都可以通过 syslog 纪录事件。Syslog 可以纪录系统事件,可以写到一个文件或设备中,或给用户发送一个信息。它能纪录本地事件或通过网络纪录另一个主机上的事件。
Syslog 设备依据两个重要的文件:/etc/syslogd(守护进程)和 /etc/syslog.conf 配置文件,习惯上,多数 syslog 信息被写到 /var/adm 或 /var/log 目录下的信息文件中(messages.*)。一个典型的 syslog 纪录包括生成程序的名字和一个文本信息。它还包括一个设备和一个优先级范围(但不在日之中出现)。
每个 syslog 消息被赋予下面的主要设备之一:
LOG_AUTH——认证系统:login、su、getty 等
LOG_AUTHPRIV——同 LOG_AUTH,但只登录到所选择的单个用户可读的文件中
LOG_CRON——cron 守护进程
LOG_DAEMON——其他系统守护进程,如 routed
LOG_FTP——文件传输协议:ftpd、tftpd
LOG_KERN——内核产生的消息
LOG_LPR——系统打印机缓冲池:lpr、lpd
LOG_MAIL——电子邮件系统
LOG_NEWS——网络新闻系统
LOG_SYSLOG——由 syslogd(8)产生的内部消息
LOG_USER——随机用户进程产生的消息
LOG_UUCP——UUCP 子系统
LOG_LOCAL0~LOG_LOCAL7——为本地使用保留
Syslog 为每个事件赋予几个不同的优先级:LOG_EMERG——紧急情况
LOG_ALERT——应该被立即改正的问题,如系统数据库破坏
LOG_CRIT——重要情况,如硬盘错误
LOG_ERR——错误
LOG_WARNING——警告信息
LOG_NOTICE——不是错误情况,但是可能需要处理
LOG_INFO——情报信息
LOG_DEBUG——包含情报的信息,通常旨在调试一个程序时使用
确认系统内有 syslog 服务
在命令行中输入 syslogd help
查看是否可以执行,如果没有,就不可用。
在最新的 ubuntu 和 centos 等系统中,以及用别的 log 服务替代了 syslog,但是在嵌入式系统中,syslog 使用较为广泛。嵌入式系统中 busybox 自带有 syslog 服务。
配置 syslogd
输入 syslogd help
后,会提示默认的配置文件。我们要查看此文件是否存在,如果不存在我们需要创建一个配置文件如:touch /etc/syslog.conf,同时使用 syslogd -f /etc/syslog.conf 来进行绑定。
syslog.conf 的格式
syslog.conf 文件指明 syslogd 程序纪录日志的行为,该程序在启动时查询配置文件。
如果没有改配置文件的话,默认的会写到 /var/log/messages 中。
该文件由不同程序或消息分类的单个条目组成,每个占一行。对每类消息提供 一个选择域和一个动作域。这些域由tab 隔开:选择域指明消息的类型和优先级;动作域指明 syslogd 接收到一个与选择标准相匹配的消息时所执行的动作。
每个选项是由设备和优先级组成。当指明一个优先级时,syslogd 将纪录一个拥有相同或更高优先级的消息。所以如果指明 ”crit”,那所有标为 crit、alert 和 emerg 的消息将被纪录。每行的行动域指明当选择域选择了一个给定消息后应该把他发送到哪儿。
如下所示:
类型. 级别; 类型. 级别 [TAB] 动作
类型 facility:
保留字段中的“类型”代表信息产生的源头,可以是:
auth 认证系统,即询问用户名和口令
cron 系统定时系统执行定时任务时发出的信息
daemon 某些系统的守护程序的 syslog, 如由 in.ftpd 产生的 log
kern 内核的 syslog 信息
lpr 打印机的 syslog 信息
mail 邮件系统的 syslog 信息
mark 定时发送消息的时标程序
news 新闻系统的 syslog 信息
user 本地用户应用程序的 syslog 信息
uucp uucp 子系统的 syslog 信息
local0..7 种本地类型的 syslog 信息, 这些信息可以又用户来定义
\* 代表以上各种设备
级别 priority:
保留字段中的“级别”代表信息的重要性,可以是:
emerg 紧急,处于 Panic 状态。通常应广播到所有用户;alert 告警,当前状态必须立即进行纠正。例如,系统数据库崩溃;crit 关键状态的警告。例如,硬件故障;err 其它错误;warning 警告;notice 注意;非错误状态的报告,但应特别处理;info 通报信息;debug 调试程序时的信息;none 通常调试程序时用,指示带有 none 级别的类型产生的信息无需送出。如 *.debug;mail.none 表示调试时除邮件信息外其它信息都送出。
动作 action:
“动作”域指示信息发送的目的地。可以是:
/filename 日志文件。由绝对路径指出的文件名,此文件必须事先建立;@host 远程主机;@符号后面可以是 ip, 也可以是域名,默认在 /etc/hosts 文件下 loghost 这个别名已经指定给了本机。user1,user2 指定用户。如果指定用户已登录,那么他们将收到信息;* 所有用户。所有已登录的用户都将收到信息。
具体实例:
我们来看看 /etc/syslog.conf 文件中的实例:
……
*.err;kern.debug;daemon.notice;mail.crit [TAB] /var/adm/messages
……
这行中的“action”就是我们常关心的那个 /var/adm/messages 文件,输出到它的信息源头“selector”是:
- *.err – 所有的一般错误信息;
- kern.debug – 核心产生的调试信息;
- daemon.notice – 守护进程的注意信息;
- mail.crit – 邮件系统的关键警告信息
例如,如果想把所有邮件消息纪录到一个文件中,如下:
#Log all the mail messages in one place
mail.* /var/log/maillog
其他设备也有自己的日志。UUCP 和 news 设备能产生许多外部消息。它把这些消息存到自己的日志(/var/log/spooler)中并把级别限为 ”err” 或更高。例如:
# Save mail and news errors of level err and higher in aspecial file.
uucp,news.crit /var/log/spooler
当一个紧急消息到来时,可能想让所有的用户都得到。也可能想让自己的日志接收并保存。
#Everybody gets emergency messages,plus log them on anther machine
*.emerg *
*.emerg @linuxaid.com.cn
alert 消息应该写到 root 和 tiger 的个人账号中:
#Root and Tiger get alert and higher messages
*.alert root,tiger
有时 syslogd 将产生大量的消息。例如内核(”kern” 设备)可能很冗长。用户可能想把内核消息纪录到 /dev/console 中。下面的例子表明内核日志纪录被注释掉了:
#Log all kernel messages to the console
#Logging much else clutters up the screen
#kern.* /dev/console
用户可以在一行中指明所有的设备。下面的例子把 info 或更高级别的消息送到 /var/log/messages,除了 mail 以外。级别 ”none” 禁止一个设备:
#Log anything(except mail)of level info or higher
#Don't log private authentication messages!
*.info:mail.none;authpriv.none /var/log/messages
在有些情况下,可以把日志送到打印机,这样网络入侵者怎么修改日志都没有用了。通常要广泛纪录日志。Syslog 设备是一个攻击者的显著目标。一个为其他主机维护日志的系统对于防范服务器攻击特别脆弱,因此要特别注意。
有个小命令 logger 为 syslog(3)系统日志文件提供一个 shell 命令接口,使用户能创建日志文件中的条目。
用法:logger
例如:logger This is a test!
它将产生一个如下的 syslog 纪录:Aug 19 22:22:34 tiger: This is a test!
注意不要完全相信日志,因为攻击者很容易修改它的。
syslog 编程
三个函数的原型和说明:
void openlog(char *ident, int option, int facility);void syslog(int priority, char *format, ...);void closelog(void);
priority 是 facility 及 level 的组合,其后参数的用法类似 printf。
option:用于 openlog()的 option 参数可以是以下几个的组合:
- LOG_CONS : 如果送到 system logger 时发生问题,直接写入系统 console。
- LOG_NDELAY : 立即开启连接(通常,连接是在第一次写入讯息时才打开的)。
- LOG_PERROR : 将讯息也同时送到 stderr
- LOG_PID : 将 PID 含入所有讯息中
facility:该参数用来指定何种程式在记录讯息,这可让设定档来设定何种讯息如何处理。
- LOG_AUTH : 安全 / 授权讯息(别用这个,请改用 LOG_AUTHPRIV)
- LOG_AUTHPRIV : 安全 / 授权讯息
- LOG_CRON : 时间守护神专用(cron 及 at)
- LOG_DAEMON : 其它系统守护神
- LOG_KERN : 核心讯息
- LOG_LOCAL0 到 LOG_LOCAL7 : 保留
- LOG_LPR : line printer 次系统
- LOG_MAIL : mail 次系统
- LOG_NEWS : USENET news 次系统
- LOG_SYSLOG : syslogd 内部所产生的讯息
- LOG_USER(default) : 一般使用者等级讯息
- LOG_UUCP : UUCP 次系统
level:决定讯息的重要性. 以下的等级重要性逐次递减:
- LOG_EMERG : 系统无法使用
- LOG_ALERT : 必须要立即采取反应行动
- LOG_CRIT : 重要状况发生
- LOG_ERR : 错误状况发生
- LOG_WARNING : 警告状况发生
- LOG_NOTICE : 一般状况,但也是重要状况
- LOG_INFO : 资讯讯息
- LOG_DEBUG : 除错讯息
syslog 的使用实例:
- 在 /etc/syslog.conf 下加入一行 localN.* pathname
例 local5.* /root/Desktop/test.log - 重新启动 syslog /etc/init.d/syslog restart
- 使用 syslog
#include<stdio.h>
#include<stdlib.h>
#include <syslog.h>
#define SYSNAME "wohawoha"
void Info(void)
{openlog("info",LOG_PID,LOG_LOCAL5);/* 注意这里的数字 5 与第一条里面提到的 local5.* 里的 5 必须相同,并且这个数字的范围为 0 --7*/
syslog(LOG_INFO, "hello %s","woring");
}
void Woring(void)
{openlog("woring",LOG_PID,LOG_LOCAL5);
syslog(LOG_WARNING, "hello %s","test");
}
int main()
{Info();
Woring();
closelog();
return 0;
}
- 进入目录查看内容
例如:进入 /root/Desktop/test.log 这个文件查看里面的内容
Dec 13 12:31:21 localhost info[11750]: hello woring
Dec 13 12:31:21 localhost woring[11750]: hello test