1、环境准备
windows 10
logstash7.0.0
jdk8
mysql8
需要注意得是 logstash 与jdk之间是有版本要求的,logstash版本过高的话可能就需要 jdk11环境。
1.1 logstash下载地址:
https://www.elastic.co/cn/downloads/past-releases#logstash
点击 Download 下载ZIP ,然后解压就可以了
1.2 jdk mysql环境自行安装
2、开始配置
2.1 logstash-output-jdbc 插件安装
命令:logstash-plugin install logstash-output-jdbc
管理员运行cmd 不然可能执行该命令可能报错
切换到bin 目录下 执行命令 ,提示”Installation successful“表示成功
使用命令 logstash-plugin list 可以查看 列表中是否包含安装的插件
2.2 mysql驱动
mysql-connector-java-8.0.21.jar 自己下载 或者在本地maven 库中可以获取
2.3 修改logstash配置文件
logstash-7.0.0\config文件下,复制一份logstash-sample.conf 重命名 logstash-test.conf(你可以改成你想要的名称)
logstash-test.conf 内容
input 数据输入
filter 过滤规则
output 数据输出
input {
file {
path => "D:/orderlog/ev-dataaccess-stake.2022-07-06.1.log"
start_position => "beginning"
}
}
filter {
grok {
match => {
"message" => "batch (?<type>connectorOrderToMysql) - orderId:(?<orderId>[0-9]*),startChargeSeq:(?<startChargeSeq>[a-z|A-Z|0-9]*),"
}
}
mutate{
remove_field => ["@version","@timestamp","path"]
}
}
output {
jdbc {
driver_jar_path => "D:/mysql-connector-java-8.0.21.jar"
driver_class => "com.mysql.cj.jdbc.Driver"
connection_string => "jdbc:mysql://localhost:3306/ordertest?user=root&password=root&useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&zeroDateTimeBehavior=convertToNull"
statement => [ "INSERT INTO order_mysql_7_6 (type,seq) VALUES(?,?)","type","startChargeSeq" ]
}
stdout {
codec => json_lines
}
}
3. 管理员 cmd 在logstash的bin目录下 命令:logstash -f ../config/logstash-test.conf
数据库插入成功
3、需要注意的
3.1 配置文件中路径 使用 ”/“分割,
配置中 path l路径中开始使用 ”\“,导致读取文件失败
input {
file {
path => "D:/orderlog/ev-dataaccess-stake.2022-07-06.1.log" #你需要分析的文件
start_position => "beginning"
}
}
3.2 output -jdbc 配置中
output {
jdbc {
driver_jar_path => "D:/mysql-connector-java-8.0.21.jar" #自己的驱动路劲
driver_class => "com.mysql.cj.jdbc.Driver" # 注意 cj新的驱动名称
connection_string => "jdbc:mysql://localhost:3306/ordertest?user=root&password=root&useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&zeroDateTimeBehavior=convertToNull"
statement => [ "INSERT INTO order_mysql_7_6 (type,seq) VALUES(?,?)","type","startChargeSeq" ]
}
stdout {
codec => json_lines
}
}
(1)connection_string: 数据库的账户 密码 跟在url中,mysql8需要有 ”&useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&zeroDateTimeBehavior=convertToNull“
(2)statement : 执行的sql 有下3种写法
① statement => [ "INSERT INTO order_mysql_7_6 (type,seq) VALUES(?,?)","type","startChargeSeq" ]
② statement => [ "INSERT INTO order_mysql_7_6 (type,seq) VALUES(?,?)","[type]","[startChargeSeq]" ]
③ statement => [ "INSERT INTO order_mysql_7_6 (type,seq) VALUES(?,?)","%{type}","%{startChargeSeq}" ]
因为测试中发现,日志中不内容不匹配的时候也会执行插入操作,
① ② 会插入大量空值 如果不想要数据库中需要大量的空值,暂时解决是对数据库进行设置,不允许为空,这样虽然logstash会有插入sql报错。 有更好的方法可以评论区回复。
③ 会将%{type} %{startChargeSeq}作为值插入