PHP code example of uengage.io / php-logger

1. Go to this page and download the library: Download uengage.io/php-logger library. Choose the download type require.

2. Extract the ZIP file and open the index.php.

3. Add this code to the index.php.
    
        
<?php
require_once('vendor/autoload.php');

/* Start to develop here. Best regards https://php-download.com/ */

    

uengage.io / php-logger example snippets



use Uengage\Logger\Logger;

$logger = new Logger([
    'product'     => 'edge',
    'service'     => 'ordering',
    'component'   => 'api-server',
    'version'     => '1.4.2',
    'environment' => 'production',
    'source'      => 'server',
    'transport'   => ['type' => 'file'],
    // basePath defaults to /var/log/uengage/
    // log written to: /var/log/uengage/application/edge.log
]);

$logger->warn('Order placed', [
    'context' => ['order_id' => 'ord_8x2k', 'amount' => 450.00],
    'tenant'  => ['business_id' => '456', 'parent_id' => '123'],
    'user_id' => 'usr_7x9k2m',
]);


use Uengage\Logger\Logger;

$logger = new Logger([
    'product'     => 'edge',
    'service'     => 'ordering',
    'component'   => 'mobile-app',
    'version'     => '3.0.0',
    'environment' => 'production',
    'source'      => 'client',
    'transport'   => ['type' => 'http', 'config' => [
        'apiKey'    => 'your-api-key-here',
        'batchSize' => 5,
    ]],
]);

$logger->error('Payment webhook timeout', [
    'error'   => ['code' => 'PAYMENT_WEBHOOK_TIMEOUT', 'category' => 'engineering', 'upstream' => 'razorpay'],
    'context' => ['order_id' => 'ord_8x2k', 'latency_ms' => 30012],
    'tenant'  => ['business_id' => '456', 'parent_id' => '123'],
]);

$logger = new Logger([
    'product' => 'edge', 'service' => 'ordering', 'component' => 'worker',
    'version' => '1.0.0', 'environment' => 'production', 'source' => 'server',
    'transport' => ['type' => 'stdout'],
]);

$logger = new Logger($config);

[
    // ── Required ────────────────────────────────────────────────────────
    'product'     => string,   // e.g. 'edge'
    'service'     => string,   // e.g. 'ordering'
    'component'   => string,   // e.g. 'mobile-app'
    'version'     => string,   // e.g. '1.4.2'
    'environment' => string,   // 'production' | 'staging' | 'development'
    'source'      => string,   // 'server' | 'client'
    'transport'   => [
        'type'   => string,    // Required. 'file' | 'http' | 'stdout'
        'config' => [],        // Optional. All fields have defaults - see sections below.
    ],

    // ── Optional ────────────────────────────────────────────────────────
    'minLevel' => string,      // 'debug' | 'info' | 'warn' | 'error'. Default: 'warn'
]

'transport' => [
    'type'   => 'file',
    'config' => [
        'basePath'         => '/var/log/uengage',  // Default: /var/log/uengage/
        'maxFileSizeBytes' => 10 * 1024 * 1024,    // Default: 10 MB
        'maxRotations'     => 5,                   // Default: 5
    ],
],

'transport' => [
    'type'   => 'http',
    'config' => [
        'endpoint'        => 'https://observability.platform.uengage.in/logs',  // Default
        'apiKey'          => 'your-api-key',   // Optional. Sent as x-api-key header.
        'batchSize'       => 5,                // Default: 5
        'flushIntervalMs' => 5000,             // Accepted for config parity; no-op in PHP
        'timeoutMs'       => 5000,             // Default: 5000 ms
    ],
],

'transport' => ['type' => 'stdout'],

$logger->info ($message, $options = [])
$logger->error($message, $options = [])
$logger->debug($message, $options = [])
$logger->warn ($message, $options = [])

[
    'trace_id' => string,   // UUID for distributed tracing. Auto-generated if not provided.
    'user_id'  => string,   // Omitted from the entry when not provided.

    'tenant' => [
        'business_id' => string,
        'parent_id'   => string,
    ],

    'error' => [
        'code'      => string,   // Machine-readable error code
        'category'  => string,   // 'business' | 'engineering'
        'stack'     => string,   // Stack trace string
        'upstream'  => string,   // External service that caused the error
    ],
    // Include for error and warn events. Omitted when not provided.

    'context' => [...],   // Arbitrary key-value pairs. Deep-cloned at log time. Omitted when not provided.
]

$logger = new Logger([..., 'minLevel' => 'warn']);

register_shutdown_function(function () use ($logger) {
    $logger->destroy();
});





class My_controller extends CI_Controller
{
    public function __construct()
    {
        parent::__construct();
        $this->load->library('logger_service');
    }
}

