LogTape 1.0.0 発表のお知らせ

洪 民憙 (Hong Minhee) @hongminhee@hackers.pub

LogTape とは?

LogTape は、モダン JavaScript エコシステム向けに特別に設計されたロギングライブラリです。依存関係ゼロのアーキテクチャ、Node.js、Deno、Bun、ブラウザ、エッジ関数にわたる普遍的なランタイムサポート、そしてライブラリ作者がユーザーに負担をかけることなくロギングを追加できるライブラリファーストの設計哲学が特徴です。LogTape が設定されていない場合、ロギング呼び出しは事実上パフォーマンスへの影響がなく、これが真に邪魔にならないロギングソリューションとなっています。

LogTape の機能と哲学の包括的な概要については、紹介ガイドをご覧ください。

マイルストーンの達成

LogTape 1.0.0 の発表を喜んでお知らせします。これはライブラリ開発における重要なマイルストーンとなります。このリリースは API の安定性と長期サポートへの私たちのコミットメントを表しています。1.0.0 の指定は、LogTape のコア API が安定し、本番環境での使用準備が整ったことを示すものであり、将来の破壊的変更はセマンティックバージョニングの原則に従います。

このマイルストーンは、数ヶ月にわたる改良、コミュニティからのフィードバック、実際の使用経験に基づいており、LogTape を JavaScript アプリケーションとライブラリのための成熟した信頼性の高いロギングソリューションとして確立しています。

主要な新機能

高性能ロギングインフラストラクチャ

LogTape 1.0.0 では、高スループットの本番環境向けに設計されたいくつかのパフォーマンス指向の機能が導入されています。新しいノンブロッキングシンクオプションにより、コンソール、ストリーム、ファイルシンクがログレコードをバッファリングし、非同期でフラッシュできるようになり、ロギング操作がアプリケーションのメインスレッドをブロックすることを防ぎます。

import { configure, getConsoleSink } from "@logtape/logtape";

await configure({
  sinks: {
    console: getConsoleSink({ 
      nonBlocking: {
        bufferSize: 1000,
        flushInterval: 50
      }
    })
  },
  // ...
});

新しい fromAsyncSink() 関数は、LogTape の同期シンクインターフェースを維持しながら、非同期ロギング操作を統合するためのクリーンな方法を提供します。これにより、アプリケーションをブロックすることなく、ログをリモートサーバーやデータベースに送信するようなシナリオが可能になります。

import { fromAsyncSink } from "@logtape/logtape";

const webhookSink = fromAsyncSink(async (record) => {
  await fetch("https://logs.example.com", {
    method: "POST",
    body: JSON.stringify(record)
  });
});

ファイル操作に特化した機能として、@logtape/file パッケージの新しい getStreamFileSink() 関数は、Node.js の PassThrough ストリームを活用して、自動的なバックプレッシャー管理による最適な I/O パフォーマンスを提供します。

新しいシンク統合

このリリースでは、2つの主要な新しいシンクパッケージにより、LogTape の統合機能が大幅に拡張されています。@logtape/cloudwatch-logs パッケージは AWS CloudWatch Logs との直接統合を可能にし、インテリジェントなバッチ処理、指数バックオフリトライ戦略、JSON Lines フォーマットによる構造化ロギングのサポートを特徴としています。

import { getCloudWatchLogsSink } from "@logtape/cloudwatch-logs";

const sink = getCloudWatchLogsSink({
  logGroupName: "/aws/lambda/my-function",
  logStreamName: "my-stream",
  region: "us-east-1"
});

@logtape/windows-eventlog パッケージは、Deno、Node.js、Bun にわたるクロスランタイム互換性を持つネイティブ Windows イベントログサポートを提供します。この統合は、適切なエラー処理とリソースクリーンアップを維持しながら、最大のパフォーマンスを実現するためにランタイム最適化された FFI 実装を使用しています。

美しい開発体験

新しい @logtape/pretty パッケージは、ローカル開発向けに特別に設計された視覚的に魅力的な体験にコンソールロギングを変換します。Signale にインスパイアされたこのパッケージは、各ログレベルに対するカラフルな絵文字、重要なコンテキストを保持するスマートなカテゴリ切り捨て、ログを簡単にスキャンできる完璧なカラム配置を特徴としています。

絵文字と完璧な配置を持つカラフルなコンソールログを表示する LogTape pretty フォーマッタの出力

import { configure, getConsoleSink } from "@logtape/logtape";
import { prettyFormatter } from "@logtape/pretty";

await configure({
  sinks: {
    console: getConsoleSink({ formatter: prettyFormatter })
  },
  // ...
});

