如何从Laravel控制器写入控制台?

时间:2014-08-05 21:29:35

标签: php laravel logging console

所以我有一个Laravel控制器:

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

目前,我正在使用artisan运行应用程序(运行PHP内置的开发Web服务器):

php artisan serve

我想将控制台消息记录到工匠流程的STDOUT管道。

14 个答案:

答案 0 :(得分:57)

这个问题与工匠的服务有关,所以Jrop的答案在这种情况下是理想的。即,error_log登录到apache日志。

但是,如果通过标准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

答案 1 :(得分:52)

啊哈!

这可以通过以下PHP函数完成:

error_log('Some message here.');

在这里找到答案:Print something in PHP built-in web server

答案 2 :(得分:17)

我自己没有试过这个,但是通过图书馆快速挖掘表明你可以做到这一点:

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

我无法找到这样的快捷方式,因此您可能希望创建一个外观以避免重复。

答案 3 :(得分:9)

为了更好地解释Dave Morrissey的回答,我已经在laravel外观中使用Console Output类进行了这些步骤。

1)在您喜欢的文件夹中创建一个Facade(在我的案例中为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');

希望这对你有所帮助。

答案 4 :(得分:9)

这很简单。

您可以在APP的任何位置调用它。

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

答案 5 :(得分:7)

在Laravel 6中,有一个名为“ stderr”的频道。参见type TMyItem = class(TCollectionItem) private procedure ReadMyProps(Reader: TReader); procedure WriteMyProps(Writer: TWriter); protected procedure DefineProperties(Filer: TFiler); override; published MyPropsClass: TMyPropsClass; MyProps: TMyProps stored false; end; procedure TMyItem.DefineProperties(Filer: TFiler); begin inherited DefineProperties(Filer); Filer.DefineProperty('MyProps', ReadMyProps, WriteMyProps, True); end; type TReaderAccess = class(TReader); TWriterAccess = class(TWriter); procedure TMyItem.ReadMyProps(Reader: TReader); begin MyProps := TMyPropsClass(FindClass(Reader.ReadString)).Create; Reader.CheckValue(vaCollection); Reader.ReadListBegin; while not Reader.EndOfList do TReaderAccess(Reader).ReadProperty(MyProps); Reader.ReadListEnd; Reader.ReadListEnd; end; procedure TMyItem.WriteMyProps(Writer: TWriter); begin Writer.WriteString(MyProps.ClassName); TWriterAccess(Writer).WriteValue(vaCollection); Writer.WriteListBegin; Writer.WriteProperties(MyProps); Writer.WriteListEnd; Writer.WriteListEnd; end;

config/logging.php

在您的控制器中:

'stderr' => [
    'driver' => 'monolog',
    'handler' => StreamHandler::class,
    'formatter' => env('LOG_STDERR_FORMATTER'),
    'with' => [
        'stream' => 'php://stderr',
    ],
],

答案 6 :(得分:5)

如果您想登录STDOUT,您可以使用Laravel提供的任何方式;例如(来自wired00&#39;答案):

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

STDOUT魔术可以通过以下方式完成(您正在设置文件,其中info消息发送):

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

提醒:这完全是为了调试。在生产中不要使用任何,你不能完全理解。

答案 7 :(得分:1)

有点迟到......我很惊讶没有人提到Symfony的VarDumper component,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)
);

需要更多代码,但是,作为回报,我们在控制台中获得了良好的格式化,可读输出 - 特别适用于调试复杂对象或数组:

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

为了更进一步,我们甚至可以着色输出! Add this helper function项目保存了一些输入:

function toConsole($var) 
{
    $dumper = new Symfony\Component\VarDumper\Dumper\CliDumper();
    $dumper->setColors(true);

    $dumper->dump((new Symfony\Component\VarDumper\Cloner\VarCloner())->cloneVar($var));
}

如果我们在完整的网络服务器(如Apache或Nginx-not artisan serve)后面运行应用程序,我们可以稍微修改此功能,将转储器的美化输出发送到日志中(通常 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()适用于对简单值进行快速,一次性检查,但上面显示的函数需要花费大量时间来调试Laravel的一些更复杂的类。< / p>

答案 8 :(得分:1)

如果您想要fancy command IO from Laravel(如样式,询问和表格),那么我在下面创建了这个类

说明

我还没有完全验证它是最干净的解决方案等,但它运行良好(但我只在单元测试用例中测试它,在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;
    }

}

答案 9 :(得分:1)

我希望将我的日志记录信息发送到stdout,因为很容易告诉Amazon的Container Service(ECS)收集stdout并将其发送到CloudWatch Logs。因此,为使此工作正常进行,我将一个新的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 Logs中的stdout。

答案 10 :(得分:1)

这是另一种方法:

$stdout = fopen('php://stdout', 'w');
fwrite($stdout, 'Hello, World!' . PHP_EOL);

PHP_EOL 添加新行。

答案 11 :(得分:0)

您可以使用echo和前缀“ \ 033”,很简单:

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

并更改颜色文本:

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

答案 12 :(得分:-1)

改善 Dave Morreysey的答案我添加了一个支持Helpers Class的功能

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

- 这是功能:

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'] ");
    }
}
}

答案 13 :(得分:-4)

我将它用于Lumen,非常确定它也适用于Laravel

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