天天看點

【最佳實踐】Elastic:機器學習的實踐 - categorization

簡介:

如果你有基于消息的日志條目,但是這些日志條目是機器生成的,則在将它們用于異常檢測之前,首先需要将它們組織成類似的消息類型。 該過程稱為分類 (cateogrization),Elastic ML 可以幫助完成該過程。Categorization 将結構引入半結構化資料,以便對其進行分析。這樣做的好處就是在事先在并不知道 message 含有什麼,就能找到日志裡的異常。

文本作者:劉曉國,Elastic 公司社群布道師。新加坡國立大學碩士,西北工業大學碩士,曾就職于新加坡科技,康柏電腦,通用汽車,愛立信,諾基亞,Linaro,Ubuntu,Vantiq 等企業。

如果你想一站式快速體驗 Elasticsearch 所有功能(免費提供機器學習、 X-pack 能力),開通

阿裡雲 Elasticsearch 1核2G

,即可首月免費試用。

可以供 categorization 的資訊種類

在定義此處要考慮的基于消息的日志行的類型時,我們需要稍微嚴格一些。 我們不考慮的是完全自由格式的日志行/事件/文檔,并且很可能是人工建立的結果(電子郵件,tweet,評論等)。 這類消息過于随意,其結構和内容也不盡相同。

相反,我們專注于機器生成的消息,當應用程式遇到不同的情況或異常時,這些消息顯然會發出,進而将其構造和内容限制為相對離散的可能性集(請注意,消息的确可能存在某些可變方面) 。 例如,讓我們看一下應用程式日志的以下幾行:

18/05/2016 15:16:00 S ACME6 DB Not Updated [Master] Table 18/05/2016
15:16:00 S ACME6 REC Not INSERTED [DB TRAN] Table 
18/05/2016 15:16:07 S ACME6 Using: 10.16.1.63!svc_prod#uid=demo;pwd=demo 
18/05/2016 15:16:07 S ACME6 Opening Database = DRIVER={SQL
Server};SERVER=10.16.1.63;network=dbmssocn;address=10.16.1.63,1433;DATABASE
=svc_prod;uid=demo;pwd=demo;AnsiNPW=No 
18/05/2016 15:16:29 S ACME6 DBMS ERROR : db=10.16.1.63!svc_prod#uid=demo;pwd=demo Err=-11 [Microsoft][ODBC SQL Server Driver][TCP/IP Sockets]General network error. Check your network documentation.           

在這裡,我們可以看到每種消息都有不同的文本,但是這裡有一些結構。 在消息的日期/時間戳和伺服器名稱之後(此處為ACME6),有消息的實際内容,應用程式在此通知外部世界當時正在發生的事情-是否正在嘗試某些操作或 發生錯誤。

Categorization 流程

為了能從無序日志檔案中能偵測出有序的規律,Elastic ML 将采用通過使用字元串相似性聚類算法将相似消息分組在一起的技術。 該算法的啟發式方法大緻如下:

• 重點放在(英文)詞典單詞而不是可變單詞上(也就是說,network 和 address 是詞典單詞,但是 dbmssocn 可能是可能更改的字元串 - mutable/variable string)

• 通過字元串相似性算法(與 Levenshtein 距離相似)傳入不可變字典單詞,以确定對數行與過去的對數行有多相似

• 如果目前日志行與現有類别之間的差異很小,則将現有日志行分組到該類别中

• 否則,為目前日志行建立一個新類别

作為一個簡單的示例,請考慮以下三個消息:

Error writing file "foo" on host "acme6"
Error writing file "bar" on host "acme5"
Opening database on host "acme7"           

該算法會将前兩個消息歸為同一類别,因為它們将被視為在消息類型上 Error writing file,而第三個消息将被賦予其自己的(新)類别。

這些類别的命名很簡單:ML 隻會将它們稱為 mlcategory N,其中N是遞增的整數。 是以,在此示例中,前兩行将與 mlcategory 1 關聯,第三行将與 mlcategory 2 關聯。在現實的機器日志中,可能會生成數千(甚至數萬)個類别 由于日志消息的多樣性,但是可能類别的集合應該是有限的。 但是,如果類别的數量開始達到數十萬,那麼很顯然,日志消息不是一組有限的消息類型,是以也不适合用于這種類型的分析。

它是如何工作的?

假如我們有一組如下的資訊:

【最佳實踐】Elastic:機器學習的實踐 - categorization

上面是一組 Linux 的日志資訊。我們看看 categorization 是如何起作用的。

第一步,就是去掉那些 mutable 文字,也就是可以被修改的文字:

【最佳實踐】Elastic:機器學習的實踐 - categorization

因為日期, IP位址和上面的被隐去的字段是會經常變化的。去掉它們就是上面的樣子。

第二步,将相似的消息聚集在一起

【最佳實踐】Elastic:機器學習的實踐 - categorization

我們仔細檢視一下,可以看出來如下的 category:

【最佳實踐】Elastic:機器學習的實踐 - categorization

從上面我們可以看出來有6個不同 category。每個 category 的資料結構來說有很大的相似性。有的 category 裡有一個文檔,但是有的 category 裡有很多的文檔,比如 category 6。

第三步,對每個時間 bucket 進行統計

【最佳實踐】Elastic:機器學習的實踐 - categorization

針對每個時間 bucket 進行事件數目的統計。我們可以通過 ML 來對這個計數進行異常分析。

動手實踐

導入實驗資料

在接下來的實踐中,我們想使用一個具體的例子來進行展示。你可以到如下的位址進行下載下傳代碼:

git clone https://github.com/liu-xiao-guo/ml_varlogsecure           

我們下載下傳上面的源碼。我将使用 Filebeat 來把資料導入到 Elasticsearch 中:

