Zaman gelecek bazı şeyleri kendi isteğinize uygun şekilde kayıt altına almak isteyeceksiniz. Aşağıdaki örnekte kişiselleştirilmiş channel, handler ve formatter yaratılıp, kayıt tutmak için kullanılacak. Örneğimiz tam olarak bir arama işleminin ne kadar zaman aldığına dair bilginin yanı sıra, bir takım faydalı bilgileri kayıt altına alacak.


Config.yml


monolog:
channels: [search] # Custom channel
handlers:
search: # Custom handler
type: stream
path: %kernel.logs_dir%/search_%kernel.environment%.log # Custom log file
channels: [search] # Custom channel
formatter: application_search.formatter.search # Custom formatter

SearchController


Kayıt işleminin ait olduğu yer bura değil ama, yazıyı kısa tutmak için bu seferlik burada yapıyorum.


namespace Application\SearchBundle\Controller;

use Psr\Log\LoggerInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

/**
* @Route("/search", service="application_search.controller.search")
*/
class SearchController extends Controller
{
private $nativeLogger;
private $searchLogger;

public function __construct(
LoggerInterface $nativeLogger,
LoggerInterface $searchLogger
) {
$this->nativeLogger = $nativeLogger;
$this->searchLogger = $searchLogger;
}

/**
* @param Request $request
*
* @Method({"GET"})
* @Route("")
*
* @return Response
*/
public function indexAction(Request $request)
{
$seconds = [1, 2, 3];

$start = microtime(true);
sleep($seconds[array_rand($seconds)]); // Pretend like you did a search and it took 1, 2 or 3 seconds
$end = microtime(true);

$data = [
'start_microseconds' => $start,
'end_microseconds' => $end,
'query_string' => [
'field' => $request->query->get('field', 'name'),
'keyword' => $request->query->get('keyword', 'inanzzz')
]
];

if ($request->query->get('logger', 'native') == 'native') {
$this->nativeLogger($data);
} else {
$this->customLogger($data);
}

return new Response('All logged!');
}

/**
* @param array $data
*/
private function nativeLogger(array $data)
{
$this->nativeLogger->info('Native Search Logger', $data);
}

/**
* @param array $data
*/
private function customLogger(array $data)
{
$this->searchLogger->info('Custom Search Logger', $data);
}
}

Controllers.yml


services:
application_search.controller.search:
class: Application\SearchBundle\Controller\SearchController
arguments:
- @logger
- @monolog.logger.search

SearchFormatter


Eğer isterseniz, "session" gibi servisleri bu classa enjekte edip, daha fazla bilginin kayıt altına alınmasını da sağlayabilirsiniz.


namespace Application\SearchBundle\Util;

use Monolog\Formatter\FormatterInterface;

class SearchFormatter implements FormatterInterface
{
public function format(array $record)
{
$start = $record['context']['start_microseconds'];
$end = $record['context']['end_microseconds'];

return json_encode([
'message' => $record['message'],
'timestamp' => date(DATE_ISO8601),
'elapsed_milliseconds' => round(($end-$start) * 1000),
'query_string' => $record['context']['query_string']
]).PHP_EOL;
}

public function formatBatch(array $records)
{
foreach ($records as $key => $record) {
$records[$key] = $this->format($record);
}

return $records;
}
}

Utils.yml


services:
application_search.formatter.search:
class: Application\SearchBundle\Util\SearchFormatter

Testler


Sistem logger


Eğer GET /app_dev.php/search?logger=native&field=title&keyword=inanzzz adresine giderseniz, "app/log/dev.log" log dosyasında aşağıdaki kaydı göreceksiniz.


# Original version
[2016-03-27 19:39:57] app.INFO: Native Search Logger {"start_microseconds":1459103996.8535,"end_microseconds":1459103997.8542,"query_string":{"field":"title","keyword":"inanzzz"}} []

# Beautified version
[
2016-03-2719: 39: 57
]
app.INFO: NativeSearchLogger{
"start_microseconds": 1459103996.8535,
"end_microseconds": 1459103997.8542,
"query_string": {
"field": "title",
"keyword": "inanzzz"
}
}
[
]

Kişiselleştirilmiş logger


Eğer GET /app_dev.php/search?logger=custom&field=title&keyword=inanzzz adresine giderseniz, "app/log/search_dev.log" log dosyasında aşağıdaki kaydı göreceksiniz.


# Original version
{"message":"Custom Search Logger","timestamp":"2016-03-27T19:41:50+0100","elapsed_milliseconds":2001,"query_string":{"field":"title","keyword":"inanzzz"}}

# Beautified version
{
"message": "Custom Search Logger",
"timestamp": "2016-03-27T19:41:50+0100",
"elapsed_milliseconds": 2001,
"query_string": {
"field": "title",
"keyword": "inanzzz"
}
}