{"id":3572,"date":"2026-10-23T08:57:25","date_gmt":"2026-10-22T23:57:25","guid":{"rendered":"https:\/\/qol-kk.com\/wp2\/?p=3572"},"modified":"2026-10-23T08:57:25","modified_gmt":"2026-10-22T23:57:25","slug":"20260914-00mu0kr3","status":"publish","type":"post","link":"https:\/\/qol-kk.com\/wp2\/blog\/2026\/10\/23\/20260914-00mu0kr3\/","title":{"rendered":"Monolog\u3067\u30ed\u30b0\u8a2d\u8a08\uff1a\u30cf\u30f3\u30c9\u30e9\u3068\u30c1\u30e3\u30f3\u30cd\u30eb\u3092\u4f7f\u3044\u3053\u306a\u3059"},"content":{"rendered":"<h2>\u6982\u8981<\/h2>\n<p>PHP\u306e\u30c7\u30d5\u30a1\u30af\u30c8\u306a\u30ed\u30ae\u30f3\u30b0\u30e9\u30a4\u30d6\u30e9\u30ea Monolog \u306f\u3001\u300c\u30cf\u30f3\u30c9\u30e9\uff08Handler\uff09\u300d\u300c\u30d5\u30a9\u30fc\u30de\u30c3\u30bf\uff08Formatter\uff09\u300d\u300c\u30d7\u30ed\u30bb\u30c3\u30b5\uff08Processor\uff09\u300d\u300c\u30c1\u30e3\u30f3\u30cd\u30eb\uff08Channel\uff09\u300d\u3068\u3044\u30464\u3064\u306e\u90e8\u54c1\u306e\u7d44\u307f\u5408\u308f\u305b\u3067\u52d5\u304d\u307e\u3059\u3002\u3053\u306e\u69cb\u9020\u3092\u7406\u89e3\u3059\u308b\u3068\u3001\u300c\u30a2\u30d7\u30ea\u306e\u30ed\u30b0\u300d\u300c\u76e3\u67fb\u30ed\u30b0\u300d\u300c\u5916\u90e8\u901a\u77e5\u300d\u3068\u3044\u3063\u305f\u6027\u8cea\u306e\u9055\u3046\u30ed\u30b0\u3092\u3001\u7834\u7dbb\u306a\u304f\u6574\u7406\u3057\u3066\u51fa\u529b\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n<p>\u672c\u8a18\u4e8b\u306fMonolog\u5165\u9580\u3068\u3057\u3066\u3001\u305d\u308c\u305e\u308c\u306e\u5f79\u5272\u3068\u7d44\u307f\u5408\u308f\u305b\u65b9\u3092\u3001\u52d5\u304f\u30b3\u30fc\u30c9\u4f8b\u3068\u3068\u3082\u306b\u6574\u7406\u3057\u307e\u3059\u3002PHP 8\u7cfb \/ Monolog 3\u7cfb\u3092\u524d\u63d0\u3068\u3057\u307e\u3059\u3002<\/p>\n<h2>Monolog\u306e\u57fa\u672c\u69cb\u9020<\/h2>\n<p>Monolog\u306e\u4e2d\u5fc3\u306f <code>Logger<\/code> \u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3067\u3059\u3002\u3053\u3053\u306b\u300c\u3069\u3053\u3078\u51fa\u3059\u304b\uff08Handler\uff09\u300d\u300c\u3069\u3046\u6574\u5f62\u3059\u308b\u304b\uff08Formatter\uff09\u300d\u300c\u4f55\u3092\u4ed8\u3051\u8db3\u3059\u304b\uff08Processor\uff09\u300d\u3092\u5dee\u3057\u8fbc\u307f\u307e\u3059\u3002<\/p>\n<pre class=\"lang:default decode:true\">use Monolog\\Logger;\nuse Monolog\\Handler\\StreamHandler;\nuse Monolog\\Level;\n\n\/\/ \"app\" \u304c\u30c1\u30e3\u30f3\u30cd\u30eb\u540d\uff08=\u3053\u306eLogger\u306e\u8b58\u5225\u5b50\uff09\n$logger = new Logger('app');\n$logger-&gt;pushHandler(new StreamHandler(__DIR__ . '\/logs\/app.log', Level::Debug));\n\n$logger-&gt;info('\u30e6\u30fc\u30b6\u30fc\u304c\u30ed\u30b0\u30a4\u30f3\u3057\u307e\u3057\u305f', ['user_id' =&gt; 123]);\n$logger-&gt;error('\u6c7a\u6e08\u306b\u5931\u6557\u3057\u307e\u3057\u305f', ['order_id' =&gt; 456]);<\/pre>\n<p>\u7b2c2\u5f15\u6570\u306e <code>Level::Debug<\/code> \u306f\u300c\u3053\u306e\u30cf\u30f3\u30c9\u30e9\u304c\u51e6\u7406\u3059\u308b\u6700\u4f4e\u30ec\u30d9\u30eb\u300d\u3067\u3059\u3002Monolog 3\u3067\u306f\u30ec\u30d9\u30eb\u306f <code>Monolog\\Level<\/code> \u306e enum \u306b\u306a\u308a\u307e\u3057\u305f\uff082\u7cfb\u306e <code>Logger::DEBUG<\/code> \u5b9a\u6570\u304b\u3089\u5909\u308f\u3063\u305f\u70b9\u306b\u6ce8\u610f\uff09\u3002<\/p>\n<p>\u30ed\u30b0\u30ec\u30d9\u30eb\u306f\u91cd\u8981\u5ea6\u306e\u4f4e\u3044\u9806\u306b Debug \/ Info \/ Notice \/ Warning \/ Error \/ Critical \/ Alert \/ Emergency \u306e8\u6bb5\u968e\uff08PSR-3\u6e96\u62e0\uff09\u3067\u3059\u3002<\/p>\n<h2>\u30cf\u30f3\u30c9\u30e9\uff08Handler\uff09\uff1a\u3069\u3053\u3078\u51fa\u3059\u304b<\/h2>\n<p>\u30cf\u30f3\u30c9\u30e9\u306f\u300c\u30ed\u30b0\u306e\u884c\u304d\u5148\u300d\u3092\u6c7a\u3081\u308b\u90e8\u54c1\u3067\u3059\u30021\u3064\u306eLogger\u306b\u8907\u6570\u7a4d\u3081\u307e\u3059\u3002\u4ee3\u8868\u7684\u306a\u3082\u306e\u306f\u4ee5\u4e0b\u3067\u3059\u3002<\/p>\n<ul>\n<li><code>StreamHandler<\/code> \u2014 \u30d5\u30a1\u30a4\u30eb\u3084 <code>php:\/\/stderr<\/code> \u3078\u66f8\u304d\u51fa\u3059\uff08\u6700\u3082\u57fa\u672c\uff09<\/li>\n<li><code>RotatingFileHandler<\/code> \u2014 \u65e5\u4ed8\u3054\u3068\u306b\u30d5\u30a1\u30a4\u30eb\u3092\u5206\u5272\u3057\u3001\u4fdd\u6301\u65e5\u6570\u3092\u6307\u5b9a\u3067\u304d\u308b<\/li>\n<li><code>SyslogHandler<\/code> \u2014 OS\u306esyslog\u3078<\/li>\n<li><code>SlackWebhookHandler<\/code> \u2014 Slack\u3078\u901a\u77e5<\/li>\n<li><code>NullHandler<\/code> \u2014 \u4f55\u3082\u3057\u306a\u3044\uff08\u30c6\u30b9\u30c8\u3084\u7121\u52b9\u5316\u306b\uff09<\/li>\n<\/ul>\n<p>\u8907\u6570\u30cf\u30f3\u30c9\u30e9\u3092\u7a4d\u3080\u3068\u300c\u767b\u9332\u3057\u305f\u9006\u9806\u300d\u306b\u8a55\u4fa1\u3055\u308c\u307e\u3059\u3002\u3053\u308c\u3092\u5229\u7528\u3057\u3066\u300c\u8a73\u7d30\u306f\u30d5\u30a1\u30a4\u30eb\u3001\u91cd\u5927\u306a\u3082\u306e\u3060\u3051\u901a\u77e5\u300d\u3068\u3044\u3063\u305f\u632f\u308a\u5206\u3051\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n<pre class=\"lang:default decode:true\">use Monolog\\Handler\\RotatingFileHandler;\nuse Monolog\\Handler\\SlackWebhookHandler;\n\n$logger = new Logger('app');\n\n\/\/ \u3059\u3079\u3066\u306e\u30ed\u30b0\uff08Debug\u4ee5\u4e0a\uff09\u3092\u65e5\u6b21\u30ed\u30fc\u30c6\u30fc\u30b7\u30e7\u30f3\u3067\u30d5\u30a1\u30a4\u30eb\u3078\n$logger-&gt;pushHandler(new RotatingFileHandler(\n    __DIR__ . '\/logs\/app.log',\n    maxFiles: 14,\n    level: Level::Debug\n));\n\n\/\/ Critical\u4ee5\u4e0a\u3060\u3051Slack\u3078\u901a\u77e5\n$logger-&gt;pushHandler(new SlackWebhookHandler(\n    webhookUrl: getenv('SLACK_WEBHOOK_URL'),\n    channel: '#alerts',\n    level: Level::Critical\n));\n\n$logger-&gt;info('\u30d0\u30c3\u30c1\u958b\u59cb');          \/\/ \u2192 \u30d5\u30a1\u30a4\u30eb\u306e\u307f\n$logger-&gt;critical('DB\u63a5\u7d9a\u4e0d\u80fd');       \/\/ \u2192 \u30d5\u30a1\u30a4\u30eb + Slack<\/pre>\n<h2>FingersCrossedHandler\uff1a\u666e\u6bb5\u306f\u9759\u304b\u306b\u3001\u4e8b\u304c\u8d77\u304d\u305f\u3089\u5168\u90e8\u5410\u304f<\/h2>\n<p>\u5165\u9580\u3067\u4fbf\u5229\u3055\u3092\u4f53\u611f\u3057\u3084\u3059\u3044\u306e\u304c <code>FingersCrossedHandler<\/code> \u3067\u3059\u3002\u666e\u6bb5\u306f\u30ed\u30b0\u3092\u30d0\u30c3\u30d5\u30a1\u306b\u6e9c\u3081\u3066\u304a\u304d\u3001\u4e00\u5b9a\u30ec\u30d9\u30eb\uff08\u30a2\u30af\u30c6\u30a3\u30d9\u30fc\u30b7\u30e7\u30f3\u6761\u4ef6\uff09\u3092\u8d85\u3048\u305f\u3089\u3001\u305d\u308c\u307e\u3067\u6e9c\u3081\u3066\u3044\u305f\u5206\u3092\u307e\u3068\u3081\u3066\u5185\u5074\u306e\u30cf\u30f3\u30c9\u30e9\u3078\u6d41\u3057\u307e\u3059\u3002<\/p>\n<pre class=\"lang:default decode:true\">use Monolog\\Handler\\FingersCrossedHandler;\nuse Monolog\\Handler\\StreamHandler;\n\n$logger = new Logger('app');\n$logger-&gt;pushHandler(new FingersCrossedHandler(\n    handler: new StreamHandler(__DIR__ . '\/logs\/app.log', Level::Debug),\n    activationStrategy: Level::Error   \/\/ Error\u304c\u51fa\u305f\u3089\u767a\u706b\n));\n\n$logger-&gt;debug('\u30ea\u30af\u30a8\u30b9\u30c8\u53d7\u4fe1 GET \/orders');\n$logger-&gt;debug('SQL\u767a\u884c SELECT ...');\n$logger-&gt;info('\u5728\u5eab\u30c1\u30a7\u30c3\u30af OK');\n\/\/ \u3053\u3053\u307e\u3067\u306f\u4f55\u3082\u66f8\u304d\u8fbc\u307e\u308c\u306a\u3044\uff08\u30d0\u30c3\u30d5\u30a1\u306b\u6e9c\u307e\u3063\u3066\u3044\u308b\u3060\u3051\uff09\n\n$logger-&gt;error('\u6c7a\u6e08API\u304c\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8');\n\/\/ \u2192 \u3053\u306e\u77ac\u9593\u3001\u4e0a\u306edebug\/info\u3082\u542b\u3081\u3066\u5168\u90e8\u30d5\u30a1\u30a4\u30eb\u306b\u66f8\u304d\u8fbc\u307e\u308c\u308b<\/pre>\n<p>\u6b63\u5e38\u6642\u306f\u30c7\u30a3\u30b9\u30af\u3092\u6c5a\u3055\u305a\u3001\u30a8\u30e9\u30fc\u767a\u751f\u6642\u3060\u3051\u300c\u305d\u3053\u306b\u81f3\u308b\u307e\u3067\u306e\u8a73\u7d30\u306a\u6587\u8108\u300d\u304c\u307e\u3068\u3081\u3066\u6b8b\u308b\u305f\u3081\u3001\u8abf\u67fb\u52b9\u7387\u304c\u5927\u304d\u304f\u4e0a\u304c\u308a\u307e\u3059\u3002<\/p>\n<h2>\u30d5\u30a9\u30fc\u30de\u30c3\u30bf\uff08Formatter\uff09\uff1a\u3069\u3046\u6574\u5f62\u3059\u308b\u304b<\/h2>\n<p>\u51fa\u529b\u306e\u898b\u305f\u76ee\u3092\u6c7a\u3081\u308b\u306e\u304c\u30d5\u30a9\u30fc\u30de\u30c3\u30bf\u3067\u3059\u3002\u30cf\u30f3\u30c9\u30e9\u3054\u3068\u306b\u8a2d\u5b9a\u3067\u304d\u307e\u3059\u3002\u69cb\u9020\u5316\u30ed\u30b0\uff08JSON\uff09\u306b\u3057\u3066\u304a\u304f\u3068\u3001\u5f8c\u6bb5\u306e\u30ed\u30b0\u57fa\u76e4\u3067\u691c\u7d22\u30fb\u96c6\u8a08\u3057\u3084\u3059\u304f\u306a\u308a\u307e\u3059\u3002<\/p>\n<pre class=\"lang:default decode:true\">use Monolog\\Formatter\\JsonFormatter;\nuse Monolog\\Formatter\\LineFormatter;\n\n$fileHandler = new StreamHandler(__DIR__ . '\/logs\/app.log', Level::Debug);\n$fileHandler-&gt;setFormatter(new JsonFormatter());   \/\/ 1\u884c1JSON\n\n$stdout = new StreamHandler('php:\/\/stdout', Level::Info);\n$stdout-&gt;setFormatter(new LineFormatter(\n    format: \"[%datetime%] %channel%.%level_name%: %message% %context%\\n\",\n    dateFormat: 'Y-m-d H:i:s',\n    allowInlineLineBreaks: true\n));<\/pre>\n<h2>\u30d7\u30ed\u30bb\u30c3\u30b5\uff08Processor\uff09\uff1a\u5168\u30ed\u30b0\u306b\u5171\u901a\u60c5\u5831\u3092\u8db3\u3059<\/h2>\n<p>\u30d7\u30ed\u30bb\u30c3\u30b5\u306f\u3001\u3059\u3079\u3066\u306e\u30ed\u30b0\u30ec\u30b3\u30fc\u30c9\u306b\u6a2a\u65ad\u7684\u306a\u60c5\u5831\u3092\u4ed8\u4e0e\u3057\u307e\u3059\u3002\u30ea\u30af\u30a8\u30b9\u30c8ID\u3084\u30e6\u30fc\u30b6\u30fcID\u3092\u6bce\u56de\u624b\u3067\u66f8\u304b\u305a\u306b\u6e08\u307f\u307e\u3059\u3002<\/p>\n<pre class=\"lang:default decode:true\">use Monolog\\Processor\\WebProcessor;\nuse Monolog\\Processor\\PsrLogMessageProcessor;\n\n$logger-&gt;pushProcessor(new WebProcessor());\n$logger-&gt;pushProcessor(new PsrLogMessageProcessor());\n\n$requestId = bin2hex(random_bytes(8));\n$logger-&gt;pushProcessor(function (array $record) use ($requestId) {\n    $record['extra']['request_id'] = $requestId;\n    return $record;\n});<\/pre>\n<h2>\u30c1\u30e3\u30f3\u30cd\u30eb\uff08Channel\uff09\uff1a\u30ed\u30b0\u3092\u6027\u8cea\u3067\u5206\u3051\u308b<\/h2>\n<p>\u30c1\u30e3\u30f3\u30cd\u30eb\u3068\u306f <code>new Logger('\u30c1\u30e3\u30f3\u30cd\u30eb\u540d')<\/code> \u306e\u540d\u524d\u306e\u3053\u3068\u3067\u3001\u300c\u305d\u306e\u30ed\u30b0\u304c\u3069\u306e\u7528\u9014\u30fb\u95a2\u5fc3\u4e8b\u306b\u5c5e\u3059\u308b\u304b\u300d\u3092\u8868\u3059\u30e9\u30d9\u30eb\u3067\u3059\u30021\u3064\u306e\u30a2\u30d7\u30ea\u3067\u6027\u8cea\u306e\u7570\u306a\u308b\u30ed\u30b0\u3092\u5225\u30c1\u30e3\u30f3\u30cd\u30eb\u306b\u5206\u3051\u308b\u306e\u304c\u8a2d\u8a08\u306e\u52d8\u6240\u3067\u3059\u3002<\/p>\n<pre class=\"lang:default decode:true\">function makeChannel(string $name, string $file, Level $level): Logger {\n    $logger = new Logger($name);\n    $handler = new RotatingFileHandler($file, 30, $level);\n    $handler-&gt;setFormatter(new JsonFormatter());\n    $logger-&gt;pushHandler($handler);\n    return $logger;\n}\n\n$app      = makeChannel('app',      __DIR__ . '\/logs\/app.log',      Level::Debug);\n$audit    = makeChannel('audit',    __DIR__ . '\/logs\/audit.log',    Level::Info);\n$security = makeChannel('security', __DIR__ . '\/logs\/security.log', Level::Info);\n\n$app-&gt;info('\u30da\u30fc\u30b8\u3092\u8868\u793a');\n$audit-&gt;info('\u6a29\u9650\u5909\u66f4', ['actor' =&gt; 'user:1', 'target' =&gt; 'user:9', 'to' =&gt; 'admin']);\n$security-&gt;warning('\u30ed\u30b0\u30a4\u30f3\u9023\u7d9a\u5931\u6557', ['ip_masked' =&gt; '203.0.113.x', 'count' =&gt; 5]);<\/pre>\n<p>\u51fa\u529b\u3055\u308c\u305fJSON\u306b\u306f <code>\"channel\":\"audit\"<\/code> \u306e\u3088\u3046\u306b\u30c1\u30e3\u30f3\u30cd\u30eb\u540d\u304c\u5165\u308b\u305f\u3081\u3001\u5f8c\u6bb5\u306e\u691c\u7d22\u3067 <code>channel = \"security\"<\/code> \u3068\u7d5e\u308a\u8fbc\u3081\u307e\u3059\u3002<\/p>\n<h2>Laravel\u3067\u306e\u4f4d\u7f6e\u3065\u3051<\/h2>\n<p>Laravel\u306f\u5185\u90e8\u3067Monolog\u3092\u4f7f\u3063\u3066\u304a\u308a\u3001<code>config\/logging.php<\/code> \u306e <code>channels<\/code> \u304cMonolog\u306e\u30c1\u30e3\u30f3\u30cd\u30eb\/\u30cf\u30f3\u30c9\u30e9\u8a2d\u5b9a\u306b\u5bfe\u5fdc\u3057\u307e\u3059\u3002<code>stack<\/code> \u30c9\u30e9\u30a4\u30d0\u306f\u8907\u6570\u30c1\u30e3\u30f3\u30cd\u30eb\u306e\u675f\u306d\uff08\uff1d\u8907\u6570\u30cf\u30f3\u30c9\u30e9\u76f8\u5f53\uff09\u3067\u3059\u3002<\/p>\n<pre class=\"lang:default decode:true\">'channels' =&gt; [\n    'stack' =&gt; [\n        'driver' =&gt; 'stack',\n        'channels' =&gt; ['daily', 'slack'],\n        'ignore_exceptions' =&gt; false,\n    ],\n    'daily' =&gt; [\n        'driver' =&gt; 'daily',\n        'path' =&gt; storage_path('logs\/laravel.log'),\n        'level' =&gt; 'debug',\n        'days' =&gt; 14,\n    ],\n    'slack' =&gt; [\n        'driver' =&gt; 'slack',\n        'url' =&gt; env('LOG_SLACK_WEBHOOK_URL'),\n        'level' =&gt; 'critical',\n    ],\n    'audit' =&gt; [\n        'driver' =&gt; 'daily',\n        'path' =&gt; storage_path('logs\/audit.log'),\n        'level' =&gt; 'info',\n        'days' =&gt; 90,\n    ],\n],<\/pre>\n<pre class=\"lang:default decode:true\">Log::info('\u901a\u5e38\u30ed\u30b0');\nLog::channel('audit')-&gt;info('\u6a29\u9650\u5909\u66f4', [...]);<\/pre>\n<p><code>daily<\/code> = <code>RotatingFileHandler<\/code>\u3001<code>slack<\/code> = <code>SlackWebhookHandler<\/code> \u306b\u76f8\u5f53\u3059\u308b\u3001\u3068\u5bfe\u5fdc\u3065\u3051\u308b\u3068\u7406\u89e3\u304c\u65e9\u3044\u3067\u3059\u3002<\/p>\n<h2>\u78ba\u8a8d\u65b9\u6cd5<\/h2>\n<ol>\n<li>\u30b9\u30af\u30ea\u30d7\u30c8\u3092\u5b9f\u884c\u3057\u3001<code>logs\/<\/code> \u914d\u4e0b\u306b\u5404\u30d5\u30a1\u30a4\u30eb\u304c\u751f\u6210\u3055\u308c\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3059\u308b\u3002<\/li>\n<li><code>FingersCrossedHandler<\/code> \u306e\u4f8b\u3067\u306f\u3001<code>error()<\/code> \u3092\u547c\u3076\u524d\u5f8c\u3067\u66f8\u304d\u8fbc\u307f\u304c\u767a\u751f\u3059\u308b\u304b\uff08\uff1d\u30d0\u30c3\u30d5\u30a1\u3055\u308c\u3066\u3044\u308b\u304b\uff09\u3092\u78ba\u8a8d\u3059\u308b\u3002<\/li>\n<li><code>cat logs\/app.log | jq .<\/code> \u3067\u6574\u5f62\u3057\u3001<code>channel<\/code> \/ <code>level_name<\/code> \/ <code>extra.request_id<\/code> \u304c\u542b\u307e\u308c\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3059\u308b\u3002<\/li>\n<\/ol>\n<h2>\u6ce8\u610f\u70b9<\/h2>\n<ul>\n<li>\u30d1\u30b9\u30ef\u30fc\u30c9\u30fb\u30c8\u30fc\u30af\u30f3\u30fb\u500b\u4eba\u60c5\u5831\u306fcontext\u306b\u542b\u3081\u306a\u3044\u3002\u5fc5\u8981\u306a\u3089\u72ec\u81ea\u30d7\u30ed\u30bb\u30c3\u30b5\u3067\u30de\u30b9\u30ad\u30f3\u30b0\u3059\u308b\u3002<\/li>\n<li>Slack\u306a\u3069\u5916\u90e8\u901a\u77e5\u30cf\u30f3\u30c9\u30e9\u306e\u30ec\u30d9\u30eb\u306f\u9ad8\u3081\u306b\u8a2d\u5b9a\u3059\u308b\uff08Debug\u3067\u9001\u308b\u3068\u901a\u77e5\u304c\u6d2a\u6c34\u306b\u306a\u308b\uff09\u3002<\/li>\n<li>\u30ed\u30fc\u30c6\u30fc\u30b7\u30e7\u30f3\u306e\u4fdd\u6301\u65e5\u6570\u306f\u8981\u4ef6\uff08\u76e3\u67fb\u30fb\u6cd5\u4ee4\uff09\u306b\u5408\u308f\u305b\u308b\u3002\u76e3\u67fb\u30ed\u30b0\u306f\u77ed\u304f\u3057\u3059\u304e\u306a\u3044\u3002<\/li>\n<li>Monolog 3\u7cfb\u3067\u306f\u30ec\u30d9\u30eb\u304cenum\u5316\u3055\u308c\u3066\u304a\u308a\u30012\u7cfb\u306e\u8a18\u6cd5\u3068\u975e\u4e92\u63db\u306e\u7b87\u6240\u304c\u3042\u308b\u3002\u30d0\u30fc\u30b8\u30e7\u30f3\u3092\u5408\u308f\u305b\u308b\u3002<\/li>\n<li>\u30cf\u30f3\u30c9\u30e9\u306f\u767b\u9332\u306e\u9006\u9806\u306b\u8a55\u4fa1\u3055\u308c\u308b\u70b9\u306b\u6ce8\u610f\u3059\u308b\u3002<\/li>\n<\/ul>\n<h2>\u307e\u3068\u3081<\/h2>\n<p>Monolog\u306f\u300cHandler\uff08\u3069\u3053\u3078\uff09\u300d\u300cFormatter\uff08\u3069\u3046\uff09\u300d\u300cProcessor\uff08\u4f55\u3092\u8db3\u3059\uff09\u300d\u300cChannel\uff08\u3069\u306e\u95a2\u5fc3\u4e8b\u304b\uff09\u300d\u306e\u5206\u89e3\u3067\u7406\u89e3\u3067\u304d\u307e\u3059\u3002\u307e\u305a\u306f\u7528\u9014\u5225\u306e\u30c1\u30e3\u30f3\u30cd\u30eb\u5206\u3051\u3001\u30ec\u30d9\u30eb\u306b\u3088\u308b\u632f\u308a\u5206\u3051\u3001JSON\u5316\u3001<code>FingersCrossedHandler<\/code> \u306e4\u70b9\u3092\u62bc\u3055\u3048\u308b\u3068\u3001\u5b9f\u904b\u7528\u306b\u8010\u3048\u308b\u30ed\u30b0\u8a2d\u8a08\u306e\u571f\u53f0\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>PHP\u306e\u30c7\u30d5\u30a1\u30af\u30c8\u306a\u30ed\u30ae\u30f3\u30b0\u30e9\u30a4\u30d6\u30e9\u30ea Monolog \u306f\u3001\u300c\u30cf\u30f3\u30c9\u30e9\uff08Handler\uff09\u300d\u300c\u30d5\u30a9\u30fc\u30de\u30c3\u30bf\uff08Formatter\uff09\u300d\u300c\u30d7\u30ed\u30bb\u30c3\u30b5\uff08Processor\uff09\u300d\u300c\u30c1\u30e3\u30f3\u30cd\u30eb\uff08Channel\uff09\u300d\u3068\u3044\u30464\u3064\u306e\u90e8\u54c1\u306e\u7d44\u307f\u5408\u308f\u305b\u3067\u52d5\u304d\u307e\u3059\u3002\u3053\u306e\u2026<\/p>\n","protected":false},"author":1,"featured_media":3571,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"sns_share_botton_hide":"","vkExUnit_sns_title":"","_vk_print_noindex":"","sitemap_hide":"","_veu_custom_css":"","veu_display_promotion_alert":"","vkexunit_cta_each_option":"","_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[34],"tags":[153,98,472],"class_list":["post-3572","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-php-memorandum","tag-laravel","tag-php","tag-472"],"veu_head_title_object":{"title":"","add_site_title":""},"jetpack_publicize_connections":[],"jetpack-related-posts":[],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/qol-kk.com\/wp2\/wp-content\/uploads\/2026\/10\/20260914-00mu0kr3-thumbnail.jpg","_links":{"self":[{"href":"https:\/\/qol-kk.com\/wp2\/wp-json\/wp\/v2\/posts\/3572","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/qol-kk.com\/wp2\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/qol-kk.com\/wp2\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/qol-kk.com\/wp2\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/qol-kk.com\/wp2\/wp-json\/wp\/v2\/comments?post=3572"}],"version-history":[{"count":1,"href":"https:\/\/qol-kk.com\/wp2\/wp-json\/wp\/v2\/posts\/3572\/revisions"}],"predecessor-version":[{"id":3573,"href":"https:\/\/qol-kk.com\/wp2\/wp-json\/wp\/v2\/posts\/3572\/revisions\/3573"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/qol-kk.com\/wp2\/wp-json\/wp\/v2\/media\/3571"}],"wp:attachment":[{"href":"https:\/\/qol-kk.com\/wp2\/wp-json\/wp\/v2\/media?parent=3572"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/qol-kk.com\/wp2\/wp-json\/wp\/v2\/categories?post=3572"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/qol-kk.com\/wp2\/wp-json\/wp\/v2\/tags?post=3572"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}