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_log
Apache 로그에 로깅합니다.
단, 표준 웹 서버를 통해 서비스를 제공하는 경우에는 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
저도 시도해 본 적은 없지만, 라이브러리를 빠르게 조사해 보면 다음과 같이 할 수 있습니다.
$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
'programing' 카테고리의 다른 글
Vue는 생성자가 아닙니다. (0) | 2022.09.11 |
---|---|
프라이머리 SQL별 FIFO 값 감소 (0) | 2022.09.11 |
어떻게 자바에 있는 기간" 예쁜 인쇄" 수 있을까요? (0) | 2022.09.11 |
MySQL을 사용하여 빈 필드 확인 (0) | 2022.09.11 |
jQuery를 사용하여 현재 URL을 가져오시겠습니까? (0) | 2022.09.11 |