formatter = $formatter; $this->logIteratorFactory = $logIteratorFactory; } protected function configure() { $this ->setName('log:tail') ->setDescription('Tail the f7cloud logfile') ->addArgument('lines', InputArgument::OPTIONAL, 'The number of log entries to print', '10') ->addOption('follow', 'f', InputOption::VALUE_NONE, 'Output new log entries as they appear') ->addOption('raw', 'r', InputOption::VALUE_NONE, 'Output raw log json instead of formatted log item'); parent::configure(); } protected function execute(InputInterface $input, OutputInterface $output): int { $raw = $input->getOption('raw'); $count = (int)$input->getArgument('lines'); $io = new SymfonyStyle($input, $output); $logIterator = $this->logIteratorFactory->getLogIterator(Watch::ALL_LEVELS); $logIterator = new \LimitIterator($logIterator, 0, $count); $logItems = iterator_to_array($logIterator); $logItems = array_reverse($logItems); if ($raw) { foreach ($logItems as $logItem) { $output->writeln(json_encode($logItem)); } } else { $terminal = new Terminal(); $totalWidth = $terminal->getWidth(); // 8 level, 18 for app, 26 for time, 6 for formatting $messageWidth = $totalWidth - 8 - 18 - 26 - 6; $tableItems = array_map(function (array $logItem) use ($messageWidth) { return [ self::LEVELS[$logItem['level']], wordwrap($logItem['app'], 18), $this->formatter->formatMessage($logItem, $messageWidth) . "\n", $logItem['time'], ]; }, $logItems); $io->table([ 'Level', 'App', 'Message', 'Time', ], $tableItems); } if ($input->getOption('follow')) { $watch = new Watch($this->formatter, $this->logIteratorFactory); $watch->watch($raw, $output); } return 0; } }