在BAE平台中,都提供了一种查询Container中临时日志的方式,其目的是为了方便用户快速的查询最近的日志,了解container的运行状态。但是这种日志又不想走日志服务,因为日志服务太重了,实时性相对差一些,还要改自己的代码。针对这些需求,BAE提供了一种临时的解决方案—本地日志。这种日志不保证存储时间,随着container的迁移和回收,都会造成日志的丢失,所以此类日志的定位是临时的、没有服务保证的、快速及时的一种解决方案。
日志打印方式
日志打印非常简单,使用语言提供的日志模块即可,下面以python为例
#-*- coding:utf-8 -*-
import os
import sys
import logging
import logging.config
cwd = os.path.dirname(__file__)
def app(environ, start_response):
status = '200 OK'
headers = [('Content-type', 'text/html')]
start_response(status, headers)
logging.config.fileConfig( "/home/bae/app/logging.conf" )
logging.info("This is a test message")
return "logging..."
from bae.core.wsgi import WSGIApplication
application = WSGIApplication(app)
其中logging.conf文件放在根目录下,如下
[loggers]
keys = root
[handlers]
keys=rotateFileHandler
[formatters]
keys=simpleFormatter
[formatter_simpleFormatter]
format = [%(asctime)s](%(levelname)s)%(name)s : %(message)s]
[logger_root]
level=INFO
handlers=rotateFileHandler
[handler_rotateFileHandler]
class=handlers.RotatingFileHandler
level=INFO
formatter=simpleFormatter
args=("/home/bae/log/user.log", 'a', 20971520, 5)
日志的清理
BAE每隔一段时间会清理用户的日志,主要有以下几种策略
- 日志存取路径,统一存储到 /home/bae/log下面,不要建立自文件夹和软连接
- 日志的切分,日志切分由用户自己指定,BAE查看日志是通过前缀名定位,后缀名自定义的方式
比如
User.log.1
User.log.2
就认为是同一种日志[user],查看日志总是会查看最新的
但是
User1.log
User2.log会被认为是两种日志[user1, user2]
2. 限制
每一大类的日志限制是100M,用户总日志大小限制是250M,超过限制就会被后台不定期清理
删除的策略一般是删除最老的日志,根据linux modify time判定
FAQ
1. 这会是BAE V3日志的最终形态嘛?
当然不会.
日志有两种,1)Debug,主要解决应用开发和部署期间的错误查看,不需要长期保存2)长期存储,需要长期保存,未来可能用来作为分析用,对日志的完整性要求更高。
本地日志的目标是为了即时调试,BAE后续会推出功能强大的多的分布式日志。
2. 为什么有这么多限制
本地日志,顾名思义就是存在本机上的日志,物理机的磁盘是有限制的,不可能给单个用户开很大的空间,而且我们认为250M已经足够用户做调试用了。
至于为什么要用户切分,这是考虑到不同的用户后缀使用习惯不同。而且在linux中,强行mv掉文件,有些不带reopen机制的日志库,无法正确处理mv事件。并且mv走会导致丢失部分日志。
3. 为什么不支持按照时间段查询
因为本地日志是不带schema的,也就是说BAE对用户日志格式不做任何假设,所以也没办法确认单条日志的时间点,因此不支持时间段查询
4. 为什么不支持关键字查询
关键字查询如果不做索引,理由类似于3,未来用户可以通过下载,在本地进行查询。分布式日志的查询会强大很多
5. 我的server日志看不到啊!
这个是因为以前申请的container,日志没有打到指定目录,新申请的container的都已经可以了
另外,请确认日志打印的目录为
/home/bae/log
http://godbae.duapp.com/?p=313