やらなイカ?

たぶん、iOS/Androidアプリの開発・テスト関係。

IntelliJ plugin からのログ出力

IntelliJ (JetBrains IDE) ファミリー向けのプラグイン開発をしていて、ログ出力まわりが少々わかりにくかった*1のでメモ。

プラグインからのログ出力

プラグインからログを出力するには、 com.intellij.openapi.diagnostic.Logger を使います。

Javaの場合

Logger log = Logger.getInstance(getClass());
log.trace("trace!!!");
log.debug("debug!!!");
log.info("info!!!");
log.warn("warn!!!");
log.error("error!!!");
log.error("例外を渡すことも可能", new Throwable());

Kotlinの場合*2

val log = Logger.getInstance(javaClass)
log.trace("trace!!!")
log.debug("debug!!!")
log.info("info!!!")
log.warn("warn!!!")
log.error("error!!!")
log.error("例外を渡すことも可能", Throwable())

サンドボックス実行環境のログ出力先

Gradle > runIde で実行すると起動するサンドボックスでは、ログはプロジェクトのルートディレクトリ下 /build/idea-sandbox/system/log/idea.log に出力されます。

idea.logは、Runウィンドウで見られるようにしておくと便利です。 Run > Edit Configurations... を開き、Gradle > runIde の"Logs"タブで"+"アイコンをクリックしてidea.logのパスを追加します。

f:id:nowsprinting:20200418183403p:plain

すると、Runウィンドウにタブが追加されるようになり、そこで idea.log を確認できます。

f:id:nowsprinting:20200419094611p:plain

なお、タブの右方にあるテキストフィールドでログの絞り込み、その左隣のドロップダウン(上図では"all")で表示するログレベルの変更ができます。

実際のログ出力先

プラグインをビルドした後、正規のルートでIntelliJ IDEAなどにインストールして使用するとき、ログはmacOSでは ~/Library/Logs/JetBrains/IntelliJIdea2020.1/idea.log に出力されます。

IDEをJetBrains TOOLBOXからインストールしていれば、TOOLBOXを開いて目的のIDEの右の六角形 > Settings にある "Show logs directory" ボタンで idea.log の場所がFinderで開きます。

なお、2020.1から、ログだけでなく、設定、キャッシュ、プラグインの格納場所が変更になっています。 2019.3以前の情報も含めてまとめられたページを教えていただきました。

ログレベルの変更

Diagnostic loggerのログ出力レベルのデフォルトは INFO です。 DEBUG まで出力するには、 Help > Diagnostic Tools > Debug Log Settings… を開き、改行区切りで # + パッケージ名もしくはクラスのFQCNを設定します*3

f:id:nowsprinting:20200418190423p:plain

ダイアログに書いてあるとおり、TRACE まで出力するにはパッケージ名もしくはFQCNの後ろに :trace を付けます。

なお、いずれも、開発中のサンドボックス実行環境の場合、runIdeで起動された側(サンドボックス側)のIDEで設定する必要があります。

参考

プラグイン開発に関しては、公式ドキュメントにある程度の情報が載っています。日本語版もちゃんと更新されています*4

IntelliJ プラットフォーム SDK / IntelliJ プラットフォーム SDK プラグイン開発ガイド

IntelliJ Platform SDK / IntelliJ Platform SDK DevGuide

少し込み入った話になると、ヘルプセンターがヒットしたりはします。

IDEs Support (IntelliJ Platform) | JetBrains

*1:バージョンの変わり目にはじめてのプラグイン開発をしたからというのが最大の理由ですが

*2:KotlinのパッケージレベルでjavaClassの代替手段がほしい。どなたか知っていたら教えて下さい

*3:ワイルドカードではないので、特定のパッケージ以下をすべて有効にしたければ画像のように書けばok。後ろに*をつけると無効になります

*4:が、翻訳には限界があるので検索で探し当てるのは難しいです