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)