上記のように、pretty フォーマッタはリッチなカラースキーム、設定可能なアイコン、長いメッセージでも視覚的な一貫性を維持するインテリジェントな折り返しを備えたトゥルーカラーターミナルをサポートしています。

エコシステム統合

おそらく最も重要なのは、LogTape 1.0.0 がLogTapeのライブラリフレンドリーな設計と既存のロギングインフラストラクチャの間のギャップを埋めるアダプターパッケージを導入したことです。@logtape/adaptor-winston@logtape/adaptor-pino パッケージにより、これらの確立されたロギングライブラリを使用するアプリケーションは、既存のセットアップを変更することなく、LogTape対応ライブラリをシームレスに統合できます。

// winstonでの簡単なセットアップ
import "@logtape/adaptor-winston/install";
// またはカスタム設定で
import { install } from "@logtape/adaptor-winston";
import winston from "winston";

const logger = winston.createLogger({/* あなたの設定 */});
install(logger);

これらのアダプターは、LogTapeの構造化ロギング機能を保持しながら、すべてを好みのロギングシステムを通じてルーティングし、既存のアプリケーションにとってLogTape対応ライブラリの採用をスムーズにします。

開発者体験の向上

このリリースには、LogTapeを使用する開発者のための生活の質を向上させるいくつかの改善が含まれています。新しい getLogLevels() 関数は利用可能なすべてのログレベルへのプログラム的なアクセスを提供し、LogMethod 型はロギングメソッドのより良い型推論を提供します。

ブラウザの互換性が向上し、特に @logtape/otel パッケージは、以前はNode.js固有のインポートによりブラウザ環境で問題がありましたが、改善されました。このパッケージは現在、モジュール解決エラーを投げることなく、すべてのJavaScriptランタイムでシームレスに動作します。

破壊的変更と移行ガイド

LogTape 1.0.0 には1つの注目すべき破壊的変更があります:非推奨の LoggerConfig.level プロパティの削除です。このプロパティはバージョン0.8.0で非推奨となり、より説明的な LoggerConfig.lowestLevel プロパティが推奨されるようになりました。

設定で古いプロパティをまだ使用している場合は、単純に名前を変更してください:

// 以前(非推奨)
{ category: ["app"], level: "info", sinks: ["console"] }
// 現在
{ category: ["app"], lowestLevel: "info", sinks: ["console"] }

より複雑なフィルタリング要件については、より柔軟性を提供し、親ロガーからの継承をサポートする LoggerConfig.filters オプションの使用を検討してください。

完全なパッケージエコシステム

LogTape 1.0.0 は、現在ロギングインフラストラクチャのさまざまな側面に対応する11の専門パッケージで構成される包括的なパッケージエコシステムの集大成を表しています。このモジュラーアプローチにより、必要なパッケージのみをインストールでき、依存関係のフットプリントを最小限に抑えながら、必要に応じて強力なロギング機能にアクセスできます。

パッケージ JSR npm 説明
@logtape/logtape JSR npm コアロギング機能
@logtape/adaptor-pino JSR npm Pino アダプター
@logtape/adaptor-winston JSR npm winston アダプター
@logtape/cloudwatch-logs JSR npm AWS CloudWatch Logs シンク
@logtape/file JSR npm ファイルシンク
@logtape/otel JSR npm OpenTelemetry シンク
@logtape/pretty JSR npm 美しいテキストフォーマッター
@logtape/redaction JSR npm データ編集
@logtape/sentry JSR npm Sentry シンク
@logtape/syslog JSR npm Syslog シンク
@logtape/windows-eventlog JSR npm Windows イベントログシンク

はじめに

LogTapeを初めて使用する場合でも、以前のバージョンからアップグレードする場合でも、1.0.0の使用開始は簡単です。新しいプロジェクトの場合は、シンプルな設定から始めて、必要なパッケージと機能を徐々に追加していきましょう:

import { configure, getConsoleSink } from "@logtape/logtape";

await configure({
  sinks: { console: getConsoleSink() },
  loggers: [
    { category: "my-app", lowestLevel: "info", sinks: ["console"] }
  ]
});

winstonやPinoを使用している既存のアプリケーションは、適切なアダプターをインストールするだけで、LogTape対応ライブラリのメリットをすぐに享受できます。包括的な移行ガイダンスと詳細な機能ドキュメントについては、ドキュメントサイトをご覧ください。

1.0.0リリースは単なるバージョン番号ではなく、本番アプリケーションが必要とする安定性と成熟度へのコミットメントを表しています。LogTapeで何を構築するのか、楽しみにしています。

8

No comments

If you have a fediverse account, you can comment on this article from your own instance. Search https://hackers.pub/ap/articles/019795aa-3487-7467-97ea-4250e721e8c2 on your instance and reply to it.