27/03/2016 - SYMFONY
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.
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
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);
}
}
services:
application_search.controller.search:
class: Application\SearchBundle\Controller\SearchController
arguments:
- @logger
- @monolog.logger.search
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;
}
}
services:
application_search.formatter.search:
class: Application\SearchBundle\Util\SearchFormatter
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"
}
}
[
]
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"
}
}