# Linux下rsyslog日志服務的示例分析
## 1. rsyslog簡介
### 1.1 什么是rsyslog
rsyslog是Linux系統中最常用的日志收集服務之一,全稱為"rocket-fast system for log"。它作為syslog協議的增強實現,具有以下核心特點:
- **高性能**:支持每秒百萬級日志處理
- **模塊化設計**:可通過加載模塊擴展功能
- **網絡傳輸**:支持TCP/UDP/TLS等協議
- **豐富過濾**:提供靈活的過濾和路由機制
- **兼容性**:完全兼容傳統syslog
### 1.2 rsyslog發展歷程
| 版本 | 發布時間 | 主要特性 |
|------|----------|----------|
| v1 | 2004 | 基本syslog功能 |
| v3 | 2007 | 支持多線程 |
| v5 | 2009 | 引入隊列系統 |
| v7 | 2013 | 增強的過濾引擎 |
| v8 | 2015 | 改進的規則集處理 |
## 2. rsyslog安裝與配置
### 2.1 安裝方法
不同Linux發行版的安裝命令:
```bash
# Ubuntu/Debian
sudo apt-get install rsyslog
# RHEL/CentOS
sudo yum install rsyslog
# Arch Linux
sudo pacman -S rsyslog
rsyslog的主配置文件通常位于/etc/rsyslog.conf
,其結構包含:
# 全局指令
global(workDirectory="/var/spool/rsyslog")
# 模塊加載
module(load="imuxsock") # 本地系統日志支持
module(load="imklog") # 內核日志支持
# 規則集
*.info;mail.none;authpriv.none /var/log/messages
authpriv.* /var/log/secure
指令 | 說明 | 示例 |
---|---|---|
$ModLoad | 加載模塊 | $ModLoad imudp |
$InputFileName | 指定輸入文件 | $InputFileName /var/log/httpd/access_log |
$template | 定義日志格式模板 | $template MyTemplate,“%timestamp% %hostname% %msg%\n” |
. | 日志過濾規則 | .emerg :omusrmsg: |
示例1:收集本地系統日志
# 加載必要模塊
module(load="imuxsock") # 本地UNIX套接字
module(load="imklog") # 內核日志
# 存儲系統日志到/var/log/syslog
*.info;mail.none;authpriv.none;cron.none /var/log/syslog
示例2:按設施和優先級分離日志
# 認證相關日志
auth,authpriv.* /var/log/auth.log
# 內核日志
kern.* /var/log/kern.log
# 郵件日志
mail.* -/var/log/mail.log
配置日志服務器(接收端):
# 啟用UDP監聽
module(load="imudp")
input(type="imudp" port="514")
# 啟用TCP監聽
module(load="imtcp")
input(type="imtcp" port="514")
# 存儲遠程主機日志
$template RemoteLogs,"/var/log/remote/%HOSTNAME%/%PROGRAMNAME%.log"
*.* ?RemoteLogs
客戶端配置(發送端):
# 轉發日志到遠程服務器
*.* @192.168.1.100:514 # UDP方式
*.* @@192.168.1.100:514 # TCP方式
基于屬性的過濾:
# 只記錄包含"error"關鍵詞的日志
:msg, contains, "error" /var/log/errors.log
# 過濾特定程序的日志
if $programname == 'nginx' then /var/log/nginx.log
# 使用正則表達式匹配
:msg, regex, "fatal.*error" /var/log/critical.log
條件判斷示例:
# 根據主機名路由日志
if $hostname == 'web01' then {
action(type="omfile" file="/var/log/web01.log")
} else {
action(type="omfile" file="/var/log/other_hosts.log")
}
# 主隊列配置
$MainMsgQueueType LinkedList # 使用鏈表隊列
$MainMsgQueueFileName mainq # 隊列文件名
$MainMsgQueueMaxDiskSpace 1g # 最大磁盤空間
$MainMsgQueueSaveOnShutdown on # 關機時保存隊列
# 工作隊列配置
$WorkDirectory /var/spool/rsyslog # 工作目錄
$ActionQueueType LinkedList # 動作隊列類型
$ActionQueueFileName actionq # 隊列文件名
$ActionQueueMaxDiskSpace 100m # 最大磁盤空間
# 啟用多線程處理
$ModLoad imptcp
$InputPTCPServerRun 514
# 配置線程池
$ThreadsPerChild 4
$NumOfChildren 2
# 內存緩沖設置
$ActionQueueSize 100000 # 隊列中最大消息數
$ActionQueueDiscardMark 97500 # 達到此數量開始丟棄
$ActionQueueHighWaterMark 80000 # 高水位線
$ActionQueueType LinkedList # 隊列類型
生成證書:
openssl genrsa -out rsyslog-key.pem 2048
openssl req -new -x509 -key rsyslog-key.pem -out rsyslog-cert.pem -days 3650
服務器端配置:
module(load="imtcp" StreamDriver.Name="gtls" StreamDriver.Mode="1")
input(type="imtcp" port="6514" StreamDriver.Name="gtls"
StreamDriver.AuthMode="x509/name"
StreamDriver.PermittedPeers="*.example.com")
客戶端配置:
module(load="omfwd")
action(type="omfwd" protocol="tcp" target="logs.example.com" port="6514"
StreamDriver="gtls" StreamDriverMode="1" StreamDriverAuthMode="x509/name"
StreamDriverPermittedPeers="logs.example.com")
# 限制接收網絡
$AllowedSender UDP, 192.168.1.0/24
$AllowedSender TCP, 10.0.0.0/8
# 文件權限設置
$FileOwner syslog
$FileGroup adm
$FileCreateMode 0640
$DirCreateMode 0755
Nginx配置:
http {
log_format rsyslog_format '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
access_log syslog:server=127.0.0.1:514,facility=local7,tag=nginx,severity=info rsyslog_format;
}
rsyslog配置:
# 加載imrelp模塊
module(load="imrelp")
# 定義nginx日志模板
$template NginxLog,"%msg%\n"
# 接收并存儲nginx日志
if $programname == 'nginx' then {
action(type="omfile" file="/var/log/nginx/access.log" template="NginxLog")
}
安裝MySQL模塊:
sudo apt-get install rsyslog-mysql
配置MySQL輸出:
# 加載ommysql模塊
module(load="ommysql")
# 定義MySQL動作
action(type="ommysql" server="localhost" db="Syslog" uid="rsyslog" pwd="password")
數據庫表結構:
CREATE TABLE SystemEvents (
ID int unsigned not null auto_increment primary key,
CustomerID bigint,
ReceivedAt datetime NULL,
DeviceReportedTime datetime NULL,
Facility smallint NULL,
Priority smallint NULL,
FromHost varchar(60) NULL,
Message text,
NTSeverity int NULL,
Importance int NULL,
EventSource varchar(60),
EventUser varchar(60) NULL,
EventCategory int NULL
);
啟用統計信息:
# 啟用統計功能
module(load="impstats" interval="60" severity="7")
# 存儲統計信息
$template stats-format,"%msg%\n"
$template stats-file,"/var/log/rsyslog-stats.log"
if $programname == 'rsyslogd' and $msg contains 'action' then {
action(type="omfile" file="stats-file" template="stats-format")
}
關鍵監控指標:
logrotate示例:
/var/log/remote/*/*.log {
daily
missingok
rotate 30
compress
delaycompress
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/rsyslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
}
問題1:日志停止收集
排查步驟:
1. 檢查服務狀態:systemctl status rsyslog
2. 查看系統日志:journalctl -u rsyslog
3. 檢查磁盤空間:df -h
4. 驗證配置文件:rsyslogd -N1
問題2:性能瓶頸
優化建議: - 增加隊列大小 - 啟用多線程 - 考慮使用RELP協議替代UDP - 優化過濾規則復雜度
啟用調試模式:
rsyslogd -dn # 前臺運行并顯示調試信息
日志流量分析:
# 查看日志處理統計
grep 'action' /var/log/rsyslog-stats.log
# 實時監控日志流
tcpdump -i eth0 port 514 -A
Logstash配置示例:
input {
syslog {
port => 514
type => "syslog"
}
}
output {
elasticsearch {
hosts => ["localhost:9200"]
index => "syslog-%{+YYYY.MM.dd}"
}
}
簡單輸出模塊示例:
#include <stdio.h>
#include <rsyslog.h>
MODULE_TYPE_OUTPUT
MODULE_TYPE_NOKEEP
MODULE_CNFNAME("myom")
BEGINbeginCnfLoad
ENDbeginCnfLoad
BEGINendCnfLoad
ENDendCnfLoad
BEGINcreateInstance
ENDcreateInstance
BEGINfreeInstance
ENDfreeInstance
BEGINdoAction
FILE *f = fopen("/var/log/myoutput.log", "a");
if(f) {
fprintf(f, "%s\n", ppString[1]);
fclose(f);
}
ENDdoAction
參考資源: - rsyslog官方文檔 - RFC 5424 - The Syslog Protocol - 《Linux系統日志分析實戰》 “`
注:本文為示例文檔,實際配置時請根據您的具體環境和需求進行調整。建議在生產環境部署前進行充分測試。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。