Dartのログ出力に呼び出し元の情报を含めてクリックで飞べるようにする

何気なく呟いたこのツイートが反応良かったので记事にしました。

一连のツイートに书いた通り,やっていること自体は全く大したことないのと,后述の通りログクリックでジャンプできるのはAndroid Studio(とおそらく他のJetBrains制IDEも)だけで,Visual Studio Code (以后VS Codeと表记)では少なくとも标准では目视で确认できるだけです(それでもログの场所が分からないよりはずっと良いと思いますが)。


番イトルに书いた通りパッケージ化した(二番煎じかもしれませんが)ので,使うだけならこちらをぜひ使ってみてください。READMEにざっと利用例书いてありますが,シンプルなので読まずとも勘で使えるレベルだと思います(´・‿・`)

simple_logger | 飞镖包

simple_logger Dart软件包–提供用于记录的超级简单API。 日志还包括通过设置…的被叫位置。

pub.dartlang.org

stack_trace标准パッケージのTraceクラスのTrace.current([int level = 0])の位置情报を持つFrameのリストから先头を取得してprintに渡す文字列に足すだけです。

levelに1を指定しているのは,この场合はトップレベルの关数であり,直前の呼び出し元に遡れば良いからです。关数を分割したりクラスにlevelを増やすように调节しないとlog关数を呼び出している行とズレてしまうので注意です。

log ,上の例では适当にlogという名前にしていますが,mathパッケージのlogと被るのであまり良い名前では无いと思います。

重めの处理なので注意

该当行ケ全体が返ってくる)がありますが,重めなようなので注意です。同り,リリースビルドでは呼び出し行取得周りの处理はカットするようにした方が良いと思います。

パッパージのソース

Android Studioではクリックすると关数を呼んだ箇所にジャンプする

Android Studioでは,次のようにFrameを出力した箇所がリンク化されて,クリックするだけでその箇所にジャンプできてとても便利です。

つまり,やったこととしては上のたった数行のコードの关数から出力されたログをクリックする様子をキャプチャーしてツイートしただけでした(・‿・`)

青い部分をクリックすると该当行へジャンプ

VS代码ではそのような机能が标准では无かったですが,もしかしたら対応した拡张があるかもしれません(´・?・`)

Flutterの初期学习には古き良きprintデバッグも有用な気がする

Flutterは宣言的なUIフレームワークであり,ライフサイクル周りの把握が初めは少し戸惑いがちだと思います。

次のように适当に色々なメソッドにログを仕込んで観察するとそのあたりの把握が少し捗るかもしれません。

起动してboタンを2回押した时の様子

惯れたら,ログを仕込まなくともパフォーマンスタブで大体动きが掴めますが。

个人的にも色々なアプリでサクット使いたいなと思っていて,その度にログコードをコピペするのも微妙なのでパッケージ化しました。

simple_logger | 飞镖包

simple_logger Dart软件包–提供用于记录的超级简单API。 日志还包括通过设置…的被叫位置。

pub.dartlang.org

すでに似たものがあるかなと思って手短に探したものの,シンプルかつ呼び出し行表示に対応したものが见当たらなかったのですが,よく探せばあるかもしれません。

パッケージにするとどうしても丁宁なコードを书くため,いろいろ细かいところが勉强になりますし,二番煎じでも良いかと思いました。

simple_loggerパッケージのコンセプト

以下を心がけて作りました。

  • シンプル
  • ログ出力した行付きで出力
  • に絵フォルトでログレベルに絵文字に絵添えて见やすくする(个人の好み・変更可能)
  • 标准loggingパッケージとインターフェースを揃える
  • ログ出力フォーマットを変えられる
  • リリースビルド时にパフォーマンマスマの影响・离散の発生を抑えられるように
  • ログ出力后に任意の处理を插入できる
  • これ以上の机能を付けるのはとても慎重に(実装的にも机能的にもこれ以上复雑にしたく无い)

以下,少し补足していきます。

シンプル

重厚なログライブラリーがよくありますが,simple_loggerはシングルトンで初期化方法もSimpleLogger()だけです。

ようにDartだと以下のように工厂的建设者でシングルトンを定义するのが一般的のようです。

定义はあまり违和感无いですが,使うときにSimpleLogger()となるのは毎回インスタンスタス

ログ出力した行付きで出力

本记事の主题ですね。ただ,上述の通り重めの处理っぽいのでデフォルトで无效化してしまっています。次のように任意のログレベル设定ついでに适合オンにして活用してください。

  logger.setLevel( 
水平。 FINEST ,//适当なレベルを设定
includeCallerInfo: true ,//リリースビルドではfalseにする
);

标准loggingパッケージとインターフェースを揃える

次のようにインスタンスを得たとして,

 最终记录器= SimpleLogger(); 

次のような感じでログレベルに応じたメソッドでログ出力できます。

  logger.info('Hello info!'); 
logger.shout('Hello shout!');

标准loggingパッパージの等级Levelが低レベル顺に以下のようになっていて,それぞれに対応したメソッドを用意しているのと合わせてます。

  • 最好的
  • 罚款
  • 精细
  • 配置
  • 信息
  • 警告
  • 严重

_ので,アプリのソースコードード内ドsimple_loggerを使ってlogger.shout('( ´・‿・`)');など适当に各所に书いてても,后から标准记录logッケージやそのログレベルに准拠した他のライブラリーに乘り换えても书き换えせずに済むはずです。

