閱讀594 返回首頁    go windows


投遞日誌到OSS__logshipper_用戶指南_日誌服務-阿裏雲

日誌服務可以把Logstore中的數據自動歸檔到OSS,以發揮日誌更多的效用:

  1. OSS數據支持自由設置生命周期,可以對日誌進行長期存儲。
  2. 可以通過自建程序和更多係統(如E-MapReduce)消費OSS數據。

通過日誌服務投遞日誌數據到OSS具有如下優勢:

  1. 使用非常簡單。隻需要完成幾步配置即可以把日誌服務Logstore的數據同步到OSS。
  2. 避免重複收集工作。日誌服務的日誌收集過程已經完成不同機器上的日誌集中化,無需重複在不同機器上收集日誌導入OSS。
  3. 充分複用日誌服務內的日誌分類管理工作。用戶可讓日誌服務不同項目(Project)、不同類型(Logstore)的日誌自動投遞到不同的OSS Bucket目錄,方便管理OSS數據。

以一個例子說明如何使用日誌服務的OSS投遞功能,假設兩個阿裏雲用戶主賬號A、B:

  1. A和B可以是相同賬號,這種情況下RAM授權最為便捷。
  2. 日誌服務Project和OSS的Bucket必須位於相同Region,不支持跨Region投遞數據。

主賬號A在日誌服務深圳Region開通project-a,並創建了一個Logstore存放nginx訪問日誌。

主賬號B在OSS深圳Region創建了bucket-b。

用戶希望將日支服務project-a的nginx訪問日誌歸檔到bucket-b的prefix-b目錄下。

使用日誌服務投遞OSS功能,需要完成RAM授權、投遞規則配置兩個步驟。

訪問控製(RAM)授權

快捷授權

主賬號B登陸阿裏雲控製台,免費開通訪問控製RAM

點擊權限控製RAM快捷授權頁,確認授予寫OSS所有Bucket權限,日誌服務將替A扮演角色寫B的OSS Bucket。

查看、修改角色

主賬號B登陸阿裏雲控製台訪問控製RAM,進入“角色管理”並查看角色(快捷授權默認創建的角色是AliyunLogDefaultRole)。

若A、B不相同,請修改Role。若A、B相同,則快捷授權創建的角色直接可用。

記錄角色的Arn(如acs:ram::1323431815622349:role/aliyunlogdefaultrole),該Arn需要提供給主賬號A創建OSS投遞規則時使用。

快捷授權默認會授予寫B的所有OSS Bucket權限,如需更精細化的權限控製,請修改Policy

使用子賬號創建投遞規則授權

在B創建角色、授權完成之後,主賬號A有權限使用主賬號B創建的角色寫數據到OSS Bucket,但這僅限於主賬號A本身創建投遞規則。

如果主賬號A的子賬號a_1希望使用該角色創建投遞規則,請進行PassRole授權

日誌服務用戶配置OSS投遞規則

登陸日誌服務控製台,選擇Logstore,查看“日誌消費模式”並“創建投遞規則”,需要設置的參數如下:

參數 語義
OSS Bucket OSS Bucket名稱,需要保證OSS的Bucket與日誌服務Project位於相同Region
OSS Prefix 從日誌服務同步到OSS的數據將存放到Bucket的該目錄下
RAM角色 用於訪問權限控製,OSS Bucket擁有者創建角色的標示,如“acs:ram::1323431815622349:role/aliyunlogdefaultrole”
投遞大小 自動控製投遞任務創建間隔並設置OSS的一個Object大小(以未壓縮計算)上限,單位:MB
投遞時間 相隔多長時間生成一次投遞任務,默認值300,單位:秒
是否壓縮 OSS數據存儲的壓縮方式,支持:none、snappy。其中,none表示原始數據不壓縮,snappy表示使用snappy算法對數據做壓縮,可以減少OSS Bucket存儲空間使用量

日誌服務在後端並發執行數據投遞,如果您的數據量較大,可能會多個投遞線程進行服務。每一個投遞線程都會根據大小、時間共同決定任務生成的頻率,當任一條件滿足時,投遞線程即會創建任務。

投遞任務管理

在啟動“OSS投遞功能”後,日誌服務後台會定期啟動投遞任務。用戶可以在控製台上看到這些投遞任務的狀態。

參考日誌投遞任務管理了解更多控製台操作細節。

如果投遞任務執行失敗,控製台上會顯示相應的錯誤信息,係統會按照策略默認為你重試,你也可以手動重試。

任務重試

一般情況下,日誌數據在寫入Logstore後的30分鍾內同步到OSS。

