日志服务简介
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个以下的埋点数
FAQ
关于此文档暂时还没有FAQ