🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

解決済

2回答

3462閲覧

CakePHP4 $this->log() Typeについて

MKannna

総合スコア4

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

0クリップ

投稿2021/01/05 03:18

前提・実現したいこと

cakephp4
php7.4.11

debug.logファイルにログを出力するときに
Typeエラーが出て、配列を書き込めません。
CakePHP2では普通に出力できていたのに
CakePHP4で何かが変わったのでしょうか?
何かの設定が必要になったのでしょうか?
ご教授のほどよろしくお願いします。

発生している問題・エラーメッセージ

Argument 1 passed to Cake\Controller\Controller::log() must be of the type string, array given,

該当のソースコード

namespace App\Controller\Test; class TestssController extends AppController { public function index() { $array = array("a"=>"fff","d"=>"fff"); $this->log($array,'debug'); } }
LOGに関する設定は以下の通りです。 app.php 'Datasources' => [ ・・・ 'log' => true, ・・・ ] 'Log' => [ 'debug' => [ 'className' => FileLog::class, 'path' => LOGS, 'file' => 'debug', 'url' => env('LOG_DEBUG_URL', null), 'scopes' => false, 'levels' => ['notice', 'info', 'debug'], ], ・・・ ] app_local.php 'debug' => filter_var(env('DEBUG', true), FILTER_VALIDATE_BOOLEAN),

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

CakePHP 3以降、ロギングメソッドはPSR-3のLoggerInterfaceの実装となり、CakePHP 4以降では文字列型しか受け付けなくなっています。

参考: 4.0 移行ガイド - 4.x

CakePHP 4.1以降では、オブジェクトを文字列化してログに記録するには、第3引数の$contextを利用するのとよいでしょう。

参考: : Using Placeholders in Messages - Logging - 4.x

php

1use Cake\Log\Log; 2use Psr\Log\LogLevel; 3 4Log::error('Could not process for user={user}', ['user' => $user]); 5 6// LogTraitの logメソッドであれば 7$this->log('Could not process for user={user}', LogLevel::ERROR, ['user' => $user]);

4.0系であれば、json_encodeなどでオブジェクトをシリアライズして記録すればよいでしょう。

投稿2021/01/06 12:52

nojimage

総合スコア959

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MKannna

2021/01/08 07:45

ご回答ありがとうございます。 まだまだ用語を理解できておらず、クックブックなど読んでも やるべき内容がどれなのかわからなかったのですが、 アドバイスをいただいた上でリンクを読むと理解がしやすかったです。 おかげ様で、求めていた結果をえられました。 プレイスホルダーとは、シリアライズとは... 全然分からなかったので、調べて、ようやく理解ができました。 重要なのは第1引数の"{user}"と第2引数の’user’で これが一致していないと、シリアライズできないということがわかりました。 ただ、このままだと見づらいので、 Log::error('user={user}', ['user' => print_r($user,true)]); として、見やすい形でログに記録することができました。 また、色々試して $this->log(print_r($users, true),'debug'); こちらでも同じ結果が出ましたので、 タイピング数が少ないこちらを採用しようかと思います。 ご丁寧に回答いただき本当にありがとうございました。
MKannna

2021/01/08 07:47

追記いただきました、 シリアライズする方法の優先順位について コードを見たのですが すみません、よくわからなかったです。 どういう状況の時に必要になるのでしょうか?
nojimage

2021/01/12 00:23

シリアライズ方法の優先順位は、オブジェクトをログに出力する際に関係してきます。不要な情報をログに書き出さないために必要になってきます。対象のオブジェクトにあるシリアライズ用のメソッドで出力する内容をコントロールできます。 例えば、jsonSerializeインターフェースを継承したクラスのオブジェクトならjsonSerializeメソッドがシリアライズの際に使用されるのでそこで出力する内容をコントロールできます。CakeのEntityなら$_hiddenプロパティに列挙したフィールドは出力されなかったりしますね。 これにより、センシティブな内容(パスワードやカード情報など)を含むオブジェクトを安易にログに出力にしてしまい、そこから情報漏えいしたという被害を防ぐことができます。
MKannna

2021/01/12 03:30

ご丁寧に解説ありがとうございました。 改めてコードを見てみたところ、シリアライズ化をどのように行っているかがなんとなくわかりました。 出力する内容のコントロールをどうすればいのかまでは まだ勉強不足で分かりませんが、そういうことができるということと ログ出力で情報漏洩が起きる事を知りませんでしたので それを念頭に入れて、今後作業を進めていきながら学んで行きたいと思います。
guest

0

Argument 1 passed to Cake\Controller\Controller::log() must be of the type string, array given,

まんま言ってますが。

日本語訳)「Cake\Controller\Controller::log()の第一引数は文字列型です。現状、配列型を渡しています。」

投稿2021/01/05 03:46

kyoya0819

総合スコア10429

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MKannna

2021/01/05 06:04

ご回答ありがとうございます。 説明がわかりずらくてすみません。 型が違うと怒られているのは分かっているのですが ログファイルに配列型、オブジェクト型を表示するにはどうしたらいいいのかがわかりません。 そもそも使い方が間違っているのでしょうか? 何か設定が必要なのでしょうか? 何かの設定が間違っているのでしょうか? お手数おかけしてすみませんが、 ご教授のほどよろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問