阅读594 返回首页    go 阿里云


投递日志到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_用户指南_日志服务-阿里云