有些既存的项目把一部分日志信息写入到数据库中了,或者是由于其它的原因我们希望把关系型数据库中的信息读取到 elasticsearch 中。这种情况可以使用 logstash 的 jdbc input 插件从关系型数据库中读取日志数据,然后输出到 elasticsearch 中。本文介绍如何在 windows 系统中配置 logstash 从 SQL Server 数据库中读取数据。
说明:演示的环境为 windows server 2016,logstash 的版本为 6.2.4。

关键步骤

本文将按照下面的顺序介绍使用 logstash 从 SQL Server 数据库导出数据的关键步骤:

  • 安装 Java Development Kit(JDK)
  • 安装 Logstash
  • 安装 SQL Server 的 JDBC 驱动
  • 配置 Logstash
  • 集成域认证
  • 持续读取数据
  • 把时间戳设置为记录产生的时间

安装 Java Development Kit(JDK)

运行 logstash 6.2.4 需要先在环境中安装 JDK,请不要安装最新版本的 JDK,最好是安装 JDK8,演示中笔者安装的版本为 jdk-8u111-windows-x64,直接安装到默认的目录中。
在 logstash 的运行脚本中用到了 JAVA_HOME 环境变量,因此我们需要先添加这个环境变量(注意,环境变量的值为 JDK 的实际安装目录):

环境变量添加完成后,新启动一个 PowerShell 窗口,执行下面的命令:

> echo $env:JAVA_HOME

通过输出的结果验证环境变量是否被正确添加。

安装 Logstash

请从官方下载 logstash 的 windows 安装包,其实就是一个 zip 文件,比如:logstash-6.2.4.zip。Logstash 的安装非常简单,直接解压缩就可以了。示例中,我把它解压到了 C 盘的根目录下,并重命名为 logstash,因此 logstash 的安装目录为:C:\logstash。
如果你想把 logstash 配置为 windows service 运行在后台,请参考《Windows 下配置 Logstash 为后台服务》一文。

安装 SQL Server 的 JDBC 驱动

Logstash 需要使用 JDBC 驱动从 SQL Server 数据库中读取数据,因此我们还需要安装 JDBC 驱动。同样不要去获取最新版本的驱动程序,请选择 Microsoft JDBC Driver 4.2 for SQL Server。下载安装包 sqljdbc_4.2.8112.200_enu.exe,然后运行它。其实它只是个自解压的压缩包,选个目录并解压缩。笔者选择的 C 盘的根目录,所以驱动文件的绝对路径为:
C:\sqljdbc_4.2\enu\jre8\sqljdbc42.jar

在 logstash jdbc 插件中,我们可以直接指定这个文件的绝对路径,比如:

input {
jdbc {
jdbc_driver_library => "C:\sqljdbc_4.2\enu\jre8\sqljdbc42.jar"
...
}
}

除了这种方式,我们还可以通过添加环境变量的方法来指定 JDBC 驱动。在 windows 系统中再添加一个名为 CLASSPATH 环境变量,变量的值为:

.;C:\sqljdbc_4.2\enu\jre8\sqljdbc42.jar
. 表示在当前目录下查找,接着是一个 ;(分号)和后面的绝对路径。如果这个路径中包含空格,需要使用双引号包裹这个路径。
在添加了环境变量 CLASSPATH 后,就可以删除上面配置文件中的 jdbc_driver_library 信息了!本文的示例中将会使用 CLASSPATH 环境变量。

配置 Logstash

从 SQL Server 数据库中读取数据是由 logstash 的 JDBC 插件实现的,该插件作为 input 插件默认已随 logstash 安装,可以直接使用:

input {
jdbc {
jdbc_driver_class => "com.microsoft.sqlserver.jdbc.SQLServerDriver"
jdbc_connection_string => "jdbc:sqlserver://DBSVR_NAME;databaseName=DB_NAME;user=****;password=****;"
jdbc_user => "****"
jdbc_password => "****"
statement => "SELECT * FROM [DB].[SCHEMA].[TABLE]"
}
}
output {
file {
path => "c:\output.txt"
}
}

jdbc_connection_string 描述了到 SQL Server 的连接字符串,你需要指定 SQL Server 服务器的地址、目标数据库的名称以及用户名称及其密码。jdbc_user 和 jdbc_password 是对连接字符串中用户名、密码的重复。statement 则用来指定查询语句,它返回的结果会被 logstash 获取到。简单起见,我把结果输出到了本机的 c:\output.txt 文件中,这样比较容易调试。
请根据你的实际情况更新上面的配置文件,并保存到 C:\logstash\sql.conf 文件中,然后以管理员权限启动 PowerShell 并进入到 C:\logstash 目录,执行下面的命令:

