por log imprimir escribir create consola comandos php laravel logging console

php - imprimir - log laravel 5



¿Cómo escribo en la consola desde un controlador Laravel? (9)

Así que tengo un controlador Laravel:

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

Actualmente, estoy ejecutando la aplicación usando artisan (que ejecuta el servidor web de desarrollo incorporado de PHP bajo el capó):

php artisan serve

Me gustaría registrar los mensajes de la consola en el STDOUT para el proceso artesanal.



La pregunta se relaciona con el servicio a través de artesanos, por lo que la respuesta de Jrop es ideal en ese caso. Es decir, error_log logging en el registro de apache.

Sin embargo, si realiza su servicio a través de un servidor web estándar, simplemente use las funciones de registro específicas de Laravel:

/Log::info(''This is some useful information.''); /Log::warning(''Something could be going wrong.''); /Log::error(''Something is really going wrong.'');

Con versiones actuales de laravel como esta para información:

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

Esto se registra en el archivo de registro de Laravel ubicado en /laravel/storage/logs/laravel-<date>.log (laravel 5.0). Supervise el registro - linux / osx: tail -f /laravel/storage/logs/laravel-<date>.log


No lo he intentado yo mismo, pero una rápida búsqueda en la biblioteca sugiere que puedes hacer esto:

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

No pude encontrar un atajo para esto, por lo que probablemente querrá crear una fachada para evitar la duplicación.


Para mejorar la respuesta de Dave Morreysey, agregué una función a Support Helpers Class ubicada en

vendor/laravel/framework/src/Illimunate/Support/helpers.php

- Esta es la función:

if (!function_exists("consoleOuput")) { /** * Write on Console * * @param string $type * @param string $message * @return void|/Exception */ function consoleOuput(string $type, string $message) { $arr = [ "error" => "error", "warning" => "comment", "info" => "info", "purple" => "question" ]; if (in_array($type, [''error'', ''warning'', ''info'', "purple"])) { $output = new Symfony/Component/Console/Output/ConsoleOutput(); $output->writeln("<{$arr[$type]}>{$message}</{$arr[$type]}>"); } else { throw new /Exception("The type of ouput must be included on [''error'', ''warning'', ''info'', ''purple''] "); } } }


Para una mejor explicación de la respuesta de Dave Morrissey, he realizado estos pasos para envolver con la clase de salida de consola en una fachada de campo.

1) Cree una fachada en su carpeta preferida (en mi caso, la aplicación / Fachadas):

class ConsoleOutput extends Facade { protected static function getFacadeAccessor() { return ''consoleOutput''; } }

2) Registre un nuevo proveedor de servicios en la aplicación / Proveedores de la siguiente manera:

class ConsoleOutputServiceProvider extends ServiceProvider { public function register(){ App::bind(''consoleOutput'', function(){ return new /Symfony/Component/Console/Output/ConsoleOutput(); }); }

}

3) Agregue todas estas cosas en el archivo config / app.php, registrando el proveedor y el alias.

''providers'' => [ //other providers App/Providers/ConsoleOutputServiceProvider::class ], ''aliases'' => [ //other aliases ''ConsoleOutput'' => App/Facades/ConsoleOutput::class, ],

Eso es todo, ahora en cualquier lugar de tu aplicación Laravel, solo llama a tu método de esta manera:

ConsoleOutput::writeln(''hello'');

Espero que esto te ayude.


Poco después de esto ... Me sorprende que nadie haya mencionado el componente VarDumper de Symfony que Laravel incluye, en parte, por sus funciones de utilidad dd() (y menos conocidas, dump() ).

function toConsole($var) { $dumper = new Symfony/Component/VarDumper/Dumper/CliDumper(); $dumper->setColors(true); $dumper->dump((new Symfony/Component/VarDumper/Cloner/VarCloner())->cloneVar($var)); }

Se necesita un poco más de código, pero, a cambio, obtenemos un formato agradable y legible en la consola, especialmente útil para la depuración de objetos complejos o matrices:

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

Para llevar esto un paso más allá, ¡podemos incluso colorear la salida! Agregue esta función auxiliar al proyecto para guardar algo de escritura:

$ tail -f storage/logs/laravel.log

Si estamos ejecutando la aplicación detrás de un servidor web completo (como Apache o Nginx, no un artisan serve ), podemos modificar esta función ligeramente para enviar la salida del volcado al registro (generalmente storage / logs / laravel.log ):

$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%

... y, por supuesto, mirar el registro usando:

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

El error_log() PHP funciona bien para una inspección rápida y única de valores simples, pero las funciones que se muestran arriba evitan el trabajo duro de la depuración de algunas de las clases más complicadas de Laravel.


Si desea iniciar sesión en STDOUT, puede utilizar cualquiera de las formas que proporciona Laravel; por ejemplo (de la respuesta de wired00):

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

La magia STDOUT se puede hacer con lo siguiente (está configurando el archivo donde van los mensajes de info ):

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

Advertencia: esto es estrictamente para la depuración. No uses nada en producción que no entiendas completamente.


Uso esto para Lumen, bastante seguro de que también funcionará con Laravel

shell_exec(''echo "hello world" 1>&2'');


Si quieres el elegante comando IO de Laravel (como el estilo, las preguntas y la tabla), creo esta clase a continuación.

Instrucciones

No he verificado completamente en todas partes que es LA solución más limpia, etc., pero funciona bien ( pero solo la probé desde un caso de prueba unitaria, bajo Laravel 5.5 ).

Así que lo más probable es que puedas usarlo como quieras:

$dumpMe = new App/User([ ''name'' => ''Cy Rossignol'' ]); (new Symfony/Component/VarDumper/Dumper/CliDumper())->dump( (new Symfony/Component/VarDumper/Cloner/VarCloner())->cloneVar($dumpMe) );

O, por supuesto, también puede envolverlo en su propia fachada, o algún singleton estático, etc., o como desee.

La clase en si

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