PHP Classes

File: src/Command/FilterCommand.php

Recommend this page to a friend!
  Classes of Joseluis Laso   Simple Logger   src/Command/FilterCommand.php   Download  
File: src/Command/FilterCommand.php
Role: Class source
Content type: text/plain
Description: Class source
Class: Simple Logger
Log messages and view log filtered files
Author: By
Last change: Update of src/Command/FilterCommand.php
Date: 1 year ago
Size: 2,787 bytes
 

Contents

Class file image Download
<?php

namespace JLaso\SimpleLogger\Command;

use
JLaso\SimpleLogger\PlainFileLogger as Logger;
use
Symfony\Component\Console\Command\Command;
use
Symfony\Component\Console\Input\InputArgument;
use
Symfony\Component\Console\Input\InputInterface;
use
Symfony\Component\Console\Input\InputOption;
use
Symfony\Component\Console\Output\OutputInterface;

class
FilterCommand extends Command
{
    protected function
configure()
    {
       
$this
           
->setName('log:filter')
            ->
setDescription('Filter log entries')
            ->
addOption('date-from',null, InputOption::VALUE_REQUIRED,'date from (format Y-m-d h:i:s)',null)
            ->
addOption('levels', null, InputOption::VALUE_REQUIRED, 'levels', null)
            ->
addOption('with', null, InputOption::VALUE_REQUIRED, 'words contained', null)
        ;
    }

    protected function
execute(InputInterface $input, OutputInterface $output)
    {
       
$start = microtime(true);

       
$logger = new Logger();
       
$logFile = $logger->getLogFile();
        if(!
file_exists($logFile) || !is_readable($logFile)){
           
$output->writeln("Log file {$logFile} not found or not readable!");
        }else {
           
$words = $input->getOption('with');
           
/** @var string[] $words */
           
$words = $words ? explode(',', $words) : false;
           
/** @var string[] $levels */
           
$levels = $input->getOption('levels');
           
$levels = $levels ? explode(',', $levels) : false;
           
$date = $input->getOption('date-from');

           
$fHandler = fopen($logFile, 'r');
            if(!
$fHandler){
               
$output->writeln("Some error happened reading file {$logFile} !");
            }else {
                while (!
feof($fHandler)) {
                   
$buffer = fgets($fHandler, 4096);
                    if (
$data = $logger->decodeLine($buffer)) {
                       
$show = (!$date || ($data['date'] >= $date))
                            && (!
$words || $this->areAnyOfThisWords($words, $buffer))
                            && (!
$levels || in_array($data['level'], $levels));
                        if (
$show) {
                           
$output->write($buffer);
                        }
                    }
                }
               
fclose($fHandler);
            }
        }
      
       
$output->writeln('Done in '.intval((microtime(true)-$start)*1000).' msec !');
    }

   
/**
     * @param string[] $words
     * @param string $buffer
     * @return bool
     */
   
protected function areAnyOfThisWords($words, $buffer)
    {
        foreach(
$words as $word) {
            if (
preg_match('#\b' . preg_quote($word, '#') . '\b#i', $buffer)){
                return
true;
            }
        }

        return
false;
    }
}