Log

注意:

BAE目前已不支持新购买Log服务。已经购买本服务的用户可以继续使用。

Log(分布式日志)是BAE在本地日志基础上提供的更强大、可靠、多样化且持久化的扩展日志服务:

  • 强大:支持条件查询,可按时间、等级等进行高级查询;而本地日志仅支持一般查询。
  • 可靠:分布式存储,安全可靠;而本地日志与执行单元绑定,在执行单元回收时会被全部清空。
  • 多样化:支持五种套餐类型,以最优性价比最大程度地满足用户需求。
  • 持久化:默认存储30天,关闭“30天自动清理”后可长期保存。

    所有类型的日志,包括user日志、lighttpd日志(手动开启后)等,均占用日志存储空间。所有日志默认开启“30天自动清理”功能,即日志存储时间满30天后自动清理。其中,免费套餐无法关闭“30天自动清理”,而收费套餐可手动关闭/重启“30天自动清理”,关闭后,系统不再自动清理日志,存储空间写满后随即停止写入,日志会一直保留到手动清理为止。

注意: 分布式日志适用于需对重要日志进行长期存储及高级查询的生产环境;本地日志实时反映系统当前状态,主要用于调试。

添加Log分布式日志服务

  1. 在“应用引擎BAE-部署列表”页面选取目标部署并单击进入后,单击左侧导航栏的“扩展服务”。
  2. 单击“添加扩展服务”,选择Log。

  3. 选择合适的套餐并勾选“同意”后,单击“立即购买”后进入确认订单页面确认购买。

  4. 购买成功后返回“扩展服务列表”页面,Log部分显示新添加的Log分布式日志资源。

  5. 单击Log名称进入“日志详情”页面,可对日志进行如下操作:

    • 修改套餐

      不同的套餐实例不能并存,因而,当您的需求变化时,无法通过添加新的日志服务进行变更,而须通过修改套餐实现升降级。降级时,已保存日志量须小于目标套餐的日志容量,否则会降级失败。套餐详情请参见产品定价

    • 删除服务

      删除日志服务后,系统会回收相应的服务资源。

    • 查询

      根据部署名称、日志类型、日志级别、开始及结束时间等条件对日志进行查询。

    • 导出

      将日志导出到BOS进行存档。仅适用于免费套餐。

      注意: 导出前请先开通BOS服务创建BOS Bucket用于存放目标文件。

    • 清理日志

      可清理所选时间点前的全部日志。请慎重操作,日志清理后无法恢复。

设置日志

在日志详情页面选择“设置”,可进行如下设置:

  • lighttpd日志开关

    新建日志扩展服务实例时,lighttpd日志默认为关闭状态。开启后,lighttpd日志存入用户日志存储空间,可在“日志”页面进行查询、导出和清理,也可回到“设置”页面重新关闭。

  • 30天自动清理

    此设置仅对收费套餐有效,免费套餐的日志存储时间为30天,无法更改。

    新建日志扩展服务实例时,“30天自动清理”默认为开启状态。关闭后,系统不再自动清理日志,存储空间写满后随即停止写入。请您关注存储空间的状态,及时进行手动清理以确保新日志的顺利写入。

代码示例

Node.js连接Log

  1. 将依赖添加到package.json。

    {
        "dependencies": {
            "log4js": "0.6.9", 
            "thrift": "0.9.1"
        }
    }
    
  2. 下载Node.js Log SDK并放入node_modules中。

  3. 在代码中配置log4js的appender。

    var log4js = require('log4js');
    log4js.loadAppender('baev3-log');
    var options = {
        'user': 'ntOYKO0PROCl3vaIPZtgDxdA',
        'passwd': '98EyyHiq5glG0odrNGc0gxx50BaTFmYY'
    }
    log4js.addAppender(log4js.appenders['baev3-log'](options));
    var logger = log4js.getLogger('node-log-sdk');
    logger.setLevel('TRACE');
    logger.trace('baev3-log trace log');
    logger.debug('baev3-log Debug log');
    logger.info('baev3-log Info log');
    logger.warn('baev3-log Warn log');
    logger.error('baev3-log Error log');
    logger.fatal('baev3-log Fatal log');
    

