594
阿里云
投递日志到OSS__logshipper_用户指南_日志服务-阿里云
日志服务可以把Logstore中的数据自动归档到OSS,以发挥日志更多的效用:
- OSS数据支持自由设置生命周期,可以对日志进行长期存储。
- 可以通过自建程序和更多系统(如E-MapReduce)消费OSS数据。
通过日志服务投递日志数据到OSS具有如下优势:
- 使用非常简单。只需要完成几步配置即可以把日志服务Logstore的数据同步到OSS。
- 避免重复收集工作。日志服务的日志收集过程已经完成不同机器上的日志集中化,无需重复在不同机器上收集日志导入OSS。
- 充分复用日志服务内的日志分类管理工作。用户可让日志服务不同项目(Project)、不同类型(Logstore)的日志自动投递到不同的OSS Bucket目录,方便管理OSS数据。
以一个例子说明如何使用日志服务的OSS投递功能,假设两个阿里云用户主账号A、B:
- A和B可以是相同账号,这种情况下RAM授权最为便捷。
- 日志服务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格式,样例如下:
{"__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)。
<dependency>
<groupId>org.xerial.snappy</groupId>
<artifactId>snappy-java</artifactId>
<version>1.0.4.1</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
注:1.1.2.1版本存在bug可能无法解压部分压缩文件,至1.1.2.6版本修复。
Snappy.Uncompress
String fileName = "C:\我的下载\36_1474212963188600684_4451886.snappy";
RandomAccessFile randomFile = new RandomAccessFile(fileName, "r");
int fileLength = (int) randomFile.length();
randomFile.seek(0);
byte[] bytes = new byte[fileLength];
int byteread = randomFile.read(bytes);
System.out.println(fileLength);
System.out.println(byteread);
byte[] uncompressed = Snappy.uncompress(bytes);
String result = new String(uncompressed, "UTF-8");
System.out.println(result);
Snappy.SnappyInputStream
String fileName = "C:\我的下载\36_1474212963188600684_4451886.snappy";
SnappyInputStream sis = new SnappyInputStream(new FileInputStream(fileName));
byte[] buffer = new byte[4096];
int len = 0;
while ((len = sis.read(buffer)) != -1) {
System.out.println(new String(buffer, 0, len));
}
- Linux环境解压工具
针对Linux环境,我们提供了工具进行解压snappy文件,点击下载snappy_tool。
./snappy_tool 03_1453457006548078722_44148.snappy 03_1453457006548078722_44148
compressed.size: 2217186
snappy::Uncompress return: 1
uncompressed.size: 25223660
RAM授权进阶
授权Role管理
通过快捷授权,OSS用户主账号B默认创建的AliyunLogDefaultRole角色描述如下:
{
"Statement": [
{
"Action": "sts:AssumeRole",
"Effect": "Allow",
"Principal": {
"Service": [
"log.aliyuncs.com"
]
}
}
],
"Version": "1"
}
如日志服务用户主账号A与OSS用户主账号B相同,保持默认角色描述即可,”log.aliyuncs.com”等价于”B_ALIYUN_ID@log.aliyuncs.com”。
否则,请登陆账号管理->安全设置查看A账号ID并修改角色描述,添加”A_ALIYUN_ID@log.aliyuncs.com”(支持添加多个),假设A的主账号ID为1654218965343050:
{
"Statement": [
{
"Action": "sts:AssumeRole",
"Effect": "Allow",
"Principal": {
"Service": [
"1654218965343050@log.aliyuncs.com",
"log.aliyuncs.com"
]
}
}
],
"Version": "1"
}
该角色描述A有权限通过日志服务获取临时Token来操作B的资源(细节请参考权限控制STS)。
授权Policy管理
通过快捷授权,角色AliyunLogDefaultRole默认被授予AliyunLogRolePolicy,具有写用户B所有OSS Bucket的权限。
AliyunLogRolePolicy的授权描述如下:
{
"Version": "1",
"Statement": [
{
"Action": [
"oss:PutObject"
],
"Resource": "*",
"Effect": "Allow"
}
]
}
若希望更精细的访问控制粒度,请解除角色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,如下示例:
{
"Statement": [
{
"Action": "ram:PassRole",
"Effect": "Allow",
"Resource": "acs:ram::1323431815622349:role/aliyunlogdefaultrole"
}
],
"Version": "1"
}
最后更新:2016-11-24 11:23:47
上一篇:
通过StreamCompute消费__loghub-消费_用户指南_日志服务-阿里云
下一篇:
投递日志到ODPS__logshipper_用户指南_日志服务-阿里云
文件类型占比__资源监控接口_API 手册_CDN-阿里云
实例被安全锁定时API的行为__附录_API 参考_云服务器 ECS-阿里云
InitiateMultipartUpload__关于MultipartUpload的操作_API 参考_对象存储 OSS-阿里云
查询时刻网络带宽__资源监控接口_API 手册_CDN-阿里云
SSH 连接时出现如下错误:pam_unix(sshdsession) session closed for user__远程登录 (SSH)_Linux操作运维问题_云服务器 ECS-阿里云
消费消息示例代码__Java SDK_SDK使用手册_消息服务-阿里云
阿里云携手德施曼等ICA联盟企业联合发布《中国智能锁应用与发展白皮书》!
LogHub-协同消费组__Getting-Started_日志服务-阿里云
性能监控__用户指南_云数据库 Redis 版-阿里云
创建报警任务__报警任务_用户指南_弹性伸缩-阿里云
相关内容
常见错误说明__附录_大数据计算服务-阿里云
发送短信接口__API使用手册_短信服务-阿里云
接口文档__Android_安全组件教程_移动安全-阿里云
运营商错误码(联通)__常见问题_短信服务-阿里云
设置短信模板__使用手册_短信服务-阿里云
OSS 权限问题及排查__常见错误及排除_最佳实践_对象存储 OSS-阿里云
消息通知__操作指南_批量计算-阿里云
设备端快速接入(MQTT)__快速开始_阿里云物联网套件-阿里云
查询API调用流量数据__API管理相关接口_API_API 网关-阿里云
使用STS访问__JavaScript-SDK_SDK 参考_对象存储 OSS-阿里云