> .\logstash.bat -f .\sql.conf

如果配置信息正确, statement 指令指定的 SQL 语句的执行结果就会被保存到 C:\output.txt 文件中。

集成域认证

Windows 平台下很多场景中都会使用集成域认证的方式进行身份认证,比如在上例中采用集成域认证的方式代替连接字符串中的用户名和密码:

input {
jdbc {
jdbc_driver_class => "com.microsoft.sqlserver.jdbc.SQLServerDriver"
jdbc_connection_string => "jdbc:sqlserver://DBSVR_NAME;databaseName=DB_NAME;integratedSecurity=true;"
jdbc_user => ""
statement => "SELECT * FROM [DB].[SCHEMA].[TABLE]"
}
}

在 jdbc_connection_string 字符串中我们用 integratedSecurity=true 替换了用户名和密码,并且删除了配置项 jdbc_password。 配置项 jdbc_user 也被设置成了空字符串,因为此时 jdbc_user 的值可以随便设置,但不能不设置。

配置 sqljdbc_auth.dll
如果此时启动 logstash 会收到 "无法加载 sqljdbc_auth.dll" 的错误。原因是使用域集成认证时,需要加载 sqljdbc_auth.dll,默认的设置无法找到这个 dll。这个 dll 就在我们安装的 JDBC 驱动目录下,我们需要在 C:\logstash\config\jvm.options  文件中显示指定它的路径。比如添加下面的行:

-Djava.library.path=C:\sqljdbc_4.\enu\auth\x64

因为我们的演示环境是 x64 架构的,所以这里指定 x64 目录,对于 x86 架构的系统,请指定 x86 目录。
现在就可以通过域认证的方式访问 SQL Server 了,重新执行一遍前面的命令试试!

持续读取数据

使用现在的配置,每执行一遍 .\logstash.bat -f .\sql.conf 命令就会把数据重复追加到 output.txt 文件中一遍。也就是说,每次执行 statement 语句返回的结果都基本一样,不仅无法持续地从数据库读取数据,还会重复输出已经获取过的内容。我们可以使用 jdbc 插件的内置变量 sql_last_value 和配置项 schedule、use_column_value、tracking_column 解决这个问题:

schedule => "* * * * *"
statement => "SELECT * FROM [DB].[SCHEMA].[TABLE] WHERE id > :sql_last_value"
use_column_value => true
tracking_column => "id"

schedule => "* * * * *" 表示每隔一分钟重复执行一次数据读取的操作,它支持 crontab 的语法,所以我们可以根据需要灵活设置读取数据的间隔。内置变量 sql_last_value 会在本地保存一个值,它记录了上次读取的最后一条记录中的一个值,如果 use_column_value 被设置为 true 且 tracking_column 被设置为 "id",则 sql_last_value 保存的就是 id 列的最后一个值(在关系型数据库中,id 列是比较常见的设计)。
上面配置的含义为:

  • sql_last_value 变量总是记录上次读取的最后一条记录中的 id。
  • 每隔一分钟执行一次数据读取操作。
  • 每次只读取上次读取后新增的数据。

把时间戳设置为记录产生的时间

在日志的查询操作中,很多行为是基于默认的 @timestamp 字段的。@timestamp 字段可以简单的理解为日志记录产生的时刻。但是如果我们的日志记录是从数据库或其它地方导入过来的,@timestamp 字段默认记录的是导入日志的时刻,这是不正确的。如果原有的日志记录中保存有日志产生的时刻,我们就可以由它来获得 @timestamp 字段的值:

filter {
mutate {
add_field => { "logtime" => "%{actiondatetime}" }
}
date {
match => ["logtime", "ISO8601"]
target => "@timestamp"
remove_field => [ "logtime" ]
}
}

上面的配置假设数据库中 actiondatetime 列保存了 datetime 类型的数据,通过一个临时字段 logtime 把 actiondatetime 列保存的信息设置给 @timestamp。这样导入后的日志记录的 @timestamp 字段与 actiondatetime 字段保持一致。

参考:
Jdbc input plugin
How to copy SQL Server data to Elasticsearch using LogStash

