Skip to content
Leo edited this page Oct 16, 2025 · 2 revisions

Installation

Package

composer require monolog/monolog

Include in code

<?php

echo "Let's do some logging!";

use Monolog\Logger;
use Monolog\Handler\StreamHandler;

require '../vendor/autoload.php';

// Create a logger instance
$log = new Logger('app');

// Add a handler (write logs to app.log)
$log->pushHandler(new StreamHandler(__DIR__ . '/app.log', Logger::DEBUG));

// Log messages
$log->info('User logged in', ['username' => 'johnny']);
$log->warning('Low disk space');
$log->error('Could not connect to database');

?>

Read logs

  1. Go into directory of the PHP file doing the logging
  2. Open "app.log" file

Log levels

The log levels

Constant Level Name Numeric Value Meaning
Logger::DEBUG Debug 100 Detailed debug info
Logger::INFO Info 200 General info
Logger::NOTICE Notice 250 Normal but significant
Logger::WARNING Warning 300 Something unexpected
Logger::ERROR Error 400 Runtime error
Logger::CRITICAL Critical 500 Serious issue
Logger::ALERT Alert 550 Requires immediate action
Logger::EMERGENCY Emergency 600 System unusable

Which levels you're logging

$log->pushHandler(new StreamHandler(__DIR__ . '/app.log', Logger::DEBUG));

The parameter Logger::DEBUG defines the minimum logging level.

DEBUG means "log everything".

How to define which levels log effectively log

$level = ($_ENV['APP_ENV'] ?? 'prod') === 'dev' ? Logger::DEBUG : Logger::WARNING;
$log->pushHandler(new StreamHandler(__DIR__ . '/app.log', $level));

Create .env file in project root

For DEV:

APP_ENV=dev
LOG_PATH=app.log

For PROD:

APP_ENV=prod
LOG_PATH=/var/log/myapp/app.log

Install dependencies

composer require monolog/monolog vlucas/phpdotenv

or just (if you already have monolog installed):

composer require vlucas/phpdotenv

See more https://github.com/vlucas/phpdotenv

Use environment variable in code to set level

<?php
require __DIR__ . '/vendor/autoload.php';

use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Dotenv\Dotenv;

// Load environment variables
$dotenv = Dotenv::createImmutable(__DIR__);
$dotenv->load();

// Read environment variables (with defaults)
$appEnv = $_ENV['APP_ENV'] ?? 'prod';
$logPath = $_ENV['LOG_PATH'] ?? __DIR__ . '/app.log';

// Choose log level based on environment
$logLevel = ($appEnv === 'dev') ? Logger::DEBUG : Logger::WARNING;

// Create logger
$log = new Logger('myapp');
$log->pushHandler(new StreamHandler($logPath, $logLevel));

// Test logging
$log->debug('Debug: development details');
$log->info('Info: something happened');
$log->warning('Warning: potential issue');
$log->error('Error: something failed');

// Output for testing
echo "App environment: $appEnv\n";
echo "Logging to: $logPath\n";
echo "Minimum log level: " . Logger::getLevelName($logLevel) . "\n";

This solution only differentiates between two logging options:

  1. dev = all
  2. prod = WARNING and upwards
Clone this wiki locally