programing

Laravel Controller에서 콘솔에 쓰는 방법

goodsources 2022. 9. 11. 20:09
반응형

Laravel Controller에서 콘솔에 쓰는 방법

Laravel 컨트롤러가 있습니다.

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

현재 저는 장인(PHP의 빌트인 개발 웹 서버를 후드로 실행)을 사용하여 애플리케이션을 실행하고 있습니다.

php artisan serve

콘솔 메시지를 로그로 기록하고 싶다.STDOUT장인용 파이프

아하!

이것은 다음의 PHP 함수로 실행할 수 있습니다.

error_log('Some message here.');

여기서 답을 찾았습니다. PHP 내장서버에서 인쇄합니다.

그 질문은 장인을 통해 봉사하는 것에 관한 것이므로, Jrop의 대답은 그 경우에 이상적입니다.예,error_logApache 로그에 로깅합니다.

단, 표준 웹 서버를 통해 서비스를 제공하는 경우에는 Larabel 고유의 로깅 기능을 사용합니다.

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

다음 위치에 있는 Larabel 로그 파일에 기록됩니다./laravel/storage/logs/laravel-<date>.log(라벨 5.0).로그를 감시합니다(linux/osx:tail -f /laravel/storage/logs/laravel-<date>.log

  • Larabel 5.0 http://laravel.com/docs/5.0/errors
  • Larabel 4.2: http://laravel.com/docs/4.2/errors

저도 시도해 본 적은 없지만, 라이브러리를 빠르게 조사해 보면 다음과 같이 할 수 있습니다.

$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");

라라벨 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!');

Dave Morrissey의 답변을 더 잘 설명하기 위해 저는 콘솔 출력 클래스와 함께 라벨 파사드에 랩을 하기 위해 이 단계를 만들었습니다.

1) 원하는 폴더에 파사드를 만듭니다(내 경우 앱\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');

도움이 되길 바랍니다.

스타일링, 질문, 테이블 등 Laravel에서 고급 명령 IO를 원하는 경우 아래 클래스를 만들었습니다.

지침들

저는 그것이 가장 깨끗한 솔루션이라는 것을 모든 곳에서 완전히 검증하지는 않았지만, 그것은 잘 작동합니다(단, 저는 Larabel 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;
    }

}

Amazon의 컨테이너 서비스(ECS)에 stdout을 수집하여 CloudWatch Logs로 전송하도록 쉽게 지시할 수 있기 때문에 로그 정보를 stdout으로 전송하려고 했습니다. 새로운 를 stdout에 했습니다.config/logging.php다음과 같이 합니다.

    'stdout' => [
        'driver' => 'monolog',
        'handler' => StreamHandler::class,
        'with' => [
            'stream' => 'php://stdout',
        ],
        'level' => 'info',
    ],

그런 다음 스택 로그 채널의 채널 중 하나로 'stdout'을 추가했습니다.

    'default' => env('LOG_CHANNEL', 'stack'),

    'stack' => [
        'driver' => 'stack',
        'channels' => ['stdout', 'daily'],
    ],

이렇게 하면 로컬 개발용(또는 액세스할 수 있는 경우 인스턴스에서도) 파일에 로그가 저장되지만, 더 중요한 것은 로그가 CloudWatch 로그에 저장된 stdout으로 전송됩니다.

STDOUT에 로그하는 경우 Larabel이 제공하는 방법 중 하나를 사용할 수 있습니다. 예를 들어 wired00의 답변에서 확인할 수 있습니다.

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

STDOUT 매직은 다음 방법으로 실행할 수 있습니다(파일은 다음과 같이 설정합니다).info시시:::: 。

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

주의: 이것은 디버깅 전용입니다.완전히 이해되지 않는 것은 프로덕션에서 사용하지 마십시오.

좀 늦은 감이 있는데...아무도 Symfony의 컴포넌트에 대해 언급하지 않은 것이 놀랍다.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));
}

서버(아닌 나 Nginx 등)에서하고 있는 artisan serve), 이 기능을 약간 변경하여 덤퍼의 예쁜 출력을 로그에 송신할 수 있습니다(일반적으로 storage/flarabel.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()단순한 값의 단발적인 빠른 검사에는 문제가 없지만 위의 함수는 Laravel의 보다 복잡한 클래스 중 일부를 디버깅하는 번거로움을 덜어줍니다.

다른 방법은 다음과 같습니다.

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

echo 및 prefix "\033"을 사용할 수 있습니다.단순히 다음과 같습니다.

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

색상 텍스트 변경:

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

Larave 6.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

언급URL : https://stackoverflow.com/questions/25148662/how-do-i-write-to-the-console-from-a-laravel-controller

반응형