日誌服務默認會按照退火策略重試最近兩天之內的任務,重試等待的最小間隔是15分鍾。當任務執行失敗時,第一次失敗需要等待15分鍾再試,第二次失敗需要等待30分鍾(2乘以15)再試,第三次失敗需要等待60分鍾(2乘以30)再試,以此類推。

如需立即重試失敗任務,可以通過控製台點擊“重試”按鈕或通過API/SDK方式指定任務進行重試。

失敗任務錯誤

常見失敗任務的錯誤信息如下:

錯誤信息 處理方法
UnAuthorized 沒有權限,請確認:1. OSS用戶是否已創建角色;2. 角色描述的賬號ID是否正確; 3. 角色是否授予OSS Bucket寫權限; 4. role-arn是否配置正確。
ConfigNotExist 配置不存在,一般是由於刪除投遞規則導致,如又重新創建了規則,可以通過重試來解決。
InvalidOssBucket OSS Bucket不存在,請確認:1. OSS Bucket所在Region是否與日誌服務Project一致; 2. Bucket名稱是否配置正確。
InternalServerError 日誌服務內部錯誤,通過重試來解決。

OSS中查看數據

可以通過控製台、API/SDK或其它方式訪問到OSS數據。

如使用web管理控製台訪問,進入OSS服務,選擇Bucket,點擊“Object管理”即可看到有日誌服務投遞過來的數據。

更多OSS使用細節請參考OSS文檔

Object地址

  • 地址格式

oss:// OSS-BUCKET/OSS-PREFIX/YEAR/MONTH/DAY/HOUR/MINUTE_NANOSECOND_INCREMENTID(.snappy)

例如:

oss://oss-shipper-shenzhen/ecs_test/2016/01/26/20/54_1453812893059571256_937

oss://oss-shipper-shenzhen/ecs_test/2016/01/26/19/54_1453809273944944933_5.snappy

  • 字段

OSS-BUCKET、OSS-PREFIX表示OSS的Bucket名稱和目錄前綴,由用戶配置,INCREMENTID是係統添加的隨機數。

YEAR,MONTH,DAY,HOUR,MINUTE,NANOSECOND分別表示年、月、日、小時、分鍾、納秒,由本次投遞任務的服務端創建時間計算得到。

假設5分鍾數據投遞一次OSS,2016-06-23 00:00:00創建的投遞任務,它投遞是數據是2016-06-22 23:55左右後寫入日誌服務的數據。如需分析完整的2016-06-22全天日誌,除了2016/06/22目錄下的全部object以外,還需要檢查2016/06/23/00/目錄下前十分鍾的object是否有包含2016-06-22時間的日誌。

根據文件後綴,分兩種格式:raw(不壓縮,無文件後綴),snappy(壓縮,文件後綴為.snappy)。

raw格式(不壓縮)

Object由多條日誌拚接而成,文件的每一行是一條日誌,json格式,樣例如下:

  1. {"__time__":1453809242,"__topic__":"","__source__":"10.170.148.237","ip":"10.200.98.220","time":"26/Jan/2016:19:54:02 +0800","url":"POST /PutData?Category=YunOsAccountOpLog&AccessKeyId=U0UjpekFQOVJW45A&Date=Fri%2C%2028%20Jun%202013%2006%3A53%3A30%20GMT&Topic=raw&Signature=pD12XYLmGxKQ%2Bmkd6x7hAgQ7b1c%3D HTTP/1.1","status":"200","user-agent":"aliyun-sdk-java"}

json由用戶日誌自定義key-value和日誌服務的保留字段組成,其中,日誌服務添加的保留字段有如下幾個:

日誌服務保留字段 語義
__time__ 日誌的Unix時間戳(是從1970年1月1日開始所經過的秒數),由用戶日誌字段的time計算得到
__topic__ 日誌的topic
__source__ 日誌來源的客戶端IP

snappy格式(壓縮)

采用snappy官網的C++實現(Snappy.Compress方法),對none格式數據做文件級別的壓縮得到。對.snappy文件解壓縮後即可得到對應的none格式文件。

  • 使用C++ Lib解壓縮

snappy官網右側下載Lib,執行Snappy.Uncompress方法解壓。

  • 使用Java Lib

xerial snappy-java,可以使用Snappy.Uncompress或Snappy.SnappyInputStream(不支持SnappyFramedInputStream)。

  1. <dependency>
  2. <groupId>org.xerial.snappy</groupId>
  3. <artifactId>snappy-java</artifactId>
  4. <version>1.0.4.1</version>
  5. <type>jar</type>
  6. <scope>compile</scope>
  7. </dependency>

注:1.1.2.1版本存在bug可能無法解壓部分壓縮文件,至1.1.2.6版本修複。

