Dart appengineで、print()やlogging libraryを使用してもterminalにlogが吐かれませんでした。logが吐かれないとまともに開発することは難しいため、調査しました。
appengine packageのソースコードをチラ見する
appengine.dartをのぞいてみると、
export 'api/logging.dart';
とあり、import ‘package:appengine/appengine.dart’;
したsource codeではloggingが使用可能であることが分かります。
api/logging.dart
ではLoggingというabstract classが定義されています。そこでは、functionとしてcritical(), error(), warning(), debug()が定義されています。明らかにLog Levelを意味しています。
LogLevel classでは、各log levelが
static const LogLevel CRITICAL = const LogLevel._('Critical', 4);
などと定義されています。
実体を探すと、appengine/src/api_impl/logging_impl.dart
で、appengineのlogging機構を使用するコードになっているようです。(なにやらIssueやらTODOやら見えますね。)
つまり、Dartのappengine packageにはappengine用の独自のlogging libraryが含まれていますので、標準libraryのlogging等をimportする必要はありませんし、そして(少なくとも現在は)使うこともできないようです。
サンプルコードを検索する
そして、おもむろにサンプルコードを検索し、loggingをしている箇所を発見しました。 https://github.com/dart-lang/appengine_samples/blob/master/cloud_datastore/bin/server.dart#L97
var logging = context.services.logging; logging.debug('Got request ${request.uri} .');
確かにappengineのloggingを利用しています。
しかし、このサンプルコードがあるサンプルプロジェクトを動かしてみても、logが吐かれません。print()デバッグもできません。
Github IssuesやGoogle Groupを検索する
関連するGithub IssuesやGoogle Groupを検索したところ、以下のスレッドを発見。
https://groups.google.com/a/dartlang.org/forum/#!searchin/cloud/log/cloud/Eyi-BfujX0U/Y8QW2kHycm8J
現在はまだ、–verbosity debug フラグを付けないとlogが表示されないようで、将来はこのフラグ無しでlogがterminalに表示されるようになるそうです。
そこで、
$ gcloud preview app run app.yaml
ではなく、
$ gcloud --verbosity debug preview app run app.yaml
として起動したところ、無事loggingとprint()の内容がterminalに表示されました。
冗長な表示内容
しかし、–verbosity debugでは他の冗長な内容が表示されすぎて辛い。なにか他の起動optionはないかと
$ gcloud preview app run --help
してみると、–log-level
というoptionを発見。
しかし、–log-level=“debug”
(または–log-level debug
)を付加しても、自分が試した限りでは期待する動作をしてくれませんでした。
というわけで、
現状ではまだ、–verbosity debugにするしかないのかも。まあまだベータ版ですし、これからのアップデートに期待。
DartEditorなどのdebuggerとの統合ももう少し先になるようです。 http://stackoverflow.com/questions/26807828/how-can-i-debug-a-dart-appengine-app
0 件のコメント :
コメントを投稿