Como imprimir um log de depuração?

129

Gostaria de depurar algum código PHP, mas acho que imprimir um log para tela ou arquivo é bom para mim.

Como devo imprimir um log no código PHP?

O usual print/ printfparece ir para a saída HTML, não para o console.

Eu tenho o servidor Apache executando o código PHP.

eugene
fonte
Seu script está sendo executado em um navegador da Web ou em um console (também conhecido como analisado usando php.exe em vez de apache / iis)?
Danielrsmith #
Você deve olhar para esta questão, tem um pouco de código de log útil: stackoverflow.com/questions/5769537/...
Ben
de que idioma você está vindo? Só para você PHP é muito diferente, em seguida, outras linguagens compiladas
Ibu
1
@lbu: na verdade .. eu não esperava, printfpergunta obteria isso muitas upvotes ...
Eugene
error_log ($ string);
Thewebus 08/08/19

Respostas:

186

Um truque menos conhecido é que o mod_php mapeia o stderr para o log do Apache. Além disso, existe um fluxo para isso, portanto, file_put_contents('php://stderr', print_r($foo, TRUE))será muito bom despejar o valor $foono log de erros do Apache.

chx
fonte
1
+ mencionado por mencionar que, você também pode definir o valor de error_log como 'php: // stdout' ao depurar um aplicativo de console e exibir as mensagens de erro diretamente no console, ou seja: error_log ("Você errou!", 3 , "php: // stdout");
21411 stefgosselin
4
+1 Levei muito tempo para encontrar esta resposta. Isso é tudo o que eu realmente estava procurando. Eu não conseguia descobrir como ver o que minha matriz continha (trabalhando no Drupal).
7274 SteveS
Eu também sugeriria usar em var_export($foo, true)vez de print_r($foo, true)se print_rnão fornecer as informações de tipo necessárias.
Ben
Não seria o mesmo que error_log (print_r ($ foo)); ?
Brunis
143
error_log(print_r($variable, TRUE)); 

pode ser útil

Olivier Berger
fonte
2
Infelizmente, esta é a solução mais conveniente. Xdebug é muito pesado para executá-lo o tempo todo. Votado para você
Phung D. Um
26

Você pode usar o error_log para enviar aos seus servidores o arquivo de log de erros (ou outro arquivo opcional, se desejar)

pthurlow
fonte
21

Se você estiver no Linux:

file_put_contents('your_log_file', 'your_content');

ou

error_log ('your_content', 3, 'your_log_file');

e depois no console

tail -f your_log_file

Isso mostrará continuamente a última linha colocada no arquivo.

user3029507
fonte
9

Você precisa mudar seu estado de espírito. Você está escrevendo PHP, e não o que mais você está acostumado a escrever. A depuração no PHP não é feita em um ambiente de console.

No PHP, você tem 3 categorias de soluções de depuração:

  1. Saída para uma página da web (consulte a biblioteca do dBug para obter uma visão melhor das coisas).
  2. Gravar em um arquivo de log
  3. Na sessão de depuração com xDebug

Aprenda a usá-los em vez de tentar fazer com que o PHP se comporte como qualquer outra linguagem com a qual você esteja acostumado.

Sylverdrag
fonte
31
Como quem gasta muito tempo escrevendo aplicativos de console e vários scripts que não são da web , discordo polidamente disso.
21411 stefgosselin
Eu trabalho muito mantendo e desenvolvendo aplicativos de console e, na minha má interpretação em inglês da pergunta, ele assumiu que ele estava procurando depurar um aplicativo de console. Xdebug é bom e muito útil embora eu gosto de informações de depuração bem no meu editor
stefgosselin
1
@Stefgosselin: O Netbeans faz praticamente o mesmo, embora o melhor que eu tenha visto com o xDebug tenha sido com o Aptana.
Sylverdrag
1
Eu uso o xDebug no Netbeans e funciona bem na maioria das vezes. Mas, há momentos em que você precisa registrar coisas em um arquivo.
A Cosan
experimente estes também ... você poderá fazer mais! stackoverflow.com/a/44050914/2053479
ganesh
5

Você está depurando no console? Existem várias opções para depuração do PHP. A função mais comum usada para depuração rápida e suja é var_dump .

Dito isto e fora do caminho, embora var_dump seja incrível e muitas pessoas façam tudo com isso, existem outras ferramentas e técnicas que podem apimentar um pouco.

