如何打印调试日志?


129

我想调试一些PHP代码,但我想将日志打印到屏幕或文件对我来说很好。

我应该如何在PHP代码中打印日志?

通常print/ printf似乎去HTML输出而不是控制台。

我有Apache服务器执行PHP代码。


您的脚本是在Web浏览器中还是在控制台中运行(又称使用php.exe而不是apache / iis进行了解析)?
danielrsmith

你应该看看这个问题,有一点有用的日志代码:stackoverflow.com/questions/5769537/...

你是什​​么语言的?只是您的php与其他已编译的语言完全不同
伊布,

1
@lbu:的确如此。我没想到,printf问题会引起如此众多的投票……
eugene

error_log($ string);
Thewebus

Answers:


186

一个鲜为人知的技巧是mod_php将stderr映射到Apache日志。并且,有一个流,因此file_put_contents('php://stderr', print_r($foo, TRUE))可以很好地将的值转储$foo到Apache错误日志中。


1
+ 还要提到,顺便说一句,您还可以在调试控制台应用程序时将error_log的值设置为'php:// stdout',并使错误消息直接出现在控制台上,即:error_log(“ You messed up!”,3 ,“ php:// stdout”);
stefgosselin 2011年

4
+1我花了很长时间才找到这个答案。这就是我真正想要的。我不知道如何查看数组包含的内容(在Drupal中工作)。
2014年

我也建议使用var_export($foo, true),而不是print_r($foo, true)如果print_r没有得到你所需要的类型信息。

不会和error_log(print_r($ foo))一样吗??
布鲁尼斯'18


26

您可以使用error_log将错误日志文件(如果需要,也可以选择其他文件)发送到服务器。


21

如果您使用的是Linux:

file_put_contents('your_log_file', 'your_content');

要么

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

然后在控制台中

tail -f your_log_file

这将连续显示文件中的最后一行。


9

您需要改变心态。您正在编写PHP,而不是用来编写PHP的其他任何东西。在控制台环境中无法在PHP中进行调试。

在PHP中,您有3类调试解决方案:

  1. 输出到网页(有关详细信息,请参见dBug库)。
  2. 写入日志文件
  3. 使用xDebug进行会话调试

学习使用这些语言,而不是尝试使PHP的行为像您习惯的其他语言一样。


31
作为一个花费大量时间编写控制台应用程序和各种非Web脚本的人,我会对此表示反对。
stefgosselin 2011年

我确实做了很多维护和开发控制台应用程序的工作,而我对此问题的英文不好的解释是假设他想调试控制台应用程序。Xdebug很好并且非常方便,尽管我确实喜欢在编辑器中
stefgosselin 2011年

1
@Stefgosselin:尽管我在xDebug中看到的最好的是与Aptana,但Netbeans的功能几乎相同。
西尔维德拉格(Sylverdrag)2011年

1
我在Netbeans上使用xDebug,并且在大多数情况下都能正常工作。但是,有时您需要在文件中记录内容。
cosan

也可以尝试这些。您将可以做更多的事情!stackoverflow.com/a/44050914/2053479
ganesh

5

您在控制台上调试吗?有多种调试PHP的选项。用于快速且肮脏的调试的最常用功能是var_dump

话虽这么说,但尽管var_dump很棒,而且很多人都这样做,但是还有其他工具和技术可以使它变得更有趣。

如果要在网页中进行调试,可以帮助解决的事情是,<pre> </pre>在转储语句周围包装 标签,以便为数组和对象设置正确的格式。

即:

<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>

最后,但并非最不重要的一点是,请确保是否将调试错误处理设置为显示错误。如果您无法访问服务器配置,则可能需要在脚本顶部添加它。

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

祝好运!



2

简单的方法是trigger_error:

 trigger_error("My error");

但您不能放置数组或对象,因此使用

var_dump

trigger_error可能是写入错误日志的最佳方法。当您以后要修改带有某些自定义数据的日志行时,将感谢您。
2012年

2

您也可以这样写文件:

$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();

确保设置了正确的权限,以便php可以访问和写入文件(775)。



1

这是调试和记录php的好工具:PHp调试器和记录器

它仅需3行代码即可直接使用。它可以将消息发送到js控制台进行ajax调试,并可以替换错误处理程序。它还以更易读的格式转储有关变量的信息,如var_dump()和print_r()。很好的工具!


1

我已经使用了许多方法,但是由于在开发时通常需要进行调试,并且由于我是在localhost上进行开发,因此我遵循了其他人的建议,现在将其写入浏览器的JavaScript调试控制台(请参见http://www.codeforest。 net / debugging-php-in-browsers-javascript-console)。

这意味着我可以在浏览器中查看PHP生成的网页,然后按F12键快速显示/隐藏任何调试跟踪。

由于我一直在寻找调试器,CSS布局等开发人员工具,因此在这里查看我的PHP loggon是有意义的。

如果有人决定向我们提供该代码,则我做了一个小的更改。后

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

我加了

$name = 'PHP: ' . $name;

这是因为我的服务器端PHP生成了包含JavaScript的HTML,我发现区分PHP和JS的输出非常有用。

(注意:我目前正在对此进行更新,以允许我打开和关闭不同的输出类型:从PHP,从JS和数据库访问)


1

我使用cakephp,所以我使用:

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

0

您可以使用:

<?php
echo '<script>console.log("debug log")</script>';
?>

2
这有很多开销。为什么调用javascript进行简单的错误输出?
clockw0rk

-8

您可以使用

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

或者,如果您想在日志中打印该语句,则可以使用

AddLog("anypage.php","string: ".$string,ERR_DEBUG_LOW);

8
AddLog?这不是本机功能。
stefgosselin 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.