Snappy.Uncompress

  1. String fileName = "C:\我的下載\36_1474212963188600684_4451886.snappy";
  2. RandomAccessFile randomFile = new RandomAccessFile(fileName, "r");
  3. int fileLength = (int) randomFile.length();
  4. randomFile.seek(0);
  5. byte[] bytes = new byte[fileLength];
  6. int byteread = randomFile.read(bytes);
  7. System.out.println(fileLength);
  8. System.out.println(byteread);
  9. byte[] uncompressed = Snappy.uncompress(bytes);
  10. String result = new String(uncompressed, "UTF-8");
  11. System.out.println(result);

Snappy.SnappyInputStream

  1. String fileName = "C:\我的下載\36_1474212963188600684_4451886.snappy";
  2. SnappyInputStream sis = new SnappyInputStream(new FileInputStream(fileName));
  3. byte[] buffer = new byte[4096];
  4. int len = 0;
  5. while ((len = sis.read(buffer)) != -1) {
  6. System.out.println(new String(buffer, 0, len));
  7. }
  • Linux環境解壓工具

針對Linux環境,我們提供了工具進行解壓snappy文件,點擊下載snappy_tool

  1. ./snappy_tool 03_1453457006548078722_44148.snappy 03_1453457006548078722_44148
  2. compressed.size: 2217186
  3. snappy::Uncompress return: 1
  4. uncompressed.size: 25223660

RAM授權進階

授權Role管理

通過快捷授權,OSS用戶主賬號B默認創建的AliyunLogDefaultRole角色描述如下:

  1. {
  2. "Statement": [
  3. {
  4. "Action": "sts:AssumeRole",
  5. "Effect": "Allow",
  6. "Principal": {
  7. "Service": [
  8. "log.aliyuncs.com"
  9. ]
  10. }
  11. }
  12. ],
  13. "Version": "1"
  14. }

如日誌服務用戶主賬號A與OSS用戶主賬號B相同,保持默認角色描述即可,”log.aliyuncs.com”等價於”B_ALIYUN_ID@log.aliyuncs.com”。

否則,請登陸賬號管理->安全設置查看A賬號ID並修改角色描述,添加”A_ALIYUN_ID@log.aliyuncs.com”(支持添加多個),假設A的主賬號ID為1654218965343050:

  1. {
  2. "Statement": [
  3. {
  4. "Action": "sts:AssumeRole",
  5. "Effect": "Allow",
  6. "Principal": {
  7. "Service": [
  8. "1654218965343050@log.aliyuncs.com",
  9. "log.aliyuncs.com"
  10. ]
  11. }
  12. }
  13. ],
  14. "Version": "1"
  15. }

該角色描述A有權限通過日誌服務獲取臨時Token來操作B的資源(細節請參考權限控製STS)。

授權Policy管理

通過快捷授權,角色AliyunLogDefaultRole默認被授予AliyunLogRolePolicy,具有寫用戶B所有OSS Bucket的權限。

AliyunLogRolePolicy的授權描述如下:

  1. {
  2. "Version": "1",
  3. "Statement": [
  4. {
  5. "Action": [
  6. "oss:PutObject"
  7. ],
  8. "Resource": "*",
  9. "Effect": "Allow"
  10. }
  11. ]
  12. }

若希望更精細的訪問控製粒度,請解除角色AliyunLogDefaultRole的AliyunLogRolePolicy授權,並參考OSS授權創建更細粒度的Policy,授權給角色AliyunLogDefaultRole。

主子賬號Role授權

默認情況下,OSS用戶主賬號B為日誌服務主賬號A創建角色、授權後,由A使用角色在日誌服務創建OSS投遞配置。

如果A的子賬號a_1需要使用該角色創建日誌投遞數據到OSS規則,那麼,主賬號A需要為子賬號a_1授予PassRole權限。

進入阿裏雲“訪問控製”控製台,主賬號A可以為子賬號a_1授予AliyunRAMFullAccess權限。如此,a1將具備RAM所有權限,可以使用B為A創建的角色來配置日誌服務投遞OSS規則。

AliyunRAMFullAccess權限較大,如果A需要控製a_1的權限範圍,隻授予投遞OSS的必須權限,可以修改授權策略的Action、Resource,如下示例:

  1. {
  2. "Statement": [
  3. {
  4. "Action": "ram:PassRole",
  5. "Effect": "Allow",
  6. "Resource": "acs:ram::1323431815622349:role/aliyunlogdefaultrole"
  7. }
  8. ],
  9. "Version": "1"
  10. }

最後更新:2016-11-24 11:23:47

  上一篇:go 通過StreamCompute消費__loghub-消費_用戶指南_日誌服務-阿裏雲
  下一篇:go 投遞日誌到ODPS__logshipper_用戶指南_日誌服務-阿裏雲