Linux下rsyslog日志服务的示例分析

发布时间:2022-02-18 09:39:49 作者:小新
来源:亿速云 阅读:344
# 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

2.2 配置文件结构

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

2.3 常用配置指令

指令 说明 示例
$ModLoad 加载模块 $ModLoad imudp
$InputFileName 指定输入文件 $InputFileName /var/log/httpd/access_log
$template 定义日志格式模板 $template MyTemplate,“%timestamp% %hostname% %msg%\n”
. 日志过滤规则 .emerg :omusrmsg:

3. rsyslog核心功能示例

3.1 基本日志收集

示例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

3.2 网络日志收集

配置日志服务器(接收端):

# 启用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方式

3.3 高级过滤功能

基于属性的过滤:

# 只记录包含"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")
}

4. 性能优化配置

4.1 队列系统配置

# 主队列配置
$MainMsgQueueType LinkedList    # 使用链表队列
$MainMsgQueueFileName mainq     # 队列文件名
$MainMsgQueueMaxDiskSpace 1g    # 最大磁盘空间
$MainMsgQueueSaveOnShutdown on  # 关机时保存队列

# 工作队列配置
$WorkDirectory /var/spool/rsyslog  # 工作目录
$ActionQueueType LinkedList        # 动作队列类型
$ActionQueueFileName actionq       # 队列文件名
$ActionQueueMaxDiskSpace 100m      # 最大磁盘空间

4.2 多线程处理

# 启用多线程处理
$ModLoad imptcp
$InputPTCPServerRun 514

# 配置线程池
$ThreadsPerChild 4
$NumOfChildren 2

4.3 日志缓冲设置

# 内存缓冲设置
$ActionQueueSize 100000       # 队列中最大消息数
$ActionQueueDiscardMark 97500 # 达到此数量开始丢弃
$ActionQueueHighWaterMark 80000 # 高水位线
$ActionQueueType LinkedList   # 队列类型

5. 安全配置实践

5.1 TLS加密传输

生成证书:

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")

5.2 访问控制

# 限制接收网络
$AllowedSender UDP, 192.168.1.0/24
$AllowedSender TCP, 10.0.0.0/8

# 文件权限设置
$FileOwner syslog
$FileGroup adm
$FileCreateMode 0640
$DirCreateMode 0755

6. 实战案例解析

6.1 Nginx日志收集方案

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")
}

6.2 数据库日志存储

安装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
);

7. 监控与维护

7.1 状态监控

启用统计信息:

# 启用统计功能
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")
}

关键监控指标:

7.2 日志轮转配置

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
}

8. 故障排查指南

8.1 常见问题处理

问题1:日志停止收集

排查步骤: 1. 检查服务状态:systemctl status rsyslog 2. 查看系统日志:journalctl -u rsyslog 3. 检查磁盘空间:df -h 4. 验证配置文件:rsyslogd -N1

问题2:性能瓶颈

优化建议: - 增加队列大小 - 启用多线程 - 考虑使用RELP协议替代UDP - 优化过滤规则复杂度

8.2 调试技巧

启用调试模式:

rsyslogd -dn  # 前台运行并显示调试信息

日志流量分析:

# 查看日志处理统计
grep 'action' /var/log/rsyslog-stats.log

# 实时监控日志流
tcpdump -i eth0 port 514 -A

9. 扩展与集成

9.1 与ELK栈集成

Logstash配置示例:

input {
  syslog {
    port => 514
    type => "syslog"
  }
}

output {
  elasticsearch {
    hosts => ["localhost:9200"]
    index => "syslog-%{+YYYY.MM.dd}"
  }
}

9.2 自定义模块开发

简单输出模块示例:

#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

10. 总结与最佳实践

10.1 配置建议

  1. 日志分类存储:按设施和优先级分离日志
  2. 网络传输安全:优先使用TCP+TLS
  3. 性能监控:定期检查队列状态
  4. 定期维护:设置合理的日志轮转策略
  5. 备份配置:版本控制管理配置文件

10.2 未来发展趋势


参考资源: - rsyslog官方文档 - RFC 5424 - The Syslog Protocol - 《Linux系统日志分析实战》 “`

注:本文为示例文档,实际配置时请根据您的具体环境和需求进行调整。建议在生产环境部署前进行充分测试。

推荐阅读:
  1. 日志管理-rsyslog
  2. 2.linux 日志服务器rsyslog+loganalyzer搭建

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

linux rsyslog

上一篇:Linux下如何模拟系统负载

下一篇:JavaScript闭包如何理解

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》