本篇延續「於Windows環境下安裝ELK及其介接SQL Server測試」,使用MongoDB作為資料來源,使用Logstash服務驅動mongodb的連線,透過jdbc mongodb driver將MongoDB的資料加入至ElasticDB,並於Kibana上檢視。
MongoDB工具:Robo 3T
Logstash:7.5.1
Mongo JDBC:1.6
Mongo Java JDBC:3.11.2
本範例先簡單介紹MongoDB需要建立的物件
首先需在admin資料庫裡面增加一個Collection(筆者命名為AppLog),主要用來存放程式交易的日誌。
作法參考以下建立語法:
db.createCollection('AppLog'); //建立Collection
db.AppLog.insert( //新增一筆Document
{
'LogID' : 'L3544442046X5003',
'Tid': 'T3547442046X5345',
'ParentTid' : 'T3547442046X5000',
'Timestamp' : '2019-12-23 00:00:14.953',
'UserID' : 'USER001',
'ExecutionTime' : '0.0685697',
'Direction' : '2',
'SessionID' : 'xcrhve9horj9votbngzgt54e',
'MenuID' : 'Report',
'Source' : '1',
'Level' : '3',
'AppID' : 'TingSystem.NodeMvc',
'HostIP' : '192.168.123.1',
'HostName' : 'DESKTOP-BAS9PLU',
'ClientIP' : '192.168.123.1'
}
);
使用以下語法進行查看結果:
db.getCollection('AppLog').find({})
於admin資料庫下新增使用者身分,語法參考如下:
db.createUser(
{
user: 'ting', //帳號
pwd: 'pwd123456', //密碼
roles: [{ //存取權限設定
role: 'userAdminAnyDatabase',
db: 'admin'
}]
})
執行結果,如下圖:(執行完語法後,會顯示「Successfully added user」,重新整理admin資料庫,可以看到Users目錄下新增的使用者)
檢驗一下登入狀況是否成功,如下圖操作。
至Kibana上建立index(筆者命名為ting_mongo_index)
MongoDBlog.conf的內容如下:(主要參考來源:https://github.com/elastic/logstash/issues/11314)
input {
jdbc {
jdbc_connection_string => "jdbc:mongodb://localhost:27017/admin"
jdbc_driver_library => ""
jdbc_driver_class => "com.dbschema.MongoJdbcDriver"
jdbc_user => "ting"
jdbc_password => "pwd123456"
jdbc_validate_connection => true
statement => "db.getCollection('AppLog').find({},{ '_id':0})"
tags => "mongodb"
codec => json
}
}
output {
elasticsearch {
hosts => ["localhost:9200"]
index => "ting_mongo_index"
doc_as_upsert => true
document_id => "%{mongo_id}"
}
stdout { codec => rubydebug }
}
針對上述Conf設定,進行環境設定。
下載mongojdbc(下載處),並將其解壓縮至「 D:\ELK\logstash-7.5.1\logstash-core\lib\jars」路徑下
補充:
- mongodb uri設定參考:https://docs.mongodb.com/manual/reference/connection-string/
- 若沒有加入mongojdbc1.6.jar會產生PluginLoadingError的錯誤。
Error: com.dbschema.MongoJdbcDriver not loaded. Are you sure you've included the correct jdbc driver in :jdbc_driver_library?
Exception: LogStash::PluginLoadingError
- 若沒有加入mongo-java-driver-3.11.2.jar,則會產生以下錯誤。
JavaLang::NoClassDefFoundError: com/mongodb/MongoClientURI
- 如果statement中不加入{ '_id' = 0 },查詢的時候會顯示_id欄位,會無法處理ObjectId方法的解析動作,錯誤如下
DatabaseError: Java::OrgLogstash::MissingConverterException: Missing Converter handling for full class name=org.bson.types.ObjectId, simple name=ObjectId>}
- 承上,若使用較舊的jdbc版本(mongojdbc1.2.jar),則有可能造成 statement語法的解析問題,如下。
Exception when executing JDBC query {:exception=>#<Sequel::DatabaseError: Java::JavaSql::SQLException: TypeError: Can not invoke method [jdk.internal.dynalink.beans.OverloadedDynamicMethod
完成上述conf檔的設定後,執行logstash -f指定,執行成功的結果如下圖。
於Kibana上顯示查詢結果,如下圖。
承上圖,若hits屬性有顯示MongoDB的資料則為成功,若為[ ],則需檢查Logstash -f指令產生的錯誤並進行參數調整
踩雷心得補充:
- 筆者曾使用安裝過logstash-plugin(參考處),進行驅動測試,但是在多次修改conf格式後,執行logstash -f指令時,仍有Jruby的轉型問題。
Pipeline aborted due to error {:pipeline_id=>"main", :exception=>java.lang.ClassCastException: org.jruby.RubyNil cannot be cast to org.jruby.RubyFixnum, :backtrace=>["org.jruby.runtime.invokedynamic.MathLinker.fixnum_op_equal(MathLinker.java:237)", "java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:627)", "org.jruby.runtime.invokedynamic.MathLinker.fixnumOperator(MathLinker.java:171)"
- 有外國網友建議使用較舊版本的logstash,但筆者在測試安裝logstash-plugin時,會出現編碼問題無法解決,迫於無奈下,才決定使用Mongo jdbc來碰碰運氣
- 另外在使用不同版本的Mongo jdbc在進行驅動的時候,在解析query statement時,也可能發生SQLException,如下圖。(以下為mongojdbc1.2.jar的執行結果)
參考來源:
https://www.cnblogs.com/a-du/p/8298418.html
http://nightgossoon.pixnet.net/blog/post/265917223
https://www.latech.tw/2018/01/mongodb-shell.html
Logstash架構參考(簡):https://cloud.tencent.com/developer/article/1368189