syslog的初级教程

出处:Linux系统管理手册

笔记:Zauc

syslog是xnix最为重要和最有特点的一个工具。它几乎可以把你想记录的日志都记录下来。系统默认的记录位置一般为/var/log/下。

但是每个发行版本默认所记录的内容各不相同,但是大体以下几个日志是肯定有的

文件

程序

出处

频率

内容

message

许多

syslog

每周

最主要的系统日志文件

dmesg

内核

硬连接

内核消息缓冲的转储

wtmp

login

硬连接

每月

登录记录(二进制)

lastlog

login

硬连接

每个用户上次登录的时间(二进制)

wtmp和lastlog可以通过last程序来解读这些信息。

现在开始了解一下syslog,syslog包含了3个部分:

  1. syslogd,日志守护程序(配置文件为/etc/syslogd.conf)

  2. openlog,syslog和closelog,将消息题交给syslogd的库例程

  3. logger,一条从shell提交日志记录项的用户级命令

解读****syslog.conf

下面是/etc/syslog.conf的实例

# First some standard logfiles. Log by facility.

auth,authpriv.* /var/log/auth.log

.;auth,authpriv.none -/var/log/syslog

#cron.* /var/log/cron.log

daemon.* -/var/log/daemon.log

kern.* -/var/log/kern.log

lpr.* -/var/log/lpr.log

mail.* -/var/log/mail.log

user.* -/var/log/user.log

# Logging for INN news system

news.crit /var/log/news/news.crit

news.err /var/log/news/news.err

news.notice -/var/log/news/news.notice

下面我们有必要了解下cron, daemon这些主要代表着什么

设备(facility)

使用该设备的程序

除了”mark”之外的所有设备

auth

与安全和授权有关的命令

authpriv

敏感/保密的授权信息

cron

守护进程cron

daemon

系统守护进程

ftp

FTP守护进程,ftpd

kern

内核

local0-7

本地消息的8种类型

lpr

打印机

mail

sendmail及其他与电子邮件相关的软件

mark

定期产生的时间戳

news

usernet新闻系统

syslog

syslogd内部消息

user

用户进程(如果没有指定就是默认值)

uucp

UUCP

在syslog中定义了8种安全级别,就是上面我们看到的crit,err和notice

syslog的严重级别(降序)

级别

含义

emerg

恐慌状态

alert

紧急状态

crit

临界状态

err

其他错误情况

warning

警告信息

notice

需要调查的事项

info

提供信息的消息

debug

仅供调试

那我们如何来进行限定这个优先级呢?

syslog优先级别的限定实例

选择符

含义

Mail.info

选择与邮件相关的,优先级为info或者更高的消息

Mail.=info

只选择优先级为info的消息

Mail.info;mail.!err

只选择优先级为info,notice和warning消息

Mail.debug;mail.!=warning

选择除了warning之外所有的优先级

/var/log/auth.log 这些就是syslog的动作,我们看看到底有哪些动作

syslog的动作

动作

含义

filename

把消息写入本地机器上的一个文件里

@hostname

把消息转发给主机hostname上的syslogd

@ipaddress

把消息转发给IP为ipaddress的主机

|fifoname

把消息写入有名管道fifoname

User1,user2

如果用户登录到系统上,那么把消息写在用户的屏幕上

把消息写给目前所有已经登录的用户

从这里我们也可以看出syslog的日志文件可以进行网络存储的,我们可以把所有服务器的日志信息记录到中央日志服务器上,这样就方便于进行查看。

但是这里必须注明两点:

  1. 日志时间是已中央服务器上的时间为准

  2. 日志传输是UDP协议的,这就意味着并不是很可靠。

我们配置好/etc/syslog.conf需要对syslog服务进行重启才可。

调试****syslog

现在我们看看如何调试syslog

假设我们在/etc/syslog.conf中添加了下面一行:

local5.err /tmp/local5.err

看看是否起作用

logger -p local5.err “test err message”

然后看看/tmp/local5.err中是否有”test err message”信息

在程序中使用****syslog

库例程openlog,syslog和close能够让程序使用syslog系统,这些例程有c和perl的版本。

如何引入库例程定义,在perl中只需要在perl脚本开始处增加下面一行

user Sys::Syslog;

openlog使用以下格式来初始化日志记录:

openlog (ident, logopt, facility);

消息是按照logopt指定的选项被记录到facility中,并以标识符ident开头。

Logopt包含以下选项

选项

含义

pid

在每条日志消息上包含当前进程的PID

ndelay

立即连接到syslogd(不用得到要发消息时再连接)

cons

如果syslogd不可达,就把消息发送到系统控制台

Nowait

不用的代(wait(3))派生子进程来写控制台信息

合理的openlog调用可以是:

openlog (“adminscript”, “pid,cons”, “local4”);

syslog例程是用来发送一个消息到syslogd,将其以指定的优先级记录;

syslog (priority, messgae, ……);

来自openlog调用的日期、时间、主机名称和ident字符串都被预先加入到日志文件的消息中。message后面可跟其他参数,以形成printf风格的输出格式,包括文本和其他变量的列表,例如:

syslog (“info”, “Delivery to ‘%s’failed after %d attempts.”, $user, $nAttempts);

特殊符号%m把errno的当前值(最新的错误代码)扩展为一条错误信息

像”level|facilty”的优先级字符串既设置了严重级别,也设置了设备名称,如果没有调用openlog并指定一个ident字符串,syslog例程还会检查message是否具有一条标准UNIX错误信息的形式,如:

adminscript: User “nobody” not found in /etc/passwd file

如果符合这个格式,冒号之前的那一部分就被秘密的采用为ident字符串,这些特性使得调用openlog并不是必不可少;但调用openlog仍然是个不错的想法,在一些地方(调用openlog时)指定设备名称,整个代码中不断重复设备名称要好。

Closelog例程关闭日志记录通道:

closelog ();

如果想以不同的选项重新打开日志记录通道,那必须调用这个例程。在程序退出时调用closelog是一个很好的形式,但并不是必不可少的。

下面是在perl中的完成例子:

use Sys::Syslog

openlog(“adminscript”, “cons,pid”, “user”);

syslog(“waring”, “Those whom the gods would destroy, they first teach Basic”);

closelog();

产生的日志记录([191]为进程号):

Dec 2822:56:24 moet.colorado.edu adminscript[191]: Thos whom the gods would destroy, the firtst teach Basic.