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;
}