web-dev-qa-db-ja.com

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

Laravelコントローラーがあります:

class YeahMyController extends BaseController {
    public function getSomething() {
        Console::info('mymessage'); // <-- what do I put here?
        return 'yeahoutputthistotheresponse';
    }
}

現在、私は職人を使用してアプリケーションを実行しています(PHPの組み込み開発Webサーバーを内部で実行しています)。

php artisan serve

職人プロセスのSTDOUTパイプにコンソールメッセージを記録したいと思います。

38
Jrop

あぁ!

これは、次のPHP関数を使用して実行できます。

error_log('Some message here.');

ここで答えが見つかりました: 何かをPHPビルトインWebサーバーに印刷

58
Jrop

質問は職人によるサービスに関するものであるため、その場合は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

66
wired00

私はこれを自分で試したことはありませんが、ライブラリをざっと調べてみると、次のことができるようになります。

$output = new Symfony\Component\Console\Output\ConsoleOutput();
$output->writeln("<info>my message</info>");

私はこれのショートカットを見つけることができなかったので、おそらく重複を避けるためにファサードを作成したいと思うでしょう。

18
Dave Morrissey

非常に簡単です。

APPのどこからでも呼び出すことができます。

$out = new \Symfony\Component\Console\Output\ConsoleOutput();
$out->writeln("Hello from Terminal");
11
Googlian

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');

これがお役に立てば幸いです。

9
Tudor

STDOUTにログを記録する場合は、Laravelが提供する任意の方法を使用できます。たとえば(wired00の回答から):

Log::info('This is some useful information.');

STDOUTマジックは、次の方法で実行できます(file where infoメッセージを設定します):

Log::useFiles('php://stdout', 'info');

注意事項:これはデバッグ専用です。使用しないでくださいanything本番環境では完全に理解できません。

5
vbence

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に送信されることです。

3
alexkb

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;
    }

}
2
Tomeg

これに少し遅れて... 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のより複雑なクラスのデバッグに苦労します。

1
Cy Rossignol

エコーとプレフィックス "\ 033"を使用できます、簡単です:

Artisan::command('mycommand', function () {
   echo "\033======== Start ========\n";
});

テキストの色を変更します。

if (App::environment() === 'production') {
    echo "\033[0;33m======== WARNING ========\033[0m\n";
}
0
Top-tompak