您好,登录后才能下订单哦!
# 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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。