日志分类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| /var/log/message 系统通用日志,通常由rsyslog或syslog管理 /var/log/dmesg 内核缓冲区日志,主要包含启动时内核与硬件信息 /var/log/boot.log 专门记录系统启动过程中的事件,包含服务启动顺序成功/失败 /var/log/cron 定时任务日志 /var/log/maillog RHEL系系统邮件日志 /var/log/mail.log Debian系系统邮件日志 /var/log/firewalld firewalld服务运行状态 /var/log/nftables nftables服务日志
/var/log/secure RHEL系PAM日志 /var/log/auth.log Debian系PAM日志 /var/log/audit/audit.log selinux日志 /var/log/sudo.log sudo日志
syslog → rsyslog → systemd-journald → 分布式日志系统
|
日志管理工具syslog
在类unix操作系统上,syslog广泛应用于系统日志,既可以记录在本地文件中,也可以通过网络发送到接受syslog的服务器,syslogd监听udp 514端口
在syslog日志中,包含能够产生日志的程序模块(Facility)、严重性(Serverity)、时间、主机名、进程名、进程ID和正文
在unix类操作系统上,能够按照Facility+Serverity的组合来决定什么样的日志需要被记录,记录到什么地方,是否需要发送到一个接受syslog的服务器
- 发送syslog的设备Device
- 转发syslog的设备Relay
- 接收syslog的设备Collector
上面的角色是可以重合的,取决于如何配置syslog
syslog的优点
1.几乎所有类unix系统、网络设备、软件都支持syslog
2.简单轻量
3.易于实现和集成
4.集中化管理 ,可以发送到中央日志服务器
5.解耦 异步通信,无需等待接收方确认,保证了应用程序自身的性能
syslog的缺点
1.缺乏标准化的消息格式,需要为不同的日志编写特定的协议规则,才能提取结构化字段
2.安全和可靠性问题,使用udp时,消息可能会丢失、重复、乱序
3.时间同步问题,本身包含时间戳,但如果发送设备的时钟不准,日志信息就会出错
4.可扩展性调整,海量日志下syslog面临性能瓶颈
Rsyslog
rocket-fast syslog,是linux现在默认的syslog守护进程,完全兼容传统的syslogd
主要特性
1.高性能处理,使用内存队列和
2.丰富协议支持,支持udp tcp ssl等方式接受日志,支持发给es kafka
3.过滤与处理能力,能实现基于属性的过滤,比如主机名、程序名、严重性、设施等,并且支持正则表达式,可以自定义输出格式
4.可靠性和安全性,使用RELP协议,提供可靠的确认机制的日志传输
5.模块化设计,把整体功能拆分成独立功能模块,每个模块只负责一项具体任务,可以按需加载/卸载

