Doris快速搭建
快速体验 Apache Doris - Apache Doris
从 Logstash 导入 Doris
腾讯云数据仓库 TCHouse-D 从 Logstash 导入 Doris-开发指南-文档中心-腾讯云
Logstash 导入 Doris的配置文件
# 将日志数据 “2024-05-08 18:35:56,094 INFO org.apache.flink.runtime.taskexecutor.TaskManagerRunner [] - --------------------------------------------------------------------------------”
通过grok使用正则表达式,将文本数据转换成结构化数据,再使用jdbc将数据存入到doris表中
input{
file {
# path => "/home/cloud/logstash-8.13.3/test.log" #随便找一个文本路径,也可以使用“*”进行模糊匹配
path => "/app/tmn/middleware/flink/log/flink-tmn-taskexecutor-3-fccenter-2.log" #随便找一个文本路径,也可以使用“*”进行模糊匹配
type => "log" #收集日志类型
start_position => "beginning" #从文本起始位置开始收集
}
}
filter{
grok {
match => {
"message" => "^(?<log_date>(%{YEAR}-%{MONTHNUM}-%{MONTHDAY}) (%{TIME})) (?<log_level>\w+)\s+(?<class_name>[^\s]+)\s+\[\] - (?<log_message>.+)$"
}
}
}
output {
stdout {
codec => rubydebug
}
jdbc {
driver_jar_path => "/home/cloud/logstash-8.13.3/config/mysql-connector-java-8.0.28.jar"
# Doris JDBC 连接字符串
connection_string => "jdbc:mysql://127.0.0.1:9030/demo?user=admin&password=123456"
# 目标表名
statement => ["INSERT INTO log_data (log_date, log_level, class_name, log_message) VALUES (?, ?, ?, ?)", "%{log_date}", "%{log_level}", "%{class_name}", "%{log_message}"]
}
}
补充
问题1:logstash 配置文件中start_position => "beginning" 是怎么做到只读一次全部文件数据,后续只读追加数据的?
在Logstash的配置文件中,start_position => "beginning"
表示Logstash会从文件的起始位置开始读取数据。这意味着它会读取整个文件的内容,而不是仅仅从当前位置开始读取。
一旦Logstash读取了整个文件的内容,后续的处理将会从文件的末尾开始。这样就实现了你所描述的只读取一次全部文件数据,然后只读取追加的数据。
问题2:start_position => "beginning"
是怎么实现的,如果我想重新读取整个文件的内容怎么办?
Logstash 使用了一个称为"sincedb"的机制来跟踪每个文件的读取位置。sincedb 是一个记录了每个文件读取状态的文件,它包含了文件路径、文件的inode号以及最后一次读取的位置等信息。这个机制允许 Logstash 在重新启动后恢复到正确的读取位置,并且避免重复读取已经处理过的数据。
如果想重新读取整个文件的内容,可以通过删除 sincedb 文件的方式来实现。sincedb 文件通常位于 Logstash 的 data 目录下,默认是在 Logstash 安装目录下的 data 目录中。删除 sincedb 文件后,Logstash 将重新读取所有文件的起始位置,从而重新处理文件中的所有数据。(先关闭Logstash 再删除 sincedb 文件!)