PHPackages                             ryunosuke/simple-logger - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. ryunosuke/simple-logger

ActiveLibrary

ryunosuke/simple-logger
=======================

simple psr-3 logger

v1.1.11(7mo ago)0182↓100%MITPHPPHP &gt;=8.0

Since Aug 30Pushed 7mo ago1 watchersCompare

[ Source](https://github.com/arima-ryunosuke/php-simple-logger)[ Packagist](https://packagist.org/packages/ryunosuke/simple-logger)[ RSS](/packages/ryunosuke-simple-logger/feed)WikiDiscussions master Synced 1mo ago

READMEChangelogDependencies (8)Versions (15)Used By (0)

simple logger
=============

[](#simple-logger)

Description
-----------

[](#description)

psr-3 を実装したシンプルなロガーパッケージです。 ストリームのみの実装ですが、php には強力な StreamWrapper があるので、（Wrapper があれば）実質的にあらゆる対象に書き込むことができます。

出力形式は拡張子で判断されます。

Install
-------

[](#install)

```
{
    "require": {
        "ryunosuke/simple-logger": "dev-master"
    }
}
```

Feature
-------

[](#feature)

（Wrapper があれば）あらゆる個所に出力できます。 例えば下記は S3 にログを出力します。

```
$s3client = new \Aws\S3\S3Client([
    'credentials' => [
        'key'    => 'foo',
        'secret' => 'bar',
    ],
    'region'      => 'ap-northeast-1',
    'version'     => 'latest',
]);
\Aws\S3\StreamWrapper::register($s3client);

$logger = new \ryunosuke\SimpleLogger\StreamLogger('s3://bucket-name/log.txt');
$logger->debug('debug message');
$logger->alert('alert message');

```

ただし、実際のところ（個人の観測範囲内では） file でスキームで書くことが最も多く、個人的にはログというものはファイルログ+fluentd さえあれば十分事足りると考えています（餅は餅屋に任せたい）。 StreamLogger は「与えられたパスが file:// である」という前提を置いていないだけ、という話です。

StreamLogger の他に ChainLogger というものがあります。 これはいわゆるコンポジットなロガーで、保持しているすべてのロガーにログを展開します。

つまり下記のようなことが可能です。 通常は notice 以上のログが `path/to/log.jsonl` に書き込まれますが、 error 以上は smtp スキームを通じてメール送信も行われます。

```
$logger = new \ryunosuke\SimpleLogger\ChainLogger([
    (new \ryunosuke\SimpleLogger\StreamLogger('file://path/to/log.jsonl'))->setPresetPlugins()->prependPlugin(new \ryunosuke\SimpleLogger\Plugins\LevelFilterPlugin('notice')),
    (new \ryunosuke\SimpleLogger\StreamLogger('smtp://hoge@example.com/log.txt'))->setPresetPlugins()->prependPlugin(new \ryunosuke\SimpleLogger\Plugins\LevelFilterPlugin('error')),
]);
$logger->notice('notice message');
$logger->alert('alert message');

```

URL の機能面は下記のようになります。

```
scheme://hostname/path/to/logfile.json
───   ──── ────        ──
  │        │       │            └─  出力形式です（monolog でいう Formatter に相当します）
  │        │       └────────  ストリームラッパーによって様々です（例えば file ではディレクトリです）
  │        └───────────── ストリームラッパーによって様々です。不必要なこともあります（例えば file では不要ですが、S3 ならバケット名になります）
  └────────────────── 出力先です（monolog でいう Handler に相当します）

```

monolog における Processer は Plugin 機構を用いています。 ログレベルによるフィルタや日時文字列の追加などはすべて Plugin として実装されます。 ロガーとしてはそれらの情報を一切特別扱いしません。

### Plugins

[](#plugins)

上記の通り、StreamLogger はストリームへの抽象的な書き込みを担うだけでログの内容には一切の口出しをしていません。 出力形式は拡張子で制御しますが、出力内容については Plugin を設定することで制御します。

- AbstractPlugin
    - プラグインの抽象クラスです
    - 最低限 apply メソッドを実装する必要があります
    - apply はログに何らかの変更を加えます。null を返すとそのログはスキップされます（LevelFilterPlugin が好例です）
- ClosurePlugin
    - 指定したクロージャがコールバックされます
    - アドホックなプラグインを作成するためには無名クラスで `new class() extends AbstractPlugin{...}` する必要がありますがそれを嫌ってクロージャだけで作成できるようにしたものです
- ContextAppendPlugin
    - 任意のエントリをコンテキストに加えます
    - 典型的には日時です。他にホスト名やプロセスIDなどもログとしては有用でしょう
- ContextConsumePlugin
    - `message {context.key}` のような値の埋め込みに使用されたコンテキストを伏せます
    - コンテキストは得てして「メッセージに埋め込みたい」と「ログの参考情報として」の2つ状況があります。前者はメッセージに埋め込まれるため、コンテキストとしては不要です
    - そういった場合に伏せられるようになります。出力形式が構造化テキストでないと指定に意味はありません
- ContextFilterPlugin
    - 任意のコンテキストを変換・削除します
    - ものによっては超絶でかいオブジェクトが context に渡ってきたりするため、切り詰めたり削除したりできます
- ContextOrderPlugin
    - コンテキストの出力順を指定します
    - 例えば「行番号・…雑多なもの…・ファイル名」だったらログが見にくくて仕方ないでしょう。また大抵のログは「日時・ログレベル」が冒頭に来ている方が有用です
    - そういった並び順を指定します。出力形式が構造化テキストでないと指定に意味はありません
- LevelAutoPlugin
    - ログレベルに null が来た場合に自動で設定します
    - context の level, exception, message 自体が exception などに基づいて自動設定します
- LevelFilterPlugin
    - ログレベルでのフィルタです。ロガーであれば実質的に必須でしょう
    - 「NOTICE 以上」のような指定だけではなく、「NOTICE 以上 ERROR 以下」のような指定も可能です
- LevelFromPhpPlugin
    - php のエラー定数（E\_ERROR 等）を標準ログレベルに変換します
    - これにより log メソッドに E\_ERROR 等を与えられるようになります
    - 一部の定数は値が重複しているため、log メソッドに LOG\_ERR などを与える使い方をしていると値が乱れることになります。その回避策として負数の php エラー定数が来ても変換できるようになっています
- LevelNormalizePlugin
    - ログレベルを文字列化します
    - psr3 はログレベルの型を規約していないため、渡ってくるレベルは int だったり大文字だったり小文字だったりします。それを文字列に統一します
- LevelUnsetPlugin
    - level を伏せます
    - 普通は使いません。「レベルすら不要」というある特殊な状況で使います
- LocationAppendPlugin
    - ログメソッドの呼び出し場所（ファイル・行番号など）をコンテキストに加えます
- MessageCallbackPlugin
    - ログメッセージに callable が来た場合にコールバックされます
    - `$logger->debug(function () {...})` などとすればログ生成のコスト自体を抑えることができます
- MessageStringifyPlugin
    - ログメッセージに非 stringable が来た場合に文字列化します
    - `$logger->debug([1, 2, 3])` のように非 stringable でもログられるようにできます
- MessageRewritePlugin
    - ログメッセージを書き換えます
- SuppressPlugin
    - 指定した秒数の間、同一ログの出力を抑制します
    - 基本的には DEBUG レベルで用います
- TagFilterPlugin
    - コンテキストに指定した tag が含まれている場合にログるようになります
    - ChainLogger で集約して、各々のロガーが書き込みという場合に使えます
- ThrowableManglePlugin
    - 例外オブジェクトをよしなにハンドリングします
    - ログメッセージ自体が Throwable であるとか {exception} コンテキストがあるかなどでなんとかして Throwable を見やすく整形します

Note
----

[](#note)

出力は StreamWrapper の実装に強く依存します。これは特徴でもありますがデメリットでもあります。 例えば fopen の a フラグと相性の悪いミドルウェアも存在するため、全ログで flush するとか各ログで逐次 write するとか、細かな制御はこのパッケージ側では制御できません。 細かな制御のためには専用の StreamWrapper を書く必要があります。

License
-------

[](#license)

MIT

FAQ
---

[](#faq)

- Q. なんで車輪の再開発した？
    - A. 元々 monolog を好んで使っていたんですが、少し仰々しく感じてきて、実際のところ logger は StreamHandler しか使わないし見通し良くなるように自前実装したかったのです
- Q. いや、monolog なら Redis とか Slack とか有用なのもあるよ？
    - A. 専用の handler を書かずとも php には既に StreamWrapper という強力な抽象化レイヤーが存在します。handler で使い分けるよりも `s3://hoge/log.txt` とか `redis://hoge/log.txt` とか書くだけでよしなに判断してくれる方が好みなのです
- Q. それにしたって自前実装しなくても…
    - A. monolog の吐き出すログが好みではない、というのも多分にありました。シンプルに json ログを吐きたいだけなのに多少なりとも設定が必要で、ほぼ設定レスなロガーが欲しかったのです

Release
-------

[](#release)

バージョニングは romantic versioning に準拠します（semantic versioning ではありません）。

- メジャー: 大規模な互換性破壊の際にアップします（アーキテクチャ、クラス構造の変更など）
- マイナー: 小規模な互換性破壊の際にアップします（引数の変更、タイプヒントの追加など）
- パッチ: 互換性破壊はありません（デフォルト引数の追加や、新たなクラスの追加、コードフォーマットなど）

### 1.1.11

[](#1111)

- \[fixbug\] オレオレキー が context より優先されている
- \[fixbug\] ミスかと思ったら必要なスラッシュだった

### 1.1.10

[](#1110)

- \[feature\] コンストラクタで open するのをやめる

### 1.1.9

[](#119)

- \[feature\] filetype で null を返せば fallback するように変更

### 1.1.8

[](#118)

- \[refactor\] stream 関数のコールが統一されていなくて見通しが悪い
- \[fixbug\] PLAIN の ThrowableMangle 上書きされて意味を為していない

### 1.1.7

[](#117)

- \[feature\] TagFilterPlugin を追加
- \[feature\] basename 違いのインスタンスを返す withBasename を追加
- \[feature\] suffix コールバックに現在のファイル名が渡ってくるよう変更
- \[feature\] suffix 頻度を下げる機能
- \[fixbug\] 別プロセスのログが失われる不具合

### 1.1.6

[](#116)

- \[feature\] 最初の書き出しでメタ情報を出力する機能

### 1.1.5

[](#115)

- \[feature\] ログレベルを自動で決めるプラグイン

### 1.1.4

[](#114)

- \[feature\] php エラー定数を標準レベルに変換するプラグイン
- \[feature\] level を伏せるプラグイン
- \[refactor\] 雑多な変更

### 1.1.3

[](#113)

- \[feature\] 同一ログを一定時間抑制するプラグイン
- \[feature\] context 値を埋め込んだらその context を伏せるプラグイン
- \[feature\] プラグインに名前を付けて後からソートしやすいように変更

### 1.1.2

[](#112)

- \[fixbug\] ThrowableManglePlugin の不具合修正

### 1.1.1

[](#111)

- \[feature\] プラグインの置き換え機能
- \[feature\] 例外オブジェクトの引数に対応

### 1.1.0

[](#110)

- \[change\] php&gt;=8.0

### 1.0.1

[](#101)

- \[feature\] オートローテーション機能を追加

### 1.0.0

[](#100)

- 公開

###  Health Score

38

—

LowBetter than 85% of packages

Maintenance65

Regular maintenance activity

Popularity14

Limited adoption so far

Community7

Small or concentrated contributor base

Maturity56

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~59 days

Total

14

Last Release

212d ago

PHP version history (2 changes)v1.0.0PHP &gt;=7.4

v1.1.0PHP &gt;=8.0

### Community

Maintainers

![](https://www.gravatar.com/avatar/e51e177034dd7673cfaa86a43d5236ed7a6bc94f32d05c9100b039d908cd1174?d=identicon)[arima-ryunosuke](/maintainers/arima-ryunosuke)

---

Top Contributors

[![arima-ryunosuke](https://avatars.githubusercontent.com/u/7457522?v=4)](https://github.com/arima-ryunosuke "arima-ryunosuke (44 commits)")

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/ryunosuke-simple-logger/health.svg)

```
[![Health](https://phpackages.com/badges/ryunosuke-simple-logger/health.svg)](https://phpackages.com/packages/ryunosuke-simple-logger)
```

###  Alternatives

[elgg/elgg

Elgg is an award-winning social networking engine, delivering the building blocks that enable businesses, schools, universities and associations to create their own fully-featured social networks and applications.

1.7k15.7k4](/packages/elgg-elgg)[neos/flow

Flow Application Framework

862.0M450](/packages/neos-flow)[api-platform/metadata

API Resource-oriented metadata attributes and factories

223.5M96](/packages/api-platform-metadata)[phpro/http-tools

HTTP tools for developing more consistent HTTP implementations.

28137.8k](/packages/phpro-http-tools)[flowwow/cloudpayments-php-client

cloudpayments api client

2188.2k](/packages/flowwow-cloudpayments-php-client)[aedart/athenaeum

Athenaeum is a mono repository; a collection of various PHP packages

255.2k](/packages/aedart-athenaeum)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