LevelのLevelクラス参照のためだけに标准记录パッケージに依存していますが,内部実装は自前です。

リリースビルド时にパフォーマンマスマの影响・离散の発生を抑えられるように

以下はソースコードのうちログメッセージを出力用のメッセージに変换している部分です。

simple_logger.dart

messageはdynamictypeで文字列以外も许容していて,特にFunctionだった偶尔はその実行结果を出力するようにしています。

Log,次のように书いておいておくと,リリースビルドではログレベルを上げておけばその前のisLoggableチェックで弾かれるため关数内の处理は一切実行されません。

  logger.finest((){ 
//重い处理
//返回“计算结果”;
});

Swift @ @autoclosureでので,呼び出び侧で気をつけずとも以下のようにそのようにそ文字列の书き方でも遅延评価されて便利なのですが,Dartには同等の言语机能が无いため,スキップされるログ文字ルの文字列评価を避けたい场合は上のように呼び出し侧でクロージャーとして渡す必要があります。

  // Dartの场合,以下の文字列は即时评価されてしまう 
logger.finest('$ {/ *重い处理* /}');

ログ出力后に任意の处理を插入できる

えンプルコンセプトとは少し离れますが,とはいえ最低限実用的に使えるように入れた机能です。

実际のアプリ开発では,例えば「ログレベルがSEVERE以上の时は単に标准出力を吐くだけではなくCrashlyticsにも送りたい」などのシーンがあります。

Logいう场合,loggerのon登录的に予め次のように处理を挟み込んでおくと対応できます。

  logger.onLogged =(日志,信息){ 
如果 (info.level> =级别。 严重 ){
// Crashlyticsにエラーを送る。
}
};

これ以上の机能を付けるのはとても慎重に(実装的にも机能的にもこれ以上复雑にしたく无い)

高机能なロガーが欲しくなったら,他の良さそうなログパッグパージを探したり,标准记录パッケージ使ってアプリ要件にあったものを自作したりすることをお勧めします。上述の通り,乘り换えのしやすさにも配虑しています。

_,大抵抗のアプリは今回作ったsimple_logger程度で十分だと思っていて,仆も自分に引发権がある偶尔は基本的にsimple_loggerを使っていくつもりです。

最后にsimple_loggerのオススメの使い方を置いておきます。

インストール

たり,当たり前ですが, pubspec.yamlに以下を记述しておいてpub getflutter packages getでインストールします。

 依赖项: 
simple_logger:^ 0.7.2

logger.dartファイルを追加

用途に合わせて,次のようにグローバルにアクセスできるようなインスタンスをンスを置きます。

级联表示法(..)は最高だと思っています。これのおかげでクラス提供侧は何の工夫もすることなく,利用者侧はインスタンスを取得ついでにメソッドチェーン的に设定に适用することができます。

Grep Consoleというプラグインを使うと,ログレベルの文字列によってログを色分け表示してくれるので,さらに见やすくなります✨

Grep控制台–插件| JetBrains

欢迎使用JetBrains插件存储库

plugins.jetbrains.com

例えば,このようにできます:

场合の场合,次のように设定しています。
(さらに「SHOUTの时は音を出す」などの设定も可能です。)


というわけで,良かったら使ってみてください🐶

simple_logger | 飞镖包

simple_logger Dart软件包–提供用于记录的超级简单API。 日志还包括通过设置…的被叫位置。

pub.dartlang.org