Rsyslog三层架构
rsyslog使用分层模块化概念,通过模块扩展功能,三层协同完成日志接收→处理→分发链路流程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| 接收来自不同来源的日志,是日志流转的起点,所有输入均通过输入模块实现,支持多样化的日志接入方式 输入层模块可以通过启用多个,所有接入的日志会统一传递到处理层,进入核心转发引擎等待处理
模块名 输入方式 场景 imudp udp协议514 简单远程日志接收 imtcp tcp协议514 可靠远程日志接收 imrelp RELP可靠事件日志协议 关键业务日志可靠传输 imuxsock unix本地套接字 接收本地应用日志nginx mysql imjournal 对接systemd-journald 接收journald采集的系统/服务日志 imklog 读取内核缓冲区 接收内核日志 imfile 监控本地文件 采集自定义文件日志
对输入层接收的日志进行过滤、格式化、修改,是rsyslog逻辑控制的核心,通过规则集和过滤器定义日志规则 但一般运维不需要修改这个,都是照单全收 (1)规则集,定义完整的过滤逻辑+处理动作 (2)过滤器,日志筛选的条件判断,基于设施、优先级、关键词、ip等维度筛选日志 (3)日志处理动作,通过模板将日志转换为指定格式;字段修改;通过forward链将日志转发到其他输出层;修改日志等级 (4)工作逻辑,输入层的日志会先进入默认规则集,或通过配置进行某一规则集,处理完成后的日志传递到输出层,最终进行分发
将处理层处理后的日志分发到指定目标,所有输出均通过输出模块output module实现,支持本地存储、远程转发、数据库落盘等多样化输出方法 可以启用多个输出模块,比如既写入本地,又转发到远程ELK 支持级联输出,如日志先写入本地文件,再转发到远程服务器
|
Rsyslog的工作模式
1 2 3 4 5 6 7 8 9
| 阻塞/非阻塞 IO同步/异步 $ActionFileAsyncWeite on 启用异步写入 $ThreadPoolSize 8 异步线程处理数
特殊模式:可靠传输模式 1.基于RELP,即使网络中断或服务重启,也能避免日志丢失,适用于关键业务日志传输 2.基于磁盘队列的可靠处理,一般用于本地日志
|
Rsyslog配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| /etc/rsyslog.conf 主配置文件 /etc/rsyslog.d/*.conf 子配置文件 先加载主,再加载子,子中重复的覆盖主
1.模块加载区 module(load="imjournal") module(load="omfwd")
2.全局配置区 定义rsyslog全局参数,如日志文件权限、缓存、模板格式 $FileOwner $Umask ...
3.日志规则区 定义哪些日志执行什么操作,是日志分流,存储转发的核心规则 (1)日志筛选规则selector 日志筛选规则由facility.priority组成,支持通配符 facility表示日志来源分类,如authpriv认证日志 priority表示日志等级,如info,err
特殊符号 . 仅匹配指定等级及以上 ; 多规则拼接 .= 仅匹配制定登记 .! 排除指定等级
来看看默认规则 *.info;mail.none;authpriv.none;cron.none /var/log/message 任何进程的info及以上级别的日志;但认证、计划任务的日志不要
authpriv.* /var/log/secure 认证的日志
mail.* -/var/log/maillog mail的日志
(2)日志动作 表示日志的处理方式 本地文件: /var/log/message 日志写入指定文件 远程转发: @192.168.1.100:514(udp);@@192.168.1.100:514(tcp) 管道: |/usr/bin/logger 通过管道传给指定程序 数据库(引用其他模块): :ommysql:127.0.0.1,dbname,user,password(写入mysql数据库) 丢弃: ~ local7.* ~
*.emerg :omusrmsg:* emerg等级以上的日志,调用omusrmsg模块(展示在控制台
(3)日志模板 用于自定义日志格式,比如json,默认使用系统模板 template(name="JSONTEMPLATE".xxxx)
authpriv.* /var/log/secure;JSONTEMPLATE 应用该模板
|
Rsyslog接管firewalld日志
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| firewalld默认仅将日志输出到内核缓冲区,可以配合rsyslog或systemd-journald实现日志持久化存储和集中管理
/etc/firewalld/firewalld.conf ... LogDenied=all ...
systemctl restart firewalld.service
/var/log/firewalld 并非这个日志文件,这个仅记录配置变更记录
firewalld日志属于kern.* 即内核级日志
kern日志默认是在/var/log/message中的,但我们直接创建一个子配置文件就可以覆盖这部分配置 kern.*:meg,contains,"_REJECT" -/var/log/firewalld_deny.log & stop
msg表示匹配syslog的消息字段 containers匹配运算符,包含关系 _REJECT表示匹配关键字为"_REJECT" -代表异步写入 & 表示进行后续处理 stop 表示该日志不会再匹配其他rsyslog规则,也不会写入message
echo 'kern.*:msg,contains,"_REJECT" -/var/log/firewalld_deny.log & stop' > /etc/rsyslog.d/firewall.conf
systemctl restart rsyslog.service
cat > /etc/rsyslog.d/firewall.conf <<'EOF' if ($msg contains "_REJECT") then { action(type="omfile" file="/var/log/firewalld_deny.log") stop } EOF
rsyslogd -N1 systemctl restart rsyslog.service
tail -f /var/log/firewalld_deny.log Feb 12 10:59:16 1panel kernel: filter_IN_public_REJECT: IN=ens18 OUT= MAC=01:00:5e:00:00:01:34:ce:00:65:66:0f:08:00 SRC=0.0.0.0 DST=224.0.0.1 LEN=32 TOS=0x00 PREC=0xC0 TTL=1 ID=0 DF PROTO=2 Feb 12 10:59:36 1panel kernel: filter_IN_public_REJECT: IN=ens18 OUT= MAC=01:00:5e:00:00:fb:bc:24:11:9d:13:d4:08:00 SRC=192.168.10.238 DST=224.0.0.251 LEN=67 TOS=0x00 PREC=0x00 TTL=1 ID=36040 PROTO=UDP SPT=5353 DPT=5353 LEN=47 ...
|