filebeat_advanced.yml

filebeat.inputs:
- type: log
  paths:
    - /Users/liuxg/data/ml_data/advanced/secure.log
  
output.elasticsearch:
  hosts: ["http://localhost:9200"]
  index: varlogsecure
  pipeline: varlogsecure
 
setup.ilm.enabled: false
setup.template.name: varlogsecure
setup.template.pattern: varlogsecure           

我們導入的索引的名字叫做 varlongsecure。記得修改上面的 secure.log 的路徑。

secure.log 檔案的事件内容如下:

Oct 22 15:02:19 localhost sshd[8860]: Received disconnect from 58.218.92.41 port 26062:11:  [preauth]
Oct 22 15:02:19 localhost sshd[8860]: Disconnected from 58.218.92.41 port 26062 [preauth]
Oct 22 18:17:58 localhost sshd[8903]: reverse mapping checking getaddrinfo for host-41.43.112.199.tedata.net [41.43.112.199] failed - POSSIBLE BREAK-IN ATTEMPT!
Oct 22 18:17:58 localhost sshd[8903]: Invalid user admin from 41.43.112.199 port 41805           

在上面我們可以看出來,沒有 year,資訊。為了能夠對這個資訊進行處理,我們必須在 Elasticsearch 中運作 pipeline:

PUT /_ingest/pipeline/varlogsecure
{
  "processors": [
    {
      "grok": {
        "field": "message",
        "patterns": [
          "%{MONTH:month} %{MONTHDAY:day} %{TIME:time}"
        ]
      }
    },
    {
      "set": {
        "field": "timestamp",
        "value": "2018 {{month}} {{day}} {{time}}"
      }
    },
    {
      "date": {
        "field": "timestamp",
        "target_field": "@timestamp",
        "formats": [
          "yyyy MMM dd HH:mm:ss"
        ]
      }
    },
    {
      "remove": {
        "field": ["timestamp", "day", "time", "month"]
      }
    }
  ]
}           

在上面,我們定義了一個叫做 varlogsecure 的 pipeline。這個 pipleline 也在上面的 filebeat_advanced.yml 中引用。

我們可以啟動 Filebeat 把資料導入到 Elasticsearch 中:

./filebeat -e -c filebeat_advanced.yml            

運作完上面的 Filebeat 後,我們可以在 Elasticsearch 中找到最新生成的 varlogsecure 索引:

GET _cat/indices           
【最佳實踐】Elastic:機器學習的實踐 - categorization

我們接下來為 varlogsecure 建立一個 index pattern。這裡就不再累述了。我們可以在 Discover 中看見:

【最佳實踐】Elastic:機器學習的實踐 - categorization

從上面我們可以看出來,我們的資料位于2018-10-22 日到2018-10-26之間。在上面我們可以看到一個叫做 message 的字段,它含有我們最原始資訊的所有文字。這個 message 字段将在一下被用于 categorization。

機器學習 - categorization

選擇機器學習應用:

【最佳實踐】Elastic:機器學習的實踐 - categorization
【最佳實踐】Elastic:機器學習的實踐 - categorization

點選 Manage jobs 或者 Create jobs (如果你從來還沒有建立過機器學習作業)。

【最佳實踐】Elastic:機器學習的實踐 - categorization

點選 Create job:

【最佳實踐】Elastic:機器學習的實踐 - categorization

選擇 varlogsecure 索引:

【最佳實踐】Elastic:機器學習的實踐 - categorization

選擇 Advanced:

【最佳實踐】Elastic:機器學習的實踐 - categorization

選擇 Next:

【最佳實踐】Elastic:機器學習的實踐 - categorization

在 Categorization field 中,我們選擇 message 字段。點選 Add detector:

【最佳實踐】Elastic:機器學習的實踐 - categorization

在上面 By field 裡,我們選擇 mlcategory。點選 Save 按鈕:

【最佳實踐】Elastic:機器學習的實踐 - categorization

點選 Next:

【最佳實踐】Elastic:機器學習的實踐 - categorization

點選 Next 按鈕:

【最佳實踐】Elastic:機器學習的實踐 - categorization
【最佳實踐】Elastic:機器學習的實踐 - categorization
【最佳實踐】Elastic:機器學習的實踐 - categorization

點選 Start:

【最佳實踐】Elastic:機器學習的實踐 - categorization

進入到 Anomly Explorer:

【最佳實踐】Elastic:機器學習的實踐 - categorization

在這裡,我們可以看到一些異常出現了。打開上面的 October 25th, 2018 這個異常事件:

【最佳實踐】Elastic:機器學習的實踐 - categorization

我們可以看到有一個是 mlcategory 7 的異常。它典型的值是0.00192,但是實際上它出現的事件總數是7 。屬于一個不正常的事件。

總結

在今天的練習中,我們使用了 Elastic 的機器學習的 categorization 功能對我們的日志資訊進行了分析。這個好處是我們不必事先對日志有任何了解的前提下,我們運作機器學習的功能對日志中的異常進行分析。

聲明:

本文版權歸作者所有,未經許可不得擅自轉載或引用。

【最佳實踐】Elastic:機器學習的實踐 - categorization

阿裡雲Elastic Stack

】100%相容開源ES,獨有9大能力,提供免費 X-pack服務(單節點價值$6000)

相關活動

更多折扣活動,請

通路阿裡雲 Elasticsearch 官網 阿裡雲 Elasticsearch 商業通用版,1核2G ,SSD 20G首月免費 阿裡雲 Logstash 2核4G首月免費 下載下傳白皮書:Elasticsearch 八大經典場景應用
【最佳實踐】Elastic:機器學習的實踐 - categorization
【最佳實踐】Elastic:機器學習的實踐 - categorization