Coisas para ajudar na depuração de uma página da Web, agrupe as <pre> </pre>tags em sua declaração de despejo para fornecer a formatação adequada em matrizes e objetos.

Ou seja:

<div> some html code ....
      <a href="<?php $tpl->link;?>">some link to test</a>
</div>

      dump $tpl like this:

    <pre><?php var_dump($tpl); ?></pre>

E, por último mas não menos importante, verifique se a depuração do tratamento de erros está configurada para exibir erros. Pode ser necessário adicionar isso na parte superior do seu script se você não puder acessar a configuração do servidor.

error_reporting(E_ALL);
ini_set('display_errors', '1');

Boa sorte!

stefgosselin
fonte
2

Se você não deseja integrar uma estrutura como o Zend , pode usar o método trigger_error para fazer logon no log de erros do php.

jopke
fonte
2

Simplesmente é o trigger_error:

 trigger_error("My error");

mas você não pode colocar matrizes ou objetos, portanto, use

var_dump
Danzan
fonte
trigger_error é provavelmente a melhor maneira de gravar nos seus logs de erros. Você agradecerá a si mesmo quando quiser modificar, digamos, as linhas de log com alguns dados personalizados posteriormente.
Anshul
2

Você também pode gravar em um arquivo como este:

$logFilePath = '../logs/debug.text';
ob_start();

// if you want to concatenate:
if (file_exists($logFilePath)) {
    include($logFilePath);
}
// for timestamp
$currentTime = date(DATE_RSS);

// echo log statement(s) here
echo "\n\n$currentTime - [log statement here]";

$logFile = fopen($logFilePath, 'w');
fwrite($logFile, ob_get_contents());
fclose($logFile);
ob_end_flush();

Verifique se as permissões adequadas estão definidas para que o php possa acessar e gravar no arquivo ( 775).

inorganik
fonte
1

Você pode usar o módulo php curl para fazer chamadas para http://liveoutput.com/ . Isso funciona muito bem em um ambiente corporativo seguro, onde existem certas restrições no php.ini que restringem o uso de file_put_contents.

Steve K
fonte
1

Esta é uma ótima ferramenta para depuração e registro de php: PHp Debugger & Logger

Funciona imediatamente com apenas 3 linhas de código. Ele pode enviar mensagens para o console js para depuração do ajax e pode substituir o manipulador de erros. Ele também despeja informações sobre variáveis ​​como var_dump () e print_r (), mas em um formato mais legível. Ferramenta muito boa!

Charlie
fonte
1

Eu usei muitos deles, mas como geralmente preciso depurar durante o desenvolvimento e como desenvolvo no host local, segui os conselhos de outras pessoas e agora escrevo no console de depuração JavaScript do navegador (consulte http: //www.codeforest. net / debugging-php-in-browsers-javascript-console ).

Isso significa que posso olhar para a página da web que meu PHP está gerando no meu navegador e pressionar F12 para mostrar / ocultar rapidamente qualquer rastreamento de depuração.

Como eu estou constantemente olhando as ferramentas de desenvolvedor para depurador, layout CSS, etc, faz sentido olhar para o meu loggon do PHP lá.

Se alguém nos decidir esse código, fiz uma pequena alteração. Depois de

function debug($name, $var = null, $type = LOG) {

Eu adicionei

$name = 'PHP: ' . $name;

Isso ocorre porque o PHP do meu servidor gera HTML compatível com JavaScript e acho útil distinguir entre saída do PHP e JS.

(Nota: no momento, estou atualizando isso para permitir ativar e desativar diferentes tipos de saída: do PHP, do JS e do acesso ao banco de dados)

Mawg diz que restabelece Monica
fonte
1

Eu uso o cakephp, então eu uso:

$this->log(YOUR_STRING_GOES_HERE, 'debug');
mmv_sat
fonte
0

Você pode usar:

<?php
echo '<script>console.log("debug log")</script>';
?>
steffanjj
fonte
2
isso tem muita sobrecarga. por que invocar o javascript para uma saída de erro simples?
clockw0rk
-8

Você pode usar

<?php
{
    AddLog("anypage.php","reason",ERR_ERROR);
}
?>

ou se você quiser imprimir essa declaração em um log, poderá usar

AddLog("anypage.php","string: ".$string,ERR_DEBUG_LOW);
Harsh
fonte
8
AddLog? Esta não é uma função nativa.
stefgosselin