Skip to content
Switch branches/tags

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time

Simple logger for PHP applications.

Start logging with zero configuration. By default, the logger works as a static singleton - Log::error("You can't do that"); is all you need to get started. When you need to, you can configure the logger to send logs to different file/socket sources.

The aim of this library is minimalism. There are no plans to implement more logging sources than files and sockets. This simplifies the code into having a single responsibility, but remains modular to hook up to external scripts that handle logging to email addresses, Slack messages, AWS SQS, databases, etc.

Log levels

This library implements the PSR-3 interface. This means that throughout your code, you can decide to log at the levels listed below, and your environment can decide the minimum log level to report. For instance, it would probably be too verbose to log debug information on a production server. This is consistent with the Syslog protocol.

  • debug - Detailed debugging information.
  • info - Interesting events.
  • notice - Normal, but significant events.
  • warning - Exceptional occurrences that are not errors.
  • error - Runtime errors that do not require immediate action but should typically be logged and monitored.
  • critical - Critical conditions.
  • alert - Action must be taken immediately.
  • emergency - System is unusable.

Static usage

Static classes should only be used when truly stateless. Logging is one example of a class that has no side effects on the running program, so the primary usage expectation is to use static methods of the Log class to perform logging.

It would be unnecessary to require passing an instance of the Log class around throughout all classes of your program, and it would be too opinionated to require the use of a dependency injection framework everywhere that logging is possible.

However, certain programs require advanced logging features that are only satisfiable with instances of the Log class, such as having different log sources for different areas of the program. Take a look at the examples directory to see how instantiation can be used for this purpose.

Usage example

use Gt\Logger\Log;
use Gt\Logger\LogConfig;
use Gt\Logger\LogLevel;
use Gt\Logger\LogHandler\StreamHandler;
use Gt\Logger\LogHandler\FileHandler;

// Send warnings and above to the remote socket.
LogConfig::addHandler(new StreamHandler("/example/remote.sock"), LogLevel::WARNING);
// Send all log types to the local log file.
LogConfig::addHandler(new FileHandler("/var/log/example.log"), LogLevel::DEBUG);

$fileName = "name.txt";
if(file_exists($fileName)) {
        $name = trim(file_get_contents($fileName));
        if(empty($name)) {
                Log::error("Empty name loaded");        
        else {
                Log::info("Loaded name: $name");
else {
        $name = "you";
        Log::info("Using default name");