PHP连接Log

  1. 下载PHP SDK,将BaeLog.class.php放在合适的位置,并配置以下代码中的/<Path_Prefix>为BaeLog.class.php的相对路径

    <?php
       # 解压PHP Log SDK后将BaeLog.class.php放在合适的位置
       # /<Path_Prefix>为BaeLog.class.php的相对路径
       require_once dirname(__FILE__) . "/<Path_Prefix>/BaeLog.class.php";
    
       $secret = array("user"=>"ak","passwd"=>"sk" );
       $log = BaeLog::getInstance($secret);
       $log->setLogLevel(16);
       $log->Fatal("fatal log test");
       $log->Warning("Warning log test");
       $log->Notice("Notice log test");
       $log->Trace("Trace log test");
       $log->Debug("Debug log test");
    ?>
    

Python连接Log

  1. 将依赖添加到requirements.txt。

    ### Python的BAE日志模块已经集成到logging模块中,只需在requirements.txt文件中包含单行代码:
    bae_log
    
  2. 设置logging。

    • 通过代码

      #-*- coding:utf-8 -*-
      
      import logging
      from bae_log import handlers
      
      def app(environ, start_response):
          status = '200 OK'
          headers = [('Content-type', 'text/html')]
          start_response(status, headers)
      
          handler = handlers.BaeLogHandler(ak = "apikey", sk = "secretkey")
          #或者设置为handler = handlers.BaeLogHandler(ak = "apikey", sk = "secretkey", bufcount = 256),bufcount参数下面有说明
          logger = logging.getLogger()
          logger.setLevel(logging.DEBUG)
          logger.addHandler(handler)
      
          logger.debug("debug message")
          logger.info("info message")
          logger.warning("warning message")
          logger.fatal("fatal message")
          logger.log(12, "trace message")
      
          try:
              raise Exception("exception")
          except:
              logger.exception("exception message")
      
          return "logging..."
      
      from bae.core.wsgi import WSGIApplication
      application = WSGIApplication(app)
      
    • 通过配置文件

      #-*- coding:utf-8 -*-
      
      import logging
      import logging.config
      
       logging.config.fileConfig("logging.conf")
      

      logging.conf示例如下:

      [loggers]
      keys=root
      
       [handlers]
      keys=baeHandler
      
       [formatters]
      keys=simpleFormatter
      
       [formatter_simpleFormatter]
      format=[%(asctime)s](%(levelname)s)%(name)s : %(message)s
      
      [logger_root]
      level=DEBUG
      handlers=baeHandler
      
      [handler_baeHandler]
      class=bae_log.handlers.BaeLogHandler
      level=DEBUG
      formatter=simpleFormatter
      args=("<AK>", "<SK>", 1)
      

Java连接Log

  1. 添加maven支持。

    注意: 如果使用的不是maven方式,请手动下载BAE Java SDK将dependencies与baesdk添加进项目依赖。

    <dependencies>
        <dependency>
            <groupId>com.baidu.bae</groupId>
            <artifactId>baev3-sdk</artifactId>
            <version>1.0.1</version>
        </dependency>
    </dependencies>
    <distributionManagement>  
        <snapshotRepository>  
             <id>baemaven-snapshots</id>  
             <url>http://maven.duapp.com/nexus/content/repositories/snapshots</url>  
        </snapshotRepository>  
        <repository>
             <id>baemaven-releases</id> 
             <url>http://maven.duapp.com/nexus/content/repositories/releases/</url> 
        </repository>
    </distributionManagement>
    
  2. 设置log4j.properties中的appender。

    log4j.rootLogger=TRACE,BAE
    log4j.appender.BAE=com.baidu.bae.api.log.BaeLogAppender
    log4j.appender.BAE.ak=thisisakfromjava
    log4j.appender.BAE.sk=thisisskfromjava
    log4j.appender.BAE.layout=org.apache.log4j.SimpleLayout
    
  3. 在代码中按照标准的log4j日志登记即可。

    Logger logger = Logger.getLogger("java");              
    
    logger.trace("this is trace message from java");
    logger.debug("this is debug message from java");
    logger.info("this is info message from java");
    logger.fatal("this is fatal message from java");
    logger.error("this is error message from java");
    
    try {
        int a = 1/0;
    } catch (Exception e) {
        logger.warn("exception occurred", e);
    }