开发者社区> 问答> 正文

【阿里云产品公测】用SLS SDK搭建中转服务记录应用日志

橘子 2014-11-05 21:03:57 12018
用SLS记录应用日志


前言


应用里面报错是最为头疼的了。很多时候,程序猿为了省事,就直接来个console.log或者print之类的,好一点的写个类,然后以文件的形式写入到本地系统中。我想绝大多数程序猿都这么干的吧。然后想看日志的时候就登陆到服务器上,cat一下或者tail下,把日志打出来看。
如果只是个小网站,小应用还好说,可能只有一台服务器,登陆上去也简单。但如果网站变大了,服务器多了,难不成一台台登陆上去看么?如果想做个统计什么的,那估计要死人了。当然也有一些变通的办法,比如linux上的一些好用的工具什么的,或者也可以用一些软件搭建自己的日志收集平台,不过,都不如阿里云的SLS来得快速方便。


SLS的优势
  • 有logtail类的客户端支持,可以快速配置,收集日志
  • 不用自己搭建日志收集平台,有现成的平台可用
  • 有SDK可用,自己可以定义更加丰富的收集内容
  • 查询语法支持AND、OR等操作符,能实时查询

SLS的使用


本例是拿Java SDK来收集应用的错误日志。
首先吐槽下,阿里云的SLS目前只有Java的SDK,没有其他语言的SDK,对于我这种从来没写过Java代码的程序猿来说,上手有点难。好在有其他语言的经验,根据SDK的sample,硬是憋出了一个简单的收集服务来。
我的应用使用的程序是NodeJS或者PHP,既然没有对应的SDK,我能想到的是使用SLS的Java的SDK做一个简单的HTTP服务,供我的NodeJS和PHP调用。在NodeJS和PHP内封装好对应的日志类,有错误,通过http post的形式发送到Java SDK写的http server上,然后这个http server使用Java SDK将日志发送到SLS。
所以,作为程序猿,不得不再次吐槽下SLS的SDK,实在太少,如果阿里云的工程师太忙没时间写其他语言的SDK,至少把API开放出来,我相信开源社区肯定有很多人会贡献出相应的SDK的。
因为不懂Java,写这个http server费了不少时间,懂的人,可能很快用jetty等弄好了,但是我没用过,所以在网上找了一些现成的代码来处理http请求。以下都是我的个人理解,如果有哪些地方不对,还请Java大牛指正,毕竟这是我第一次写Java代码。
首先,我使用了sun.net包里面的httpserver:
  
public static void main(String args[]) throws IOException,
            InterruptedException {

        HttpServer server = HttpServer.create(new InetSocketAddress(8080), 8080);
        HttpContext context = server.createContext("/", new LogHandler());
        context.getFilters().add(new ParameterFilter());
        server.setExecutor(null); // creates a default executor
        server.start();

    }





ParameterFilter这个类是用来实现对请求的处理的,限于篇幅,我就不贴出代码了。大家在网上都可以搜到很多实例代码。
接下来就是实现对应的LogHandler类,用来处理/这个路由下的请求。因为我这个http server不做别的,就做这个简单的事情,所以我就直接用了/这个路由。LogHandler类需要实现handle方法,用来处理请求。为了简单,我直接在这里面初始化了SLS的SDK:

String accessId = "这里是你阿里云的accessID,可以在用户中心查看";
        String accessKey = "这里是你阿里云的accessKey,可以在用户中心查看";

        String project = "testproject";
        String host = "http://cn-hangzhou.sls.aliyuncs.com";
        // or create a client with a setting endpoint address
        SLSClient client = new SLSClient(accessId, accessKey, host);
        // generate two logs

        Vector<LogItem> logGroup = new Vector<LogItem>();
        LogItem logItem = new LogItem((int) (new Date().getTime() / 1000));





这里基本参照SDK的sample来做就行了。然后需要记录你想记录的日志字段,比如我这里需要记录user的id:


logItem.PushBack("userId", (String) params.get("userId"));




这样就把需要的字段加入到logItem里面了。等把需要的字段都加入到logItem后,需要将这个item加入到Group中:
logGroup.add(logItem);


这一步我其实不是很理解,毕竟那个SDK的api文档看的云里雾里的,应该是可以多个item放在一个group里面发送给sls。大家可以自己试验下。
最后,使用client的PutData方法将数据发送给SLS:
client.PutData(project, "这里是Category的名字", "", logGroup);


第三个参数我没太看懂是什么,不过貌似不影响使用。第二个是Category,就是在SLS的project下看到的类目列表。
发送出去后,http server需要告诉应用发送成功了,http server得有返回值嘛,要不然就一起卡那儿等超时了。
String response = "{\"result\": true}";
t.sendResponseHeaders(200, response.length());
OutputStream os = t.getResponseBody();
os.write(response.getBytes());
os.close();



为了方便,我使用的是json格式返回的,方便其他语言解析。
好了,到此这个SLS的logger服务就做好了,接下来是需要编译。这也是Java的麻烦之处。SLS的SDK是放在了maven库里面,所以需要配置pom.xml来编译。你的pom文件应该有:
<dependencies>
        <dependency>
            <groupId>com.aliyun.openservices</groupId>
            <artifactId>aliyun-openservices-sls-v0.3</artifactId>
            <version>0.1.0</version>
        </dependency>
    </dependencies>



还想吐槽下,这个SDK的名字里面有个v0.3,下面的version还是0.1.0,让人甚是奇怪,搞两个version是干嘛的?
因为我用的是idea编辑器,可以直接在编辑器里面make project,把这个服务编译好。最后编译出来的是一个jar文件,直接把这个jar扔到ecs上运行即可。前提是需要安装好java环境。
这样,我们就在ECS上启动了一个SLS的中转服务。地址是127.0.0.1:8080,应用只需要向这个程序post数据即可。
比如NodeJS可以单独写一个错误处理的模块:
var request = require("request");
        request.post("http://127.0.0.1:8080", { form: { "userId": "xxxxx" } }, function(err, response, body){
            if(!err && response && response.statusCode === 200 && body){
                var result = JSON.parse(body);
                if(result.result !== true){
                    console.log(result.code);
                }
            }
            if(callback){
                callback(err, body);
            }
        });


这样,就可以把日志通过我们写的SLS中转服务发送到SLS中了。
虽然我不懂Java,但是还是可以通过SDK的sample快速弄出来一个中转服务,服务于自己的其他应用,所以,SLS SDK上手应该还是很快的。大家也可以尝试自己写一个试一试。


最后,还是建议SLS多一些其他语言的SDK,方便用户使用。
弹性计算 JavaScript Java 程序员 Linux API PHP 开发工具 Maven 数据格式
分享到
取消 提交回答
全部回答(1)

集结各类场景实战经验,助你开发运维畅行无忧

推荐文章
相似问题