GoogleAppEngineLauncher可以显示我的应用在开发过程中在我的Mac上运行时的本地日志文件。但是,我无法更改字体大小,因此我想使用tail
命令自行查看日志文件。
这很遗憾,但我找不到日志文件。它们不在/var/log/
,~/Library/Logs
或/Library/Logs
下。你知道他们在哪里吗?
(也许没有物理文件,只有python开发环境的标准输出,所以日志只在启动器应用程序中可用。)
答案 0 :(得分:8)
正如你猜测的那样,并且可以通过研究源文件/usr/local/google_appengine/google/appengine/tools/dev_appserver.py
来确认,日志没有写入磁盘(cStringIO.StringIO
实例用于将它们保存在内存中,因为其余的代码 面向将它们“写入类似文件的对象”。)
我建议您编写自己的应用服务器脚本,该脚本导入dev_appserver
,子类dev_appserver.ApplicationLoggingHandler
,并覆盖一个方法:
from google.appengine.tools import dev_appserver
class MyHandler(dev_appserver.ApplicationLoggingHandler):
def __init__(self, *a, **k):
dev_appserver.ApplicationLoggingHandler.__init__(self, *a, **k)
self.thefile = open('/tmp/mylog.txt', 'w')
def emit(self, record):
dev_appserver.ApplicationLoggingHandler(self, record)
self.thefile.write(str(record) + '\n')
self.thefile.flush()
您还需要确保使用此类而不是标准类,例如通过子类化调度程序或确保使用其依赖注入功能。 (dev_appserver_main.py
可以让你更好地控制它,我认为。)
我认为这种自定义方法比应该的方法要麻烦得多(毕竟,将日志写入文件是完全正常的 - 要么根据需要以不同方式显示它们,要么稍后使用辅助工具处理它们脚本),所以我还建议在app引擎的跟踪器上添加一个功能请求:dev_appserver.py
应该再接受一个标志,如果指定的话,它会给出将日志写入磁盘的路径。
而且,说实话,如果我现在需要这个功能,我自己也会这样做:编辑.py
文件(及其相关的_main.py
)以添加标记及其用途。这应该是十几行,比我刚才概述的“规范”方式容易得多。当然,它 是脏的,因为每次有新的SDK你都必须再次应用补丁,并且再一次......这就是为什么一个人应该也在GAE的跟踪器上提出补丁,作为我建议的功能请求的一部分,希望它很快被接受! - )
答案 1 :(得分:5)
其中许多答案现已过时。 :)
在今天的devappserver
中,如果要登录文件(使用其本机sqlite数据库格式),请使用--logs_path=LOGS_FILE
。或者如评论中所建议的那样,如果输出过于复杂,只需输出输出。
由于存在日志API,如果没有设置,它实际上现在将日志条目存储在--storage_path
中的文件中。 我自己已经注意到了一些错误。(我认为它们现在不存在,因为我使用它已经有一段时间了。)
答案 2 :(得分:4)
一个简单而又脏的修复方法是将以下代码添加到dev_appserver.py文件中,顶部:
import logging
logging.basicConfig( filename='/tmp/gae.log', filemode='a' )
显然,将日志文件更改为您想要的内容。这需要最少量的更改,并且在有新版本时最容易进入repo和diff。
<强>更新强> 稍微好一点的可能是将它变成命令行选项:
def start_logging():
import logging
logfile=''
for item in sys.argv[1:]:
if re.match('--log_file=', item):
logfile=item.split('=')[1]
# Remove this item from sys.argv
sys.argv.remove(item)
break
if logfile:
print "Please monitor the log file (with tail -f %s)" % logfile
logging.basicConfig( filename=logfile, filemode='a' )
答案 3 :(得分:1)
如果您只想在运行时查看日志,则会在命令行上打印这些日志以及HTTP调用。
logging.debug()
和logging.error()
未打印,但向上调用info
。
有关详细信息,请参阅this answer。