Perl でいい感じに構造化ログを書く旅 #湘南pm

(このエントリは 2023/08/26 の 湘南.pm #1 LT 発表資料です)


こんにちは〜

  • polamjag という者です
  • それっぽいやつが現状 (あんまり) ない Perl のコードベースで構造化ログを書き始めたい
    • とりあえずのゴール: ECS 上で動かしたときにいい感じに Amazon CloudWatch Logs (の CloudWatch Logs Insights) とかで集計できたら OK
    • 分散トレーシングでオブザーバビリティでサクセス、みたいなのは一旦ストレッチゴール

Perl 構造化ログ 無料 最速

use feature qw(say);
use JSON::XS ();

sub logger {
  my ($message, $params) = @_;
  say JSON::XS->new->canonical(1)->encode(+{
    message => $message,
    params => $params,
  });
}

logger('failed to process nantoka' => +{
  error_code => 123,
  error_reason => 'foobar',
  request_id => 'cafebabe', 
});
    終
  制作・著作
━━━━━━━━
ⓟⓞⓛⓐⓜⓙⓐⓖ

構造化ログ

  • 自分の理解: 意味がある構造が (well-known な形式で) シリアライズされたログ
    • 適切な構造をシリアライズしていれば、ログ中の一部の情報を、正規表現を使ったりせず抜き出し、集計したりできる
    • 適切な構造とは、集計やフィルタの対象にしたい値がいい感じになっていること

ところで (時間なかったら飛ばす)

Web アプリケーション構造化ログ界隈

もうちょっと細かい話

  • コンテキストオブジェクトみたいなのがなくて、一緒にログに書きたい情報を持ち回るのがめんどいとき
use Scope::Container;

sub get_logger {
  # どこかで start_scope_container している前提で
  my $logger = scope_container('logger');
  return $logger->{logger} if $logger;

  scope_container('logger', +{
    logger => sub {
      my ($message) = @_;
      JSON::XS->new->canonical->encode(+{ message => $message });
    },
  });
}

超 MVP ではある、が、これでやりたいことの 7 割くらいは達成でき……たか??

OpenTelemetry

ところで……

github.com

For completeness' sake, here are links to the relevant repositories I've been working with:

github.com

完成している (!?!?)

実装も Object::Pad めちゃくちゃ使ってたりして普通に Modern Perl

ところで (2)

↑ の実装を見ていて良いロガーライブラリがあることに気づいた

metacpan.org

Appendix