无线开放 API

日志服务简介

TAE日志服务为应用提供了标准的日志记录功能,接入后,可以通过控制台查询应用的历史日志,也可以查看应用的实时日志,为云环境下的开发调试和问题定位提供了便利。

使用说明

在应用的 CLASSPATH 根路径下(maven工程在src/main/resources下)按照以下格式编写 log4j.properties 文件:
log4j.rootLogger = INFO,taeAppender
log4j.appender.taeAppender=com.alibaba.appengine.api.log.appender.LogAppender
log4j.appender.taeAppender.File  = ${catalina.base}/logs/app.log
log4j.appender.taeAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.taeAppender.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS}%-5p[%-c]%m%n
log4j.appender.taeAppender.Threshold=INFO
注:对象com.alibaba.appengine.api.log.appender.LogAppender在容器启动时会自动加载,用户无需关心此类的位置。
然后,用户通过log4j API打印的所有日志都会自动进行收集。

日志查看

本地日志
本地SDK环境下应用打印出的日志,读者可以在logs/app.log中进行查看(log4j.properties中的配置项log4j.appender.taeAppender.File  = ${catalina.base}/logs/app.log起到的作用)。值得注意的是,如果同一份本地SDK启动了多个实例的话,${catalina.base}指向的是实例的临时目录而非安装目录。以IDEA集成的SDK启动为例,其临时目录的路径可在IDEA控制台中查看,如下图示:
线上日志
所有在本地app.log中出现的日志,在应用完成线上部署后,都可以在控制台的日志查询->应用日志和实时日志->应用日志中进行查看。具体可参见 查询应用日志查询实时日志等相关文章。

日志服务使用示例

本节将向读者展示如何通过TAE SDK开发并运行一个接入了日志服务的应用。

结果演示

访问127.0.0.1:8080/LogServiceDemo.do,将返回:
>> Begin Log Service test.
You can see log content on TAE console!
查看本地容器log目录,将会发现生成了app.log文件,打开后可以看到这样三条记录:
2014-06-26 15:25:28,245WARN [tae.demo.services.LogServiceDemo]log warn: Hello TAE!
2014-06-26 15:25:28,245INFO [tae.demo.services.LogServiceDemo]log info: Hello TAE!
2014-06-26 15:25:28,245ERROR[tae.demo.services.LogServiceDemo]log error: Hello TAE!

准备工作

  • 预留大约15分钟无干扰时间。
  • 安装配置TAE SDK,开发语言设置为Java(即app.language =Java)参考链接

如何完成?

读者可以选择从头开始工程搭建、开发和部署,或者略过这些步骤,选择直接下载源码、打包部署来完成本篇向导。
  • 选择从头开始的读者,也请下载应用源码与war包,以便参考,并跳到下一节——工程创建。
  • 选择直接部署的读者,请执行以下步骤:
       2、将该tae-java-log-1.0.0.war文件拷贝到已在本地解压的容器webapps目录下,并重命名为ROOT.war。
       3、运行bin/startup.sh(bat)启动容器。
       4、容器启动成功后,可以根据结果演示一节进行验证。

开发实战

1、创建User类作为POJO数据模型,完整示例参见:tae-java-hello/src/main/java/tae/demo/model/User.java
2、创建LogServiceDemo Servlet,通过log4j打印日志
    resp.getWriter().println(">> Begin Log Service test!");

        // Test Logging
        logger.debug("log debug: Hello TAE!");
        logger.warn("log warn: Hello TAE!");
        logger.info("log info: Hello TAE!");
        logger.error("log error: Hello TAE!");

        // Test std output
        System.out.println("system out: Hello TAE!");
        System.err.println("system err: Hello TAE!");

        resp.getWriter().println("You can see log content on TAE console!");
完整示例参见:tae-java-hello/src/main/java/tae/demo/services/LogServiceDemo.java
3、在web.xml中添加以下配置:
    <servlet>
        <servlet-name>LogServiceDemo</servlet-name>
        <servlet-class>tae.demo.services.LogServiceDemo</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>LogServiceDemo</servlet-name>
        <url-pattern>/LogServiceDemo.do</url-pattern>
    </servlet-mapping>
4、编译打包:
使用maven的开发在工程目录下执行下面的命令,编译打包:
mvn clean install
其他开发者,利用自己开发工具的打包功能,编译打包
5、将生成的war包拷贝到本地容器webapps目录,并重命名为ROOT.war。
6、执行bin/startup.bat(sh)。
7、访问127.0.0.1:8080/LogServiceDemo.do,将返回:
>> Begin Log Service test.
You can see log content on TAE console!
查看本地容器log目录,将会发现生成了app.log文件,打开后可以看到这样三条记录:
2014-06-26 15:25:28,245WARN [tae.demo.services.LogServiceDemo]log warn: Hello TAE!
2014-06-26 15:25:28,245INFO [tae.demo.services.LogServiceDemo]log info: Hello TAE!
2014-06-26 15:25:28,245ERROR[tae.demo.services.LogServiceDemo]log error: Hello TAE!

打点监控日志服务API

获取监控服务对象
    import com.alibaba.appengine.api.monitor.MonitorService;
import com.alibaba.appengine.api.monitor.MonitorServiceFactory;
使用MonitorServiceFactory的不带参数的方法获取monitorService
    MonitorService monitorService = MonitorServiceFactor.getMonitorService();
monitorService.invoke方法
    /**
* 统计服务埋点
* @param category:     类别
* @param subCategory:  细粒度类别,即埋点的子类别
* @param responseTime: 响应时间,isv计算填入 ,单位是毫秒
* @para isFailed:     标记调用成功/失败,true示意为失败
*/
public void invoke(String category, String subCategory, long responseTime, boolean isFailed);
示例:
    MonitorService monitorService = MonitorServiceFactory.getMonitorService();
monitorService.invoke("TestInvoke", "testSuccess", 50, false);
monitorService.invoke("TestInvoke", "testFaile", 50, true);
埋点之后会在打点监控代码中显示:
注:对单个应用的每种环境目前支持5000个以下的埋点数

追踪日志服务API

    monitorService. startCodeBlock方法
/**
* 开始代码块,必须和endCodeBlock配对使用
* @param name 开始节点名称
* @param message
*/
public void startCodeBlock(String name, String message);
monitorService. log方法
    /**
*trace日志节点,在trace链路中,加入一条日志
*@param name  日志中间节点
*@param message
*/
public void log(String name, String message);
monitorService. endCodeBlock方法
    /**
 * 结束代码块,必须和startCodeBlock配对使用
 */
public void endCodeBlock();结束代码段
示例:
startCodeBlock和endCodeBlock构成一个Trace代码块,在中间的任何埋点视为在该代码块内部埋点,如下面例子:
    monitorService.startCodeBlock("testNameBlock01", "Enter code block01!");//开始代码块
monitorService.log("testNameBlock01Inside", "Oh! I'm in code block01!");//
代码块子节点
monitorService.endCodeBlock();
在workstation呈现
注:对单个应用的每种环境目前支持5000个以下的埋点数