Logstash : 从 SQL Server 读取数据的更多相关文章

  1. SQL Server 变更数据捕获(CDC)监控表数据

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 实现过程(Realization) 补充说明(Addon) 参考文献(References) ...

  2. 《转》SQL Server 2008 数据维护实务

    SQL Server 2008 数据维护实务 http://blog.csdn.net/os005/article/details/7739553 http://www.cnblogs.com/xun ...

  3. SQL Server中数据的修改是如何落盘的?

    SQL Server 维护着一个叫做buffer cache的东西, 在buffer cache中SQL Server 读取必须被取回的data pages. 数据在修改时并不是直接写到磁盘上的, 而 ...

  4. SQL Server 迁移数据到MySQL

    一.背景 由于项目开始时候使用的数据库是SQL Server,后来把存储的数据库调整为MySQL,所以需要把SQL Server的数据转移到MySQL:由于涉及的表比较多,所以想在MySQL中生成对应 ...

  5. 在SQL Server中将数据导出为XML和Json

        有时候需要一次性将SQL Server中的数据导出给其他部门的也许进行关联或分析,这种需求对于SSIS来说当然是非常简单,但很多时候仅仅需要一次性导出这些数据而建立一个SSIS包就显得小题大做 ...

  6. ORACLE和SQL SERVER的数据同步常用方法

    ORACLE和SQL SERVER的数据同步常用方法 1. 自己编程,或者第三方工具2. 在sqlserver中,使用linkedserver,访问oracle,然后编写job进行数据同步3. 在or ...

  7. 数据库迁移(SQL SERVER导入数据到MySql)

    地址:http://blog.csdn.net/jiaohougenyang/article/details/44937801 背景:项目最开始时使用的是SQL Server数据库,业务需求现要将数据 ...

  8. 不同版本的SQL Server之间数据导出导入的方法及性能比较

    原文:不同版本的SQL Server之间数据导出导入的方法及性能比较 工作中有段时间常常涉及到不同版本的数据库间导出导入数据的问题,索性整理一下,并简单比较下性能,有所遗漏的方法也欢迎讨论.补充. 0 ...

  9. SQL Server GUID 数据迁移至MongoDB后怎样查看?

    关键字:SQL Server NEWID():BSON:MongoDB UUID 1.遇到的问题和困惑 SQL Server中的NEWID数据存储到MongoDB中会是什么样子呢?发现不能简单的通过此 ...

随机推荐

  1. WPF的点击穿透

    1.background 为{x:null} 或  鼠标点击会穿透,如果不想让一个透明的border点击穿透,设置透明色Transparent时就可以点到这个看起来透明的border 2.当依赖属性I ...

  2. 读unp并动手实践

    经过三个月的学习,我发现进度比较慢.照这个进度下去,平均一周花费5-6小时,还不知道读完全书需要多久. 现在做个计划,全书除开简介部分分为 基础 和 高级 套接字编程两部分,其中 基础可以分为 TCP ...

  3. Android零基础入门第5节:善用ADT Bundle,轻松邂逅女神

    原文:Android零基础入门第5节:善用ADT Bundle,轻松邂逅女神 在前几期中总结分享了Android的前世今生.Android 系统架构和应用组件那些事.带你一起来聊一聊Android开发 ...

  4. 搭建svn服务器&服务器客户端使用笔记

    参考借鉴文章:http://www.cnblogs.com/vijayfly/p/5711962.html 之前尝试着用git管理公司代码,但被一个问题困惑了很久无法解决,那就是git该如何只pull ...

  5. Android零基础入门第68节:完善RecyclerView,添加首尾视图

    在之前学习ListView的时候,有学习过如何给ListView添加列表头和列表尾.但是通过近几期的学习,发现RecyclerView是一个比ListView更加强大和灵活的组件,今天一起来学习如何给 ...

  6. Office Add-in Model 简介

    原文地址:http://simpeng.net/office-add-in/office-add-in-model-%e7%ae%80%e4%bb%8b/ , 为了本博客内容的完整性,转载至此. Of ...

  7. How to Capture the Integer-Divide-By-Zero Error in C++(提前定义信号)

    How to Capture the Integer-Divide-By-Zero Error in C++? MANUAL CAPTURE The simple and straightforwar ...

  8. Qt通过HTTP POST上传文件(python做服务端,附下载)

    本文使用Qt Creator用HTTP POST的方法上传文件,并给出一个上传文件的例程. 本文主要客户端,所以对于服务器端程序编写的描述会比较简略 服务器使用Django编写,django服务器接收 ...

  9. LFS Linux From Scratch 笔记2(经验非教程)BLFS

    LFS 完了. 其实还没完,还要装一些其他的组件,系统才算是对人类有用的系统. 正好这里有个BLFS Beyound Linux From Scratch 的教程. 其实,按照现有的可运行的LFS系统 ...

  10. python的实用函数

    >>> file=open('txt.txt','a') >>> print >> file,'hello,world' >>> fi ...