Laravelコントローラーがあります:
class YeahMyController extends BaseController {
public function getSomething() {
Console::info('mymessage'); // <-- what do I put here?
return 'yeahoutputthistotheresponse';
}
}
現在、私は職人を使用してアプリケーションを実行しています(PHPの組み込み開発Webサーバーを内部で実行しています)。
php artisan serve
職人プロセスのSTDOUT
パイプにコンソールメッセージを記録したいと思います。
質問は職人によるサービスに関するものであるため、その場合はJropの答えが理想的です。つまり、Apacheログへのerror_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-<date>.log
(laravel 5.0)にあるLaravelのログファイルに記録します。ログを監視する-linux/osx:tail -f /laravel/storage/logs/laravel-<date>.log
私はこれを自分で試したことはありませんが、ライブラリをざっと調べてみると、次のことができるようになります。
$output = new Symfony\Component\Console\Output\ConsoleOutput();
$output->writeln("<info>my message</info>");
私はこれのショートカットを見つけることができなかったので、おそらく重複を避けるためにファサードを作成したいと思うでしょう。
非常に簡単です。
APPのどこからでも呼び出すことができます。
$out = new \Symfony\Component\Console\Output\ConsoleOutput();
$out->writeln("Hello from Terminal");
Dave Morrisseyの答えをよりよく説明するために、laravelファサードのConsole Outputクラスでラップするためのこれらのステップを作成しました。
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');
これがお役に立てば幸いです。
STDOUTにログを記録する場合は、Laravelが提供する任意の方法を使用できます。たとえば(wired00の回答から):
Log::info('This is some useful information.');
STDOUTマジックは、次の方法で実行できます(file where info
メッセージを設定します):
Log::useFiles('php://stdout', 'info');
注意事項:これはデバッグ専用です。使用しないでくださいanything本番環境では完全に理解できません。
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'],
],
この方法では、ローカル開発用のファイル(またはアクセス可能な場合はインスタンス上)でログを取得しますが、さらに重要なことは、CloudWatch Logsに保存されているstdoutに送信されることです。
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;
}
}
これに少し遅れて... Symfonyの VarDumper
コンポーネント がLaravelの一部にdd()
(あまり知られていないdump()
)ユーティリティ関数。
$dumpMe = new App\User([ 'name' => 'Cy Rossignol' ]);
(new Symfony\Component\VarDumper\Dumper\CliDumper())->dump(
(new Symfony\Component\VarDumper\Cloner\VarCloner())->cloneVar($dumpMe)
);
もう少しコードが必要ですが、代わりに、コンソールでニース形式のreadable出力を取得します。特に複雑なオブジェクトや配列のデバッグに役立ちます。
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 ... }
これをさらに一歩進めるために、出力をcolorizeすることさえできます! このヘルパー関数を追加 プロジェクトに入力して、入力を節約します。
function toConsole($var)
{
$dumper = new Symfony\Component\VarDumper\Dumper\CliDumper();
$dumper->setColors(true);
$dumper->dump((new Symfony\Component\VarDumper\Cloner\VarCloner())->cloneVar($var));
}
完全なWebサーバー(artisan serve
ではなくApacheやNginxなど)の背後でアプリを実行している場合、この関数を少し変更して、ダンプのプリティ出力をログに送信できます(通常は 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
PHPのerror_log()
は、単純な値の1回限りの迅速な検査に適していますが、上記の関数は、Laravelのより複雑なクラスのデバッグに苦労します。
エコーとプレフィックス "\ 033"を使用できます、簡単です:
Artisan::command('mycommand', function () {
echo "\033======== Start ========\n";
});
テキストの色を変更します。
if (App::environment() === 'production') {
echo "\033[0;33m======== WARNING ========\033[0m\n";
}