此文章描述如何使用源代码构建rsyslog的流程和测试方法,如果想在ubuntu上使用,可以直接执行
sudo apt install rsyslog
来完成安装
以下基于master最新源码编译
1.下载代码搭建代码环境
git clone https://github.com/rsyslog/rsyslog.git
cd rsyslog
git checkout v8.2204.0 # 替换为你需要的版本号
安装编译依赖
sudo apt update
sudo apt install build-essential autoconf automake libtool pkg-config \
libestr-dev libfastjson-dev liblogging-stdlog-dev \
libgcrypt-dev libssl-dev zlib1g-dev uuid-dev \
libsystemd-dev libhiredis-dev libmysqlclient-dev \
libpq-dev libgnutls28-dev libcurl4-gnutls-dev docutils bison flex python-docutils
如果在第二部分编译过程中遇到缺库情况可以参考此部分安装依赖库
2.生成构建配置
在源码目录中运行以下命令:
autoreconf -fvi
生成configure脚本后,运行以下命令配置构建环境
./configure --help # 查询支持的配置项
./configure --enable-all --prefix=/home/zx/Desktop/codes/new/build # 指定安装路径
编译并安装
make & make install
3.安装完成后添加配置文件
make install后目录如下:
etc目录需要手动创建,里面放置运行配置文件:
├── etc
│ ├── rsyslog.conf
│ └── rsyslog.d
│ ├── 20-ufw.conf
│ ├── 50-default.conf
rsyslog.conf为配置文件,内容如下:
# /etc/rsyslog.conf Configuration file for rsyslog.
#
# For more information see
# /usr/share/doc/rsyslog-doc/html/rsyslog_conf.html
#
# Default logging rules can be found in /etc/rsyslog.d/50-default.conf
#################
#### MODULES ####
#################
module(load="imuxsock") # provides support for local system logging
#module(load="immark") # provides --MARK-- message capability
# provides UDP syslog reception
#module(load="imudp")
#input(type="imudp" port="514")
# provides TCP syslog reception
#module(load="imtcp")
#input(type="imtcp" port="514")
# provides kernel logging support and enable non-kernel klog messages
module(load="imklog" permitnonkernelfacility="on")
###########################
#### GLOBAL DIRECTIVES ####
###########################
#
# Use traditional timestamp format.
# To enable high precision timestamps, comment out the following line.
#
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
# Filter duplicated messages
$RepeatedMsgReduction on
#
# Set the default permissions for all log files.
#
$FileOwner syslog
$FileGroup adm
$FileCreateMode 0640
$DirCreateMode 0755
$Umask 0022
$PrivDropToUser syslog
$PrivDropToGroup syslog
$ActionFileEnableSync on
#
# Where to place spool and state files
#
$WorkDirectory /home/zx/Desktop/codes/new/build/log/rsyslog
#
# Include all config files in /etc/rsyslog.d/
#
$IncludeConfig /home/zx/Desktop/codes/new/build/etc/rsyslog.d/*.conf
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
local0.* -/var/log/local0.log # 自定义的local0输出log所存在的路径
#user.* -/var/log/user.log
#
# Logging for the mail system. Split it up so that
# it is easy to write scripts to parse these files.
#
#mail.info -/var/log/mail.info
#mail.warn -/var/log/mail.warn
mail.err /var/log/mail.err
#
# Some "catch-all" log files.
#
#*.=debug;\
# auth,authpriv.none;\
# news.none;mail.none -/var/log/debug
#*.=info;*.=notice;*.=warn;\
# auth,authpriv.none;\
# cron,daemon.none;\
# mail,news.none -/var/log/messages
#
# Emergencies are sent to everybody logged in.
#
*.emerg :omusrmsg:*
#
# I like to have messages displayed on the console, but only on a virtual
# console I usually leave idle.
#
#daemon,mail.*;\
# news.=crit;news.=err;news.=notice;\
# *.=debug;*.=info;\
# *.=notice;*.=warn /dev/tty8
20-ufw.conf
# Log kernel generated UFW log messages to file
:msg,contains,"[UFW " /var/log/ufw.log
# Uncomment the following to stop logging anything that matches the last rule.
# Doing this will stop logging kernel generated UFW log messages to the file
# normally containing kern.* messages (eg, /var/log/kern.log)
#& stop
配置文件添加完成后,即可开始测试
4.手动拉起测试
4.1 手动拉起守护进程
sudo /home/zx/Desktop/codes/new/build/sbin/rsyslogd -f /home/zx/Desktop/codes/new/build/etc/rsyslog.conf
4.2 辅助命令
kill掉rsyslogd
sudo pkill rsyslogd
查询rsyslog是否正在运行
ps aux | grep rsyslog
查看运行日志
tail -f /var/log/syslog
4.3 测试log
logger -p local0.info "This is a test log message from the app"
在/var/log/local0.log中即会出现This is a test log message from the app内容
zx@zx-VirtualBox:~$ cat /var/log/local0.log
Feb 12 17:12:12 zx-VirtualBox zx: This is a test log message from the app
Feb 12 17:12:13 zx-VirtualBox zx: This is a test log message from the app
Feb 12 17:13:38 zx-VirtualBox zx: message repeated 13 times: [ This is a test log message from the app]
Feb 12 17:19:49 zx-VirtualBox zx: T123123213213123
Feb 12 17:19:50 zx-VirtualBox zx: T123123213213123
Feb 12 17:20:03 zx-VirtualBox zx: T12123
Feb 12 17:20:13 zx-VirtualBox zx: T12123sdfdsf
Feb 12 17:23:29 zx-VirtualBox zx: T12123sdfdsf
Feb 12 17:23:30 zx-VirtualBox zx: T12123
Feb 13 09:52:37 zx-VirtualBox zx: T1123123213
4.4 在C代码中使用rsyslog记录log
#include <syslog.h>
#include <stdio.h>
#include <stdlib.h>
int main() {
// 打开 syslog 连接
// 参数1:标识符(通常为程序名称)
// 参数2:选项(LOG_PID 表示在日志中包含进程 ID)
// 参数3:设施(LOG_LOCAL0 表示用户级别的日志)
openlog("local", LOG_PID, LOG_LOCAL0);
// 记录日志
syslog(LOG_INFO, "This is an informational message.");
syslog(LOG_WARNING, "This is a warning message.");
syslog(LOG_ERR, "This is an error message.");
// 关闭 syslog 连接
closelog();
return 0;
}
5.rsyslog配置项
5.1 各模块功能梳理
5.1.1 Output Modules
omamqp1: AMQP 1.0 消息输出模块
omazureeventhubs: Microsoft Azure Event Hubs 输出模块
omclickhouse: ClickHouse 输出模块
omdtls: 通过 UDP 的 DTLS 协议输出模块
omelasticsearch: Elasticsearch 输出模块
omfile: 文件输出模块
omfwd: 系统日志转发输出模块
omhdfs: Hadoop 文件系统输出模块 omhdfs: Hadoop 文件系统输出模块
omhiredis: Redis 输出模块 Redis 输出模块
omhttp: HTTP 输出模块
omhttpfs: Hadoop HTTPFS 输出模块
omjournal: omjournal: Systemd 日志输出
omkafka: 写入 Apache Kafka
omibdbi: 通用数据库输出模块
ommail: 邮件输出模块
ommongodb: MongoDB 输出模块
ommysql: MariaDB/MySQL: 数据库输出模块
omoracle: Oracle 数据库输出模块 omoracle: Oracle 数据库输出模块
PostgreSQL 数据库输出模块(ompgsql)
ompipe: 管道输出模块
omprog: 程序集成输出模块
omrabbitmq: RabbitMQ 输出模块
omrelp: RELP 输出模块
omruleset: 规则集输出/包含模块
omsnmp: SNMP 陷阱输出模块
omstdout: stdout 输出模块(测试台工具)
omudpspoof: UDP 欺骗输出模块
omusrmsg: 通知用户
omuxsock: Unix 套接字输出模块
GuardTime 日志签名提供程序 (gt)
无密钥签名基础架构提供程序 (ksi)
KSI 签名提供程序 (rsyslog-ksi-ls12)
文档链接:https://www.rsyslog.com/doc/configuration/modules/idx_output.html
5.1.2 Input Modules
im3195: RFC3195 输入模块
imbatchreport: 批量报告输入模块
imdocker: Docker 输入模块
imdtls: 通过 UDP 的 DTLS 协议输入模块
imfile: 文本文件输入模块 文本文件输入模块
imgssapi: GSSAPI 系统日志输入模块
Imhiredis: Redis 输入插件 Redis 输入插件
imhttp: http 输入模块
imjournal: Systemd日志输入模块
imkafka: 从 Apache Kafka 读取数据
imklog: 内核日志输入模块
imkmsg: /dev/kmsg 日志输入模块
immark: 标记消息输入模块
Impcap: 网络流量捕获
improg: 程序集成输入模块
impstats: 生成内部计数器的定期统计数据
imptcp: 普通 TCP 系统日志
imrelp: RELP 输入模块 RELP 输入模块
imsolaris: Solaris 输入模块 Solaris 输入模块
imtcp: TCP: 系统日志输入模块
imtuxedoulog: Tuxedo ULOG 输入模块 Tuxedo ULOG 输入模块
imudp: UDP Syslog 输入模块
imuxsock: Unix套接字输入模块
文档链接:https://www.rsyslog.com/doc/configuration/modules/idx_input.html
5.1.3 Parser Modules
pmciscoios
pmdb2diag: DB2 Diag 文件解析器模块
pmlastmsg:最后一条信息重复 n 次
日志消息规范化解析器模块(pmnormalize)
pmnull: Syslog 空解析器模块
pmrfc3164: 解析 RFC3164 格式的报文
pmrfc3164sd: 解析 RFC3164 报文中的 RFC5424 结构化数据
pmrfc5424: 解析 RFC5424 格式的报文
文档链接:https://www.rsyslog.com/doc/configuration/modules/idx_parser.html
5.1.4 Message Modification Modules
IP Address Anonymization Module (mmanon)
mmcount
Darwin connector (mmdarwin)
MaxMind/GeoIP DB lookup (mmdblookup)
Support module for external message modification modules
Fields Extraction Module (mmfields)
JSON/CEE Structured Content Extraction Module (mmjsonparse)
Kubernetes Metadata Module (mmkubernetes)
Log Message Normalization Module (mmnormalize)
RFC5424 structured data parsing module (mmpstrucdata)
mmrfc5424addhmac
mmrm1stspace: First Space Modification Module
Number generator and counter module (mmsequence)
mmsnmptrapd message modification module
mmtaghostname: message modification module
Fix invalid UTF-8 Sequences (mmutf8fix)
文档链接:https://www.rsyslog.com/doc/configuration/modules/idx_messagemod.html
5.1.5 String Generator Modules
smfile - 默认的 rsyslog 文件格式
smfwd - 默认的 rsyslog(网络)转发格式
smtradfile - 传统的 syslog 文件格式
smfwd - 传统的 syslog(网络)转发格式
文档链接:https://www.rsyslog.com/doc/configuration/modules/idx_stringgen.html
6.rsyslog功能配置示例
6.1 log文件数量及大小限制
方法1:
使用 A c t i o n F i l e M a x F i l e S i z e 和 ActionFileMaxFileSize和 ActionFileMaxFileSize和ActionFileMaxFiles来设置日志文件的大小和数量。例如:
$ActionFileMaxFileSize 10M # 每个日志文件最大 10MB
$ActionFileMaxFiles 5 # 最多保留 5 个日志文件
此处添加完配置项后,尝试拉起rsyslogd,有问题
zx@zx-VirtualBox:~/Desktop/codes/new/rsyslog$ sudo /home/zx/Desktop/codes/new/build/sbin/rsyslogd -f /home/zx/Desktop/codes/new/build/etc/rsyslog.conf
rsyslogd: invalid or yet-unknown config file command 'ActionFileMaxFileSize' - have you forgotten to load a module? [v8.2502.0.master try https://www.rsyslog.com/e/3003 ]
rsyslogd: invalid or yet-unknown config file command 'ActionFileMaxFiles' - have you forgotten to load a module? [v8.2502.0.master try https://www.rsyslog.com/e/3003 ]
尝试在rsyslog.conf中添加
module(load="omfile")
但是源码编译生成的lib库中没有omfile.so,这个问题还需要详细看一下
方法2:
假设您不想花费超过 100 MB 的硬盘空间 为你日志。使用 rsyslog,您可以配置 Output Channels 以实现 这。放置以下指令
# start log rotation via outchannel
# outchannel definition
$outchannel log_rotation,/var/log/log_rotation.log, 52428800,/home/me/./log_rotation_script
# activate the channel and log everything to it
*.* :omfile:$log_rotation
# end log rotation via outchannel
● outchannel: 自定义的通道名称
● /var/log/mylog.log是日志文件路径
● 10485760是文件大小上限
到 rsyslog.conf 指示 rsyslog 将所有内容记录到目标 文件 ‘/var/log/log_rotation.log’ 直到给定的文件大小为 50 MB 达到。如果达到最大文件大小,它将执行作。在 在我们的例子中,它执行脚本 /home/me/log_rotation_script 包含单个命令:
mv -f /var/log/log_rotation.log /var/log/log_rotation.log.1
#!/bin/bash
# 设置初始文件名
filename="123.txt"
# 检查文件是否存在
if [ ! -f "$filename" ]; then
echo "Error: File '$filename' does not exist."
exit 1
fi
# 循环 10 次
for i in {1..10}; do
# 查找当前目录中与文件名匹配的最大数字后缀
max_num=0
for file in "$filename".*; do
if [[ $file =~ \.([0-9]+)$ ]]; then
num=${BASH_REMATCH[1]}
if [ "$num" -gt "$max_num" ]; then
max_num=$num
fi
fi
done
# 新文件的后缀数字加 1
new_num=$((max_num + 1))
new_filename="${filename}.${new_num}"
# 移动文件
mv "$filename" "$new_filename"
echo "Moved '$filename' to '$new_filename'"
# 更新文件名,以便下一次循环使用
# filename="$new_filename"
done
这会将原始日志移动到一种备份日志文件。在 作已成功执行 rsyslog 创建一个新的 /var/log/log_rotation.log 文件,并用新日志填充它。所以 最新日志始终处于log_rotation.log。
以上过程如有问题可参考官方工程文档:
https://www.rsyslog.com/doc/installation/install_from_source.html