如何在rsyslog的Elasticsearch索引名中添加日期子串?
在rsyslog的Elasticsearch索引名中添加日期子串的正确方法
问题描述
我在配置rsyslog将日志发送到Elasticsearch时,想在索引名后追加日期子串,但尝试了多种方法都没成功。
当前可正常运行的基础配置:
module(load="imfile" PollingInterval="10") module(load="omelasticsearch") input(type="imfile" persistStateInterval="10" file="/var/log/myapp/myapp.log" tag="my_app_log") if ($syslogtag == "my_app_log") then { action(type="omelasticsearch" server=["172.x.x.x", "172.x.x.x", "172.x.x.x"] serverport="9200" searchIndex="app-logs" ) stop }
我尝试用模板生成带日期的索引名,但直接写searchIndex="string_template"会创建名为string_template的索引;去掉引号后无任何效果,既不创建索引也无错误日志。我还尝试了多种searchIndex的取值组合,都没达到预期:
- app_logs-$now (无模板)
- "app_logs-$now" (无模板)
- "app_logs-%$now%" (无模板)
- string_template
- "string_template"
- $string_template
- "$string_template"
- %$string_template%
- "%$string_template%"
正确配置方法
要实现带日期的索引名,需正确使用rsyslog模板的引用规则,同时指定合法的日期格式(避免索引名包含Elasticsearch不允许的特殊字符):
1. 定义带日期格式的模板
使用%$now-yyyy-MM-dd%生成符合规范的日期串(例如2024-05-20),模板定义如下:
template(name="daily_index" type="string" string="app-logs-%$now-yyyy-MM-dd%")
2. 在omelasticsearch中正确引用模板
在searchIndex参数中,用%模板名%的格式包裹模板名,并且保留引号,这是rsyslog引用模板变量的标准方式。
完整的可运行配置:
module(load="imfile" PollingInterval="10") module(load="omelasticsearch") # 定义按日分割的索引模板 template(name="daily_index" type="string" string="app-logs-%$now-yyyy-MM-dd%") input(type="imfile" persistStateInterval="10" file="/var/log/myapp/myapp.log" tag="my_app_log") if ($syslogtag == "my_app_log") then { action(type="omelasticsearch" server=["172.x.x.x", "172.x.x.x", "172.x.x.x"] serverport="9200" searchIndex="%daily_index%" # 正确引用模板 ) stop }
关键注意点
- 必须为日期变量指定格式,默认的
$now包含空格和特殊字符,会导致Elasticsearch索引创建失败 - 若需要按小时分割索引,可使用
%$now-yyyy-MM-dd-HH%格式 - 模板引用必须用百分号包裹模板名,同时保留引号,这是rsyslog识别模板变量的必要格式
内容的提问来源于stack exchange,提问作者Arno
相关产品推荐
相关产品推荐

