一、介绍
syslog是linux系统的一套日志框架,syslog日志消息既可以记录在本地文件中,也可以通过网络发送到接收syslog的服务器。接收syslog的服务器可以对多个设备的syslog消息进行统一的存储,或者解析其中的内容做相应的处理。常见的应用场景是网络管理工具、安全管理系统、日志审计系统
二、函数接口
头文件
#include “syslog.h”
打开日志
void openlog (char*ident, int option, int facility);
关闭日志
void closelog();
写入日志
void syslog(int priority, char*format,……);
priority参数的格式(severity level|facility code)
LOG_ERR|LOG_USER
severity level:
Priority Level Description
LOG_EMERG An emergency situation
LOG_ALERT High-priority problem, such as database corruption
LOG_CRIT Critical error, such as hardware failure
LOG_ERR Errors
LOG_WARNING Warning
LOG_NOTICE Special conditions requiring attention
LOG_INFO Informational messages
LOG_DEBUG Debug messages
facility value(转自syslog.h头文件):
#define LOG_KERN (0<<3)
#define LOG_USER (1<<3)
#define LOG_MAIL (2<<3)
#define LOG_DAEMON (3<<3)
#define LOG_AUTH (4<<3)
#define LOG_SYSLOG (5<<3)
#define LOG_LPR (6<<3)
#define LOG_NEWS (7<<3)
#define LOG_UUCP (8<<3)
#define LOG_CRON (9<<3)
#define LOG_AUTHPRIV (10<<3)
#define LOG_FTP (11<<3)
命令行接口
logger 是一个shell 命令接口,可以通过该接口使用Syslog的系统日志模块,还可以从命令行直接向系统日志文件写入一行信息。
logger 语法
logger [options] [messages]
options (选项)
-d, –udp 使用数据报(UDP)而不是使用默认的流连接(TCP)
-i, –id 逐行记录每一次logger的进程ID
-f, –file file_name记录特定的文件
-h, –help 显示帮助文本并退出
-n, –server 写入指定的远程syslog服务器,使用UDP代替内装式syslog的例程
-P, –port port_num 使用指定的UDP端口。默认的端口号是514
-p, –priority priority_level指定输入消息的优先级,优先级可以是数字或者指定为 ” facility.level” 的格式。默认级别是 “user.notice”
-s, –stderr 输出标准错误到系统日志。
-t, –tag tag 指定标记记录
-u, –socket socket 写入指定的socket,而不是到内置系统日志例程。
-V, –version 现实版本信息并退出
messages:写入log文件的内容消息,可以与-f配合使用。
三、配置
1、配置文件位置::/etc/syslog.conf
2、配置成日志服务器的断开514
3、守护进程:syslog
4、日志文件保存位置:
/var/log/dmesg 内核引导信息日志
/var/log/message 标准系统错误信息日志
/var/log/maillog 邮件系统信息日志
/var/log/cron 计划任务日志
/var/log/secure 安全信息日志
可以修改/etc/syslog.conf换到其他路径
5、配置文件说明:
配置文件中每行表示一个项目,格式为:facility.level action
由两个部分组成:
第一部分:选择条件(可以有一个或者多个条件),分为两个字段。
选择条件本身分为两个字段,之间用一个小数点(.)分隔。前一字段是一项服务,后一字段是一个优先级。选择条件是对消息类型的一种分类,这种分类便于人们把不同类型的消息发送到不同的地方。在同一个syslog配置行上允许出现一个以上的选择条件,但必须用分号(;)隔开。
第二部分:操作动作;
常见facility:
kern 内核信息;
user 用户进程信息;
mail 电子邮件相关信息;
daemon 后台进程相关信息;
authpriv 包括特权信息如用户名在内的认证活动;
cron 计划任务信息;
syslog 系统日志信息
lpr 打印服务相关信息。
news 新闻组服务器信息
uucp uucp 生成的信息
local0----local7 本地用户信息
重要级:
重要级是选择条件的第二个字段,它代表消息的紧急程度。
按严重程度由低到高排序:
debug 不包含函数条件或问题的其他信息
info 提供信息的消息
none 没有重要级,通常用于排错
notice 具有重要性的普通条件
warning 预警信息
err 阻止工具或某些子系统部分功能实现的错误条件
crit 阻止某些工具或子系统功能实现的错误条件
alert 需要立即被修改的条件
emerg 该系统不可用
不同的服务类型有不同的优先级,数值较大的优先级涵盖数值较小的优先级。如果某个选择条件只给出了一个优先级而没有使用任何优先级限定符,对应于这个优先级的消息以及所有更紧急的消息类型都将包括在内。比如说,如果某个选择条件里的优先级是“warning”,它实际上将把“warning”、 “err”、“crit”、“alert”和“emerg”都包括在内。
日志信息可以分别记录到多个文件里,还可以发送到命名管道、其他程序甚至另一台机器。
syslog 主要支持以下活动:
file 指定文件的绝对路径
terminal 或 prin 完全的串行或并行设备标志符
@host(@IP地址) 远程的日志服务器
四、日志回滚
logrotate 用来把旧的日志文件删除,并创建新的日志文件,我们把它叫做“转储”;
根据日志文件的大小,也可以根据其天数来转储,这个过程一般通过一个叫做crond的守护进程来执行,logrotate 还可以用于压缩日志文件,以及发送日志到指定的E-mail
logrotate 的配置文件是 /etc/logrotate.conf,主要参数如下表:
参数 功能
compress 通过gzip 压缩转储以后的日志
nocompress 不需要压缩时,用这个参数
copytruncate 用于还在打开中的日志文件,把当前日志备份并截断
nocopytruncate 备份日志文件但是不截断
create mode owner group 转储文件,使用指定的文件模式创建新的日志文件
nocreate 不建立新的日志文件
delaycompress 和 compress 一起使用时,转储的日志文件到下一次转储时才压缩
nodelaycompress 覆盖 delaycompress 选项,转储同时压缩。
errors address 专储时的错误信息发送到指定的Email 地址
ifempty 即使是空文件也转储,这个是 logrotate 的缺省选项。
notifempty 如果是空文件的话,不转储
mail address 把转储的日志文件发送到指定的E-mail 地址
nomail 转储时不发送日志文件
olddir directory 转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统
noolddir 转储后的日志文件和当前日志文件放在同一个目录下
prerotate/endscript 在转储以前需要执行的命令可以放入这个对,这两个关键字必须单独成行
postrotate/endscript 在转储以后需要执行的命令可以放入这个对,这两个关键字必须单独成行
daily 指定转储周期为每天
weekly 指定转储周期为每周
monthly 指定转储周期为每月
rotate count 指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5 个备份
tabootext [+] list 不转储指定扩展名的文件,缺省的扩展名是:.rpm-orig .rpmsave
size size 当日志文件到达指定的大小时才转储,可以指定bytes(缺省)以及KB(sizek)或者MB (sizem).
系统对 logrotate 的执行和操作:
在/etc/cron.daily/路径下,有一个logrotate的shell脚本,所以cron程序会每天调用一次logrotate程序,然后logrotate程序回去检查日志文件是否符合回滚条件,并执行相应动作。
执行操作:/usr/sbin/logrotate /etc/cron.daily/logrotate.conf;
在/etc/logrotate.conf文件中,有如下选项:
#RPM packages drop log rotation information into this directory
include /etc/logrotate.d
#这个选项说明在执行logrotate程序时,同时执行/etc/logrotated目录下的所有脚本。
执行动作示例:每月清除/var/log/wtmp目录中的相关内容:
/var/log/wtmp {
monthly
create 0664 root root
rotate 1
}
五、操作示例
1、c程序示例
#include <syslog.h>
int main() {
setlogmask (LOG_UPTO (LOG_NOTICE));
openlog ("exampleprog", LOG_CONS | LOG_PID | LOG_NDELAY, LOG_LOCAL1);
syslog (LOG_NOTICE, "Program started by User %d", getuid ());
syslog (LOG_INFO, "A tree falls in a forest");
closelog ();
}
2、命令行操作示例
向syslog文件/var/log/messages中记录日志信息
logger hello guoguo
查看
tail -n 1 messages
记录特定的标记(tag)
logger -t TAG hello guoguo
查看
tail -n 1 messages