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;
}
posted @ 2021-09-13 23:24  汪大大的许先生  阅读(1683)  评论(0编辑  收藏  举报