所以我有一个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
管道。
答案 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.');
答案 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');