Laravelコントローラーからコンソールに書き込むにはどうすればよいですか?

受付中 プログラミング
2024-12-24
眠い人
だから私はLaravelコントローラーを持っています
        class YeahMyController extends BaseController {
            public function getSomething() {
                Console::info('mymessage'); // <-- what do I put here?
                return 'yeahoutputthistotheresponse';
            }
        }
        

現在、私は職人(PHPの組み込み開発Webサーバーを内部で実行している)を使用してアプリケーションを実行しています。
php artisan serve
STDOUT職人のプロセスのために、コンソールメッセージをパイプに記録したいと思います。
回答一覧
あはは! これは、次のPHP関数を使用して実行できます。 error_log('Some message here.');
眠い人
質問は職人による奉仕に関連しているので、その場合はJropの答えが理想的です。つまり、 apacheerror_logログに記録します。 ただし、標準のWebサーバーを介してサービスを提供する場合は、Laravel固有のロギング機能を使用するだけです。 \Log::info('This is some useful information.'); \Log::warning('Something could be going wrong.'); \Log::error('Something is really going wrong.'); または、Laravelの現在のバージョンでは、次のようになります。 info('This is some useful information.'); /laravel/storage/logs/laravel-.logこれは、 (laravel 5.0)にあるLaravelのログファイルに記録されます。ログを監視する-linux/osx:tail -f /laravel/storage/logs/laravel-.log Laravel 5.0 http://laravel.com/docs/5.0/errors Laravel 4.2: http: //laravel.com/docs/4.2/errors
眠い人
Laravel 6には、「stderr」というチャネルがあります。参照してくださいconfig/logging.php: 'stderr' => [ 'driver' => 'monolog', 'handler' => StreamHandler::class, 'formatter' => env('LOG_STDERR_FORMATTER'), 'with' => [ 'stream' => 'php://stderr', ], ], コントローラ内: use Illuminate\Support\Facades\Log; Log::channel('stderr')->info('Something happened!');
眠い人
とても簡単です。 APPのどこからでも呼び出すことができます。 $out = new \Symfony\Component\Console\Output\ConsoleOutput(); $out->writeln("Hello from Terminal");
眠い人
私はこれを自分で試したことはありませんが、ライブラリをざっと調べてみると、これができることがわかります。 $output = new Symfony\Component\Console\Output\ConsoleOutput(); $output->writeln("my message"); このためのショートカットが見つからなかったので、重複を避けるためにファサードを作成することをお勧めします。
眠い人
LaravelのファンシーなコマンドIO(スタイリング、質問、テーブルなど)が必要な場合は、以下でこのクラスを作成しました 私はそれが最もクリーンなソリューションなどであることをどこでも完全に検証していませんが、うまく機能します(ただし、Laravel 5.5ではユニットテストケース内からのみテストしました)。 したがって、おそらくあなたはそれを好きなように使うことができます: $cmd = new ConsoleCommand; $cmd->error("Aw snap!"); $cmd->table($headers, $rows); $answer = $cmd->ask("Tell me, what do you need?"); //even Symfony's progress bar $cmd->outputStyle->progressStart(5); //set n = 100% (here 100% is 5 steps) $cmd->outputStyle->progressAdvance(); //you can call it n times $cmd->outputStyle->progressFinish(); //set to 100% またはもちろん、独自のファサード、静的シングルトンなど、またはとにかく必要に応じてラップすることもできます。 クラス自体 class ConsoleCommand extends \Illuminate\Console\Command { protected $name = 'NONEXISTENT'; protected $hidden = true; public $outputSymfony; public $outputStyle; public function __construct($argInput = null) { parent::__construct(); $this->input = new \Symfony\Component\Console\Input\StringInput($argInput); $this->outputSymfony = new \Symfony\Component\Console\Output\ConsoleOutput(); $this->outputStyle = new \Illuminate\Console\OutputStyle($this->input, $this->outputSymfony); $this->output = $this->outputStyle; } }
眠い人
Dave Morrisseyの答えをよりよく説明するために、LaravelファサードのConsoleOutputクラスでラップするためのこれらの手順を実行しました。 1)好みのフォルダ(私の場合はapp \ Facades)にファサードを作成します。 class ConsoleOutput extends Facade { protected static function getFacadeAccessor() { return 'consoleOutput'; } }
眠い人
2)次のようにapp\Providersに新しいサービスプロバイダーを登録します。 class ConsoleOutputServiceProvider extends ServiceProvider { public function register(){ App::bind('consoleOutput', function(){ return new \Symfony\Component\Console\Output\ConsoleOutput(); }); } } 3)config \ app.phpファイルにこれらすべてのものを追加し、プロバイダーとエイリアスを登録します。 'providers' => [ //other providers App\Providers\ConsoleOutputServiceProvider::class ], 'aliases' => [ //other aliases 'ConsoleOutput' => App\Facades\ConsoleOutput::class, ], これで、Laravelアプリケーションの任意の場所で、次のようにメソッドを呼び出すだけです。 ConsoleOutput::writeln('hello'); これがお役に立てば幸いです。
眠い人
Amazonのコンテナサービス(ECS)にstdoutを収集してCloudWatch Logsに送信するように指示するのは簡単なので、ログ情報をstdoutに送信したかったのです。config/logging.phpしたがって、これを機能させるために、次のようにファイルに新しいstdoutエントリを追加しました。 'stdout' => [ 'driver' => 'monolog', 'handler' => StreamHandler::class, 'with' => [ 'stream' => 'php://stdout', ], 'level' => 'info', ], 次に、スタックログチャネルのチャネルの1つとして「stdout」を追加しました。 'default' => env('LOG_CHANNEL', 'stack'), 'stack' => [ 'driver' => 'stack', 'channels' => ['stdout', 'daily'], ], このようにして、ローカル開発用のファイル(または、アクセスできる場合はインスタンス上でも)でログを取得しますが、さらに重要なことに、CloudWatchLogsに保存されているstdoutに送信されます。
眠い人
これについては別の方法があります。 $stdout = fopen('php://stdout', 'w'); fwrite($stdout, 'Hello, World!' . PHP_EOL); PHP_EOL新しい行を追加します。
眠い人
コマンドクラスで 授業前 use Symfony\Component\Console\Output\ConsoleOutput; クラスメソッド内 $output = new ConsoleOutput(); $output->writeln('my text that appears in command line ');
眠い人
これに少し遅れて... Laravelがその(そしてあまり知られていない)ユーティリティ機能のために部分的に含まれているSymfonyのVarDumperコンポーネントについて誰も言及していないことに驚いています。dd()dump() $dumpMe = new App\User([ 'name' => 'Cy Rossignol' ]); (new Symfony\Component\VarDumper\Dumper\CliDumper())->dump( (new Symfony\Component\VarDumper\Cloner\VarCloner())->cloneVar($dumpMe) ); もう少しコードが必要ですが、その見返りとして、コンソールにフォーマットされた読み取り可能な出力が表示されます。これは、複雑なオブジェクトや配列のデバッグに特に役立ちます。 App\User {#17 #attributes: array:1 [ "name" => "Cy Rossignol" ] #fillable: array:3 [ 0 => "name" 1 => "email" 2 => "password" ] #guarded: array:1 [ 0 => "*" ] #primaryKey: "id" #casts: [] #dates: [] #relations: [] ... etc ... } これをさらに一歩進めるために、出力に色を付けることもできます。このヘルパー関数をプロジェクトに追加して、入力を節約します。 function toConsole($var) { $dumper = new Symfony\Component\VarDumper\Dumper\CliDumper(); $dumper->setColors(true); $dumper->dump((new Symfony\Component\VarDumper\Cloner\VarCloner())->cloneVar($var)); } 完全なウェブサーバー(ApacheやNginxなどartisan serve)の背後でアプリを実行している場合は、この関数を少し変更して、ダンパーのプリティファイされた出力をログ(通常はstorage / logs / laravel.log)に送信できます。 function toLog($var) { $lines = [ 'Dump:' ]; $dumper = new Symfony\Component\VarDumper\Dumper\CliDumper(); $dumper->setColors(true); $dumper->setOutput(function ($line) use (&$lines) { $lines[] = $line; }); $dumper->dump((new Symfony\Component\VarDumper\Cloner\VarCloner())->cloneVar($var)); Log::debug(implode(PHP_EOL, $lines)); } ...そしてもちろん、以下を使用してログを監視します。 $ tail -f storage/logs/laravel.log PHPerror_log()は、単純な値の1回限りの迅速な検査には問題なく機能しますが、上記の関数は、Laravelのより複雑なクラスの一部をデバッグする手間を省きます。
眠い人
STDOUTにログインしたい場合は、Laravelが提供する任意の方法を使用できます。たとえば(wired00の回答から): Log::info('This is some useful information.'); STDOUTマジックは、次の方法で実行できます(メッセージの送信先ファイルを設定します)。info Log::useFiles('php://stdout', 'info'); 注意:これは厳密にデバッグ用です。完全に理解していない本番環境では何も使用しないでください。
眠い人
エコーとプレフィックス「\033」を使用できます。簡単です。 Artisan::command('mycommand', function () { echo "\033======== Start ========\n"; }); そして、カラーテキストを変更します。 if (App::environment() === 'production') { echo "\033[0;33m======== WARNING ========\033[0m\n"; }
眠い人
Larave6.0以降から $this->info('This will appear in console'); $this->error('This error will appear in console'); $this->line('This line will appear in console); ドキュメント https://laravel.com/docs/6.x/artisan#writing-output
眠い人