setName('logviewer') ->addOption( 'file', 'f', InputOption::VALUE_OPTIONAL, 'custom log file location (default = grav.log)' ) ->addOption( 'lines', 'l', InputOption::VALUE_OPTIONAL, 'number of lines (default = 10)' ) ->setDescription('Display the last few entries of Grav log') ->setHelp("Display the last few entries of Grav log"); } protected function serve() { $grav = Grav::instance(); $grav->setup(); $file = $this->input->getOption('file') ?? 'grav.log'; $lines = $this->input->getOption('lines') ?? 20; $verbose = $this->input->getOption('verbose', false); $io = new SymfonyStyle($this->input, $this->output); $io->title('Log Viewer'); $io->writeln(sprintf('viewing last %s entries in %s', $lines, $file)); $io->newLine(); $viewer = new LogViewer(); $logfile = $grav['locator']->findResource("log://" . $file); if ($logfile) { $rows = $viewer->objectTail($logfile, $lines, true); foreach ($rows as $log) { $date = $log['date']; $level_color = LogViewer::levelColor($log['level']); if ($date instanceof \DateTime) { $output = "{$log['date']->format('Y-m-d h:i:s')} [<{$level_color}>{$log['level']}]"; if ($log['trace'] && $verbose) { $output .= " {$log['message']}\n"; foreach ((array) $log['trace'] as $index => $tracerow) { $output .= "{$index}${tracerow}\n"; } } else { $output .= " {$log['message']}"; } $io->writeln($output); } } } else { $io->error('cannot find the log file: logs/' . $file); } } }