// error
$this->logger_service->get('order-service')->error('Payment failed', [
    'error'   => ['code' => 'PAYMENT_GATEWAY_TIMEOUT', 'category' => 'engineering'],
    'tenant'  => ['business_id' => (string) $businessId, 'parent_id' => '0'],
    'context' => ['order_id' => $orderId],
]);

// warn
$this->logger_service->get('order-service')->warn('Retry attempt', [
    'context' => ['attempt' => 2],
]);

$CI =& get_instance();
$CI->logger_service->get('cart-service')->info('Item added', ['context' => ['sku' => $sku]]);

$level = $isCritical ? 'error' : 'warn';
$this->logger_service->get('feed-service')->$level('Feed validation failed', $ctx);

// application/config/config.php
$config['enable_hooks'] = TRUE;

// application/config/hooks.php
$hook['post_system'][] = [
    'function' => [$logger, 'destroy'],
    'filename' => '',
    'filepath' => '',
];

register_shutdown_function([$this->logger, 'destroy']);


namespace Config;

use Uengage\Logger\Logger;
use CodeIgniter\Config\BaseService;

class Services extends BaseService
{
    public static function uengageLogger(bool $getShared = true): Logger
    {
        if ($getShared) {
            return static::getSharedInstance('uengageLogger');
        }
        return new Logger([
            'product'     => 'edge',
            'service'     => 'ordering',
            'component'   => 'api-server',
            'version'     => '1.0.0',
            'environment' => ENVIRONMENT,   // 'production' | 'testing' | 'development'
            'source'      => 'server',
            'transport'   => ['type' => 'file'],
        ]);
    }
}

service('uengageLogger')->warn('Order placed', [
    'tenant'  => ['business_id' => '456', 'parent_id' => '123'],
    'context' => ['order_id' => 'ord_8x2k', 'amount' => 450.00],
]);

service('uengageLogger')->error('Payment failed', [
    'error'   => ['code' => 'PAYMENT_GATEWAY_TIMEOUT', 'category' => 'engineering', 'upstream' => 'razorpay'],
    'context' => ['order_id' => $orderId],
]);

// app/Filters/LoggerShutdown.php
class LoggerShutdown implements FilterInterface
{
    public function after(RequestInterface $request, ResponseInterface $response, $arguments = null)
    {
        service('uengageLogger')->destroy();
    }
}

$logger->warn('Order placed', [
    'trace_id' => $_SERVER['HTTP_X_TRACE_ID'] ?? null,
    'user_id'  => $user->id,
    'tenant'   => ['business_id' => '456', 'parent_id' => '123'],
    'context'  => ['order_id' => 'ord_8x2k', 'amount' => 450.00, 'items' => 3],
]);

try {
    $razorpay->capturePayment($payload);
} catch (Exception $e) {
    $logger->error('Payment webhook timeout', [
        'trace_id' => $_SERVER['HTTP_X_TRACE_ID'] ?? null,
        'user_id'  => $user->id,
        'tenant'   => ['business_id' => '456', 'parent_id' => '123'],
        'error'    => [
            'code'     => 'PAYMENT_WEBHOOK_TIMEOUT',
            'category' => 'engineering',
            'stack'    => $e->getTraceAsString(),
            'upstream' => 'razorpay',
        ],
        'context'  => ['order_id' => 'ord_8x2k', 'amount' => 450.00, 'latency_ms' => 30012],
    ]);
}

$logger->warn('Rate limit approaching', [
    'tenant'  => ['business_id' => '456', 'parent_id' => '123'],
    'error'   => ['code' => 'RATE_LIMIT_NEAR_THRESHOLD', 'category' => 'engineering'],
    'context' => [
        'endpoint'           => '/v1/orders',
        'requests_remaining' => 12,
        'window_resets_at'   => '2026-04-07T15:00:00Z',
    ],
]);

$logger->debug('DB query executed', [
    'context' => ['table' => 'orders', 'duration_ms' => 45, 'rows_returned' => 1],
]);

Logger
  ├── _validateConfig()     validates plies minLevel gate
  │     ├── strtoupper($level)
  │     ├── _generateUuid()                              auto trace_id when not supplied
  │     └── json_decode(json_encode(...), true)          deep-clones context/error/tenant
  └── _transporter->send($entry)
        ├── FileTransporter
        │     ├── path: {basePath}/application/{product}.log   (dir auto-created)
        │     └── file_put_contents(..., FILE_APPEND | LOCK_EX)
        │           └── _rotate() when file exceeds maxFileSizeBytes
        ├── HttpTransporter
        │     ├── immediate (batchSize=1): _post([$entry])   one cURL POST per call
        │     └── batching  (batchSize>1): queue → _flush()
        │           triggered by batchSize threshold or destroy()
        └── StdoutTransporter
              └── fwrite($handle, json_encode($entry) . PHP_EOL)