Windows環境下的ELK及MongoDB的介接測試

本篇延續「於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」路徑下

補充:

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來碰碰運氣

image

  • 另外在使用不同版本的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

http://www.51niux.com/?id=205

Logstash架構參考(簡):https://cloud.tencent.com/developer/article/1368189