Amazon-Ec2

在 Amazon EC2 上記錄/擷取 STDERR/STDOUT

  • January 11, 2014

我正在尋找一種解決方案,可以讓我自動擷取在 Amazon EC2 上執行的程序的 STDOUT/STDERR,並將其(遠端)發送到另一台伺服器。

聽起來很簡單,除了:

  1. 我將使用現場實例,這意味著我無法準確控制它們何時開始,它們可以隨時終止(無需正確關閉)
  2. 因為沒有關閉,所以我不能在程序完成後寫入本地文件並將其傳輸(例如到 s3)。
  3. 輸出的結構不是很好(例如,日誌文件中沒有表格欄位),因此“標準”雲日誌記錄解決方案並非微不足道,並且使用其中一個雲數據庫並不理想。

我考慮了幾個想法,但每個都有一個問題:

  1. 無法附加到“s3”上的文件,並且重寫文件對於記錄來說太慢了。
  2. 據我所知,共享 EBS 卷(作為驅動器)是不可能的。
  3. 使用“simple_db”聽起來太慢了(而且“simple_db”已經在測試版中使用多年了,所以我不確定它是否可用)。
  4. 使用 SQS(例如每行輸出一條消息?)非常慢。
  5. 如果連接斷開一秒鐘,重定向到網路套接字將失敗(例如“myprogram 2>&1 | nc my.log.server 7070”

也許有一個帶有遠端日誌記錄的“系統日誌”解決方案?但這是否需要一個單獨的“按需”實例來收集資訊?

任何提示和想法將不勝感激。

謝謝,-g

我希望亞馬遜有一些專為記錄而設計的“僅附加”或“主要附加”服務。

可能像 Amazon Kinesis 一樣?

使用 Amazon Kinesis,您可以讓生產者將數據直接推送到 Amazon Kinesis 流中。例如,系統和應用程序日誌可以送出到 Amazon Kinesis 並在幾秒鐘內可供處理。如果前端或應用程序伺服器出現故障,這可以防止日誌數據失去。Amazon Kinesis 提供了加速的數據饋送接收,因為您在送出數據以供接收之前不會在伺服器上對數據進行批處理。”

http://aws.amazon.com/kinesis

我還沒有嘗試過,因為我有一個使用 S3 和 SQS 的自製監督程序……在流的開頭,它為臨時文件(在實例上)創建唯一名稱,這些文件將擷取日誌並發送通過 SQS 的消息導致有關程序的資訊及其日誌文件位置儲存在數據庫中;當程序停止時(這些是計劃的或事件驅動的,而不是連續執行的作業),會發送另一條 SQS 消息,其中包含有關臨時文件所在位置的冗餘資訊,並提供程序的退出狀態;然後兩個日誌(輸出和錯誤)都被壓縮並上傳到 S3,每個程序都會生成額外的 SQS 消息,報告 S3 上傳狀態……

正如您可能觀察到的那樣,SQS 消息在很大程度上是多餘的,但這實際上是為了消除我不知道程序存在的可能性*,*因為所有 4 條消息(開始、停止、stdout-upload-info , stderr-upload-info) 包含足夠的資訊來辨識 S3 中的主機、程序、參數以及日誌文件將去往或已經去往或應該去往的位置。當然,所有這些冗餘幾乎完全沒有必要,因為流程和 SQS/S3 非常穩定,但如果需要,冗餘是存在的。

我不需要這些作業的實時日誌記錄,但如果我這樣做了,另一種選擇是修改日誌收集器,這樣我就可以為每個“ x”字節的日誌收集執行時的每“y”秒——以先發生者為準——將累積的數據“刷新”到 SQS 消息中……無需為每一行發送 SQS 消息。

引用自:https://serverfault.com/questions/566519