Tutoriais

Content Security Policy

Se o seu site usa Content Security Policy, você precisará adicionar o mesmo 'nonce-<value>' e 'strict-dynamic' ao script-src para que o Tracy funcione corretamente. Alguns add-ons de terceiros podem exigir configurações adicionais. Nonce não é suportado na diretiva style-src; se você usar esta diretiva, deverá adicionar 'unsafe-inline', mas deve evitar isso no modo de produção.

Exemplo de configuração para o Nette Framework:

http:
	csp:
		script-src: [nonce, strict-dynamic]

Exemplo em PHP puro:

$nonce = base64_encode(random_bytes(20));
header("Content-Security-Policy: script-src 'nonce-$nonce' 'strict-dynamic';");

Carregamento mais rápido

A inicialização é direta, mas se você tiver scripts de bloqueio de carregamento lento em sua página da web, eles podem retardar o carregamento do Tracy. A solução é colocar <?php Tracy\Debugger::renderLoader() ?> em seu template antes de todos os scripts:

<!DOCTYPE html>
<html>
<head>
	<title>...<title>
	<?php Tracy\Debugger::renderLoader() ?>
	<link rel="stylesheet" href="assets/style.css">
	<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
</head>

Depuração de requisições AJAX

O Tracy captura automaticamente requisições AJAX criadas usando jQuery ou a API nativa fetch. As requisições são exibidas na barra do Tracy como linhas adicionais, permitindo uma depuração AJAX fácil e conveniente.

Se você não quiser capturar requisições AJAX automaticamente, pode desativar este recurso definindo uma variável JavaScript:

window.TracyAutoRefresh = false;

Para monitorar manualmente requisições AJAX específicas, adicione o cabeçalho HTTP X-Tracy-Ajax com o valor retornado por Tracy.getAjaxHeader(). Aqui está um exemplo de uso com a função fetch:

fetch(url, {
    headers: {
        'X-Requested-With': 'XMLHttpRequest',
        'X-Tracy-Ajax': Tracy.getAjaxHeader(),
    }
})

Esta abordagem permite a depuração seletiva de requisições AJAX.

Armazenamento de dados

O Tracy pode exibir painéis na barra do Tracy e Bluescreens para requisições AJAX e redirecionamentos. O Tracy cria sua própria sessão, armazena dados em seus próprios arquivos temporários e usa o cookie tracy-session.

O Tracy também pode ser configurado para usar a sessão nativa do PHP, que iniciamos antes de ativar o Tracy:

session_start();
Debugger::setSessionStorage(new Tracy\NativeSession);
Debugger::enable();

Caso o início da sessão exija uma inicialização mais complexa, você pode iniciar o Tracy imediatamente (para que ele possa processar quaisquer erros que ocorram), depois inicializar o manipulador de sessão e, finalmente, informar ao Tracy que a sessão está pronta para uso usando a função dispatch():

Debugger::setSessionStorage(new Tracy\NativeSession);
Debugger::enable();

// segue a inicialização da sessão
// e o início da sessão
session_start();

Debugger::dispatch();

A função setSessionStorage() existe desde a versão 2.9; antes disso, o Tracy sempre usava a sessão nativa do PHP.

Scrubber personalizado

Scrubber é um filtro que impede o vazamento de dados sensíveis durante o dumping, como senhas ou credenciais de acesso. O filtro é chamado para cada elemento do array ou objeto dumpado e retorna true se o valor for sensível. Nesse caso, ***** é exibido em vez do valor.

// impede a exibição de valores de chaves e propriedades como `password`,
// `password_repeat`, `check_password`, `DATABASE_PASSWORD`, etc.
$scrubber = function(string $key, $value, ?string $class): bool
{
	return preg_match('#password#i', $key) && $value !== null;
};

// nós o usamos para todos os dumps dentro do BlueScreen
Tracy\Debugger::getBlueScreen()->scrubber = $scrubber;

Logger personalizado

Podemos criar nosso próprio logger que registrará erros, exceções não capturadas e também será invocado pelo método Tracy\Debugger::log(). O logger implementa a interface Tracy\ILogger.

use Tracy\ILogger;

class SlackLogger implements ILogger
{
	public function log($value, $priority = ILogger::INFO)
	{
		// envia uma requisição para o Slack
	}
}

E então o ativamos:

Tracy\Debugger::setLogger(new SlackLogger);

Se estivermos usando o Nette Framework completo, você pode defini-lo no arquivo de configuração NEON:

services:
	tracy.logger: SlackLogger

Integração do Monolog

O pacote Tracy fornece um adaptador PSR-3 que permite a integração com monolog/monolog.

$monolog = new Monolog\Logger('main-channel');
$monolog->pushHandler(new Monolog\Handler\StreamHandler($logFilePath, Monolog\Logger::DEBUG));

$tracyLogger = new Tracy\Bridges\Psr\PsrToTracyLoggerAdapter($monolog);
Debugger::setLogger($tracyLogger);
Debugger::enable();

Debugger::log('info'); // escreve: [<TIMESTAMP>] main-channel.INFO: info [] []
Debugger::log('warning', Debugger::WARNING); // escreve: [<TIMESTAMP>] main-channel.WARNING: warning [] []

nginx

Se o Tracy não estiver funcionando em um servidor nginx, provavelmente ele está mal configurado. Se houver algo como isto na configuração:

try_files $uri $uri/ /index.php;

altere para:

try_files $uri $uri/ /index.php$is_args$args;