syslog的使用
1. syslog的配置
1.1. syslog简介
syslog.conf是syslogd进程的配置文件,将在程序启动时读取,默认位置是/etc/syslog.conf.这个配置文件中的空白行和以"#"开头的行将被忽略."facility.level"部分也被称为选择符(seletor). seletor和action之间使用一个或多个空白分隔.它指定了一系列日志记录规则.规则的格式如下:
seletor(facility.level) action
选择符(seletor)(选择符由 facility 和 level 两部分组成,之间用一个句点(.)连接)
完善的日志分析系统应该能够通过多种协议(包括syslog等)进行日志采集并对日志分析,因此日志分析系统首先需要实现对多种日志协议的解析。其次,需要对收集到的海量日志信息进行分析,再利用数据挖掘技术,发现隐藏再日志里面的安全问题。
Syslog再UNIX系统中应用非常广泛,它是一种标准协议,负责记录系统事件的一个后台程序,记录内容包括核心、系统程序的运行情况及所发生的事件。Syslog协议使用UDP作为传输协议,通过514端口通信,Syslog使用syslogd后台进程,syslogd启动时读取配置文件/etc/syslog.conf,它将网络设备的日志发送到安装了syslog软件系统的日志服务器,Syslog日志服务器自动接收日志数据并写到指定的日志文件中。
1.1.1. linux中日志的类型
(1)info:基本的信息
(2)notice:比info更需注意的信息
(3)warning:警告,提示管理员,但是不会影响系统的进程
(4)error:错误,一些比较重要的错误信息。例如、某些服务无法启动
(5)crit:比error要严重的一些错误
(6)alert:出现这个错误,管理员就要注意啦!有可能就会影响到系统
(7)panic:出现这个错误,系统就死机啦!什么也做不了了
1.1.2. facility
可以理解为日志的来源或设备,目前常用的facility有以下几种:
auth #认证相关的
authpriv #权限,授权相关的
cron #任务计划相关的
daemon #守护进程相关
kern #内核相关的
lpr #打印相关的
mail #邮件相关的
mark #标记相关的
news #新闻相关的
security #安全相关的,与auth类似
syslog #syslog自己的
user #用户相关的
uucp #unix to unix cp相关的
local0 到 local7 #用户自定义使用
* #表示所有的facility
1.1.3. action(动作)
日志记录的位置
系统上的绝对路径 #普通文件,如:/var/log/xxx
| #管道,通过管道送给其它命令处理
终端 #终端,如:/dev/console
@HOST #远程主机,如:@10.0.0.1
用户 #系统用户,如:root
* #登录到系统上的所有用户,一般为emerg级别的日志是这样定义的
1.1.4. 日志定义格式举例
mail.info /var/log/mail.log #表示将mail相关的,级别为info及info以上级别的信息记录到/var/log/mail.log文件中
auth.=info @10.0.0.1 #表示将auth有关的,级别为info的信息记录到10.0.0.1主机上去
#前提是10.0.0.1要能够接受其它主机发来的日志信息
user.!error #与user.error相反
*.info #表示记录所有的日志信息的info级别
mail.* #表示记录mail相关的所有级别的信息
*.* #记录所有的日志信息的所有级别
cron.info;mail.info #多个日志来源用";"隔开
cron,mail.info #与cron.info;mail.info意义相同
mail.*;mail.!=info #表示记录mail相关的除了info级别之外的所有级别的信息
1.1.5. 重启rsyslog服务
systemctl restart rsyslog
1.2. syslog服务器
1.3. logrotate:系统中进行日志滚动(切割)的工具
https://zhuanlan.zhihu.com/p/90507023
1.4. rsyslog的配置文件
/etc/rsyslog.d/50-default.conf
# Default rules for rsyslog.
#
# For more information see rsyslog.conf(5) and /etc/rsyslog.conf
#
# First some standard log files. 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
1.5. 举例说明
1.5.1. 添加配置文件
# cat /etc/rsyslog.d/30-user.conf
local0.* /var/log/logger.log
1.5.2. 重启rsyslog
Systemctl restart rsyslog
2. syslog在shell脚本中的应用
#!/bin/bash
echo "***********************************************"
echo "**** -i,记录进程id"
logger -i "this is a test --i"
logger "this is a test --"
<<!
Jul 12 09:14:32 10-23-97-171 ubuntu[68209]: this is a test --i
Jul 12 09:14:32 10-23-97-171 ubuntu: this is a test --
!
echo -e "\n\n"
echo "***********************************************"
echo "**** -s,输出标准错误,并且将信息打印到系统日志中"
logger -i -s "abc"
echo -e "\n\n"
echo "***********************************************"
echo "**** -t,指定标记记录,在message日志中可以看到是属于哪个模块记录的日志,-t后面为模块名称,加引号或不加都可以。如果不指定-t,都是已root为记录。"
logger -i -t xuxin -s "this is a test"
logger -i -t "xuxin" -s "this is a test"
logger -i -s "this a test"
<<!
Jul 12 09:15:41 10-23-97-171 xuxin[68263]: this is a test
Jul 12 09:15:41 10-23-97-171 xuxin[68264]: this is a test
Jul 12 09:15:41 10-23-97-171 ubuntu[68265]: this a test
!
echo -e "\n\n"
echo "***********************************************"
echo "**** -p,指定输入消息日志级别,优先级可以是数字或者指定为 facility.level的格式。比如:-p local3.info local3 这个设备的消息级别为 info。默认级别是 user.notice"
logger -it xuxin -p local0.info "this a test"
3. syslog在C/C++中的应用
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <syslog.h>
int work(long loop_count)
{
while(loop_count-- > 0) {
syslog(LOG_INFO, "loglog");
}
return 0;
}
int test(long process_count, long loop_count)
{
long i;
pid_t pid;
for (i = 0; i < process_count; i++) {
pid = fork();
if (pid < 0) {
printf("fork fail\n");
} else if(pid == 0) {
work(loop_count);
return 0;
}
}
for (i = 0; i < process_count; i++) {
pid = wait(NULL);
}
return 0;
}
int main(int argc, char** argv)
{
if (argc != 3) {
fprintf(stderr, "test nprocess nloop");
exit(1);
}
openlog(NULL, LOG_NDELAY|LOG_NOWAIT|LOG_PID, LOG_LOCAL0);
test(atol(argv[1]), atol(argv[2]));
return 0;
}