Getting Started with Tracy
Tracy library is a useful helper for everyday PHP programmers. It helps you to:
- quickly detect and correct errors
- log errors
- dump variables
- measure execution time of scripts/queries
- see memory consumption
PHP is a perfect language for making hardly detectable errors because it gives great flexibility to programmers. Tracy\Debugger is more valuable because of that. It is an ultimate tool among the diagnostic ones. If you are meeting Tracy for the first time, believe me, your life starts to be divided into one before the Tracy and the one with her. Welcome to the good part!
Installation and Requirements
The best way how to install Tracy is to download the latest package or use Composer:
composer require tracy/tracy
Alternatively, you can download the whole package or tracy.phar file.
Usage
Activating Tracy is easy. Simply add these two lines of code, preferably just after library loading (like
require 'vendor/autoload.php'
) and before any output is sent to browser:
use Tracy\Debugger;
Debugger::enable();
The first thing you will notice on the website is a Tracy Bar.
(If you do not see anything, it means that Tracy is running in production mode. For security reasons, Tracy is visible only on
localhost. You may force Tracy to run in development mode by passing the Debugger::Development
as the first parameter
of enable()
method.)
The enable()
involves changing the error reporting level to E_ALL.
Tracy Bar
The Tracy Bar is a floating panel. It is displayed in the bottom right corner of a page. You can move it using the mouse. It will remember its position after the page reloading.
You can add other useful panels to the Tracy Bar. You can find interesting ones in addons or you can create your own.
If you do not want to show Tracy Bar, set:
Debugger::$showBar = false;
Visualization of Errors and Exceptions
Surely, you know how PHP reports errors: there is something like this in the page source code:
Parse error: syntax error, unexpected '}' in HomePresenter.php on line 15
or uncaught exception:
Fatal error: Uncaught Nette\MemberAccessException: Call to undefined method Nette\Application\UI\Form::addTest()? in /sandbox/vendor/nette/utils/src/Utils/ObjectMixin.php:100 Stack trace: #0 /sandbox/vendor/nette/utils/src/Utils/Object.php(75): Nette\Utils\ObjectMixin::call(Object(Nette\Application\UI\Form), 'addTest', Array) #1 /sandbox/app/forms/SignFormFactory.php(32): Nette\Object->__call('addTest', Array) #2 /sandbox/app/presenters/SignPresenter.php(21): App\Forms\SignFormFactory->create() #3 /sandbox/vendor/nette/component-model/src/ComponentModel/Container.php(181): App\Presenters\SignPresenter->createComponentSignInForm('signInForm') #4 /sandbox/vendor/nette/component-model/src/ComponentModel/Container.php(139): Nette\ComponentModel\Container->createComponent('signInForm') #5 /sandbox/temp/cache/latte/15206b353f351f6bfca2c36cc.php(17): Nette\ComponentModel\Co in /sandbox/vendor/nette/utils/src/Utils/ObjectMixin.php on line 100
It is not so easy to navigate through this output. If you enable Tracy, both errors and exceptions are displayed in a completely different form:

The error message literally screams. You can see a part of the source code with the highlighted line where the error occurred. A message clearly explains an error. The entire site is interactive, try it.
And you know what? Fatal errors are captured and displayed in the same way. No need to install any extension (click for live example):

Errors like a typo in a variable name or an attempt to open a nonexistent file generate reports of E_NOTICE or E_WARNING level. These can be easily overlooked and/or can be completely hidden in a web page graphic layout. Let Tracy manage them:
Or they may be displayed like errors:
Debugger::$strictMode = true; // display all errors
Debugger::$strictMode = E_ALL & ~E_DEPRECATED & ~E_USER_DEPRECATED; // all errors except deprecated notices

In order to detect misspellings when assigning to an object, we use trait Nette\SmartObject.
Production Mode and Error Logging
As you can see, Tracy is quite eloquent. It is appreciated in a development environment, but on a production server, it would cause a disaster. Any debugging information cannot be listed there. Therefore Tracy has an environment autodetection and logging functionality. Instead of showing herself, Tracy stores information into a log file and shows the visitor a user-comprehensible server error message:

Production output mode suppresses all debugging information which is sent out via dump(), and of course all error messages generated by PHP. So, even if you forget
dump($obj)
in the source code, you do not have to worry about it on your production server. Nothing will
be seen.
The output mode is set by the first parameter of Debugger::enable()
. You can specify either a constant
Debugger::Production
or Debugger::Development
. Other option is to set it up in a way, that development
mode will be on when the application is accessed from a defined IP address with a defined value of tracy-debug
cookie. The syntax used to achieve this is cookie-value@ip-address
.
If it is not specified, the default value Debugger::Detect
is used. In this case, the system detects a server by
IP address. The production mode is chosen if an application is accessed via a public IP address. A local IP address leads to
development mode. It is not necessary to set the mode in most cases. The mode is correctly recognized when you are launching the
application on your local server or in production.
In the production mode, Tracy automatically captures all errors and exceptions into a text log. Unless you specify otherwise, it will be stored in log/error.log. This error logging is extremely useful. Imagine, that all users of your application are actually betatesters. They are doing cutting-edge work for free when hunting bugs and you would be silly if you threw away their valuable reports to a recycle bin unnoticed.
If you need to log your own messages or caught exceptions, use the method log()
:
Debugger::log('Unexpected error'); // text message
try {
criticalOperation();
} catch (Exception $e) {
Debugger::log($e); // log exception
// or
Debugger::log($e, Debugger::ERROR); // also sends an email notification
}
A directory for errors logging can be set by the second parameter of the enable() method:
Debugger::enable(Debugger::Detect, __DIR__ . '/mylog');
If you want Tracy to log PHP errors like E_NOTICE
or E_WARNING
with detailed information (HTML
report), set Debugger::$logSeverity
:
Debugger::$logSeverity = E_NOTICE | E_WARNING;
For a real professional the error log is a crucial source of information and he or she wants to be notified about any new error immediately. Tracy helps him. She is capable of sending an email for every new error record. The variable $email identifies where to send these e-mails:
Debugger::$email = 'admin@example.com';
If you use the entire Nette Framework, you can set this and others in the configuration file.
To protect your e-mail box from flood, Tracy sends only one message and creates a file email-sent
. When a
developer receives the e-mail notification, he checks the log, corrects his application and deletes the email-sent
monitoring file. This activates the e-mail sending again.
Opening Files in the Editor
When the error page is displayed, you can click on file names and they will open in your editor with the cursor on the
corresponding line. Files can also be created (action create file
) or bug fixed in them (action fix it
).
In order to do this, you need to configure the browser and the
system.
Supported PHP Versions
Tracy | compatible with PHP |
---|---|
Tracy 2.10 – 3.0 | PHP 8.0 – 8.2 |
Tracy 2.9 | PHP 7.2 – 8.2 |
Tracy 2.8 | PHP 7.2 – 8.1 |
Tracy 2.6 – 2.7 | PHP 7.1 – 8.0 |
Tracy 2.5 | PHP 5.4 – 7.4 |
Tracy 2.4 | PHP 5.4 – 7.2 |
Applies to the latest patch versions.
Ports
This is a list of unofficial ports to other frameworks and CMS:
- Drupal 7
- Laravel framework: recca0120/laravel-tracy, whipsterCZ/laravel-tracy
- OpenCart
- ProcessWire CMS/CMF
- Slim Framework
- Symfony framework: kutny/tracy-bundle, VasekPurchart/Tracy-Blue-Screen-Bundle
- Wordpress