PHP code example of thingston / psr3

1. Go to this page and download the library: Download thingston/psr3 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/ */

    

thingston / psr3 example snippets


use Thingston\Log\Logger;
use Thingston\Log\Adapter\StreamAdapter;

$logger = new Logger(new StreamAdapter('php://stderr'), channel: 'app');

$logger->info('User {user} logged in', ['user' => 'ana']);
$logger->error('Payment failed', ['orderId' => 123, 'reason' => 'card_declined']);

$logger = new Logger($adapter, channel: 'worker'); // channel defaults to "app"

use Thingston\Log\Formatter\LineFormatter;

$formatter = new LineFormatter(
    format: "[{timestamp}] {channel}.{level}: {message} {context}\n", // default
    dateFormat: DateTimeInterface::ATOM,                              // default
    

use Thingston\Log\Formatter\JsonFormatter;

$formatter = new JsonFormatter(); // {"timestamp":"...","channel":"app","level":"error","message":"...","context":{...}}

use Thingston\Log\Adapter\CompositeAdapter;
use Thingston\Log\Adapter\StreamAdapter;
use Thingston\Log\Adapter\Cloud\SlackWebhookAdapter;
use Thingston\Log\Adapter\MinLevelAdapter;

$composite = new CompositeAdapter([
    new StreamAdapter('/var/log/app.log'),
    new MinLevelAdapter(new SlackWebhookAdapter($webhookUrl), minLevel: 'error'),
], onError: function (\Throwable $e, $adapter, $record): void {
    // optional: report the failure elsewhere (e.g. error_log), without
    // losing the record for the adapters that did succeed.
    error_log(sprintf('Adapter %s failed: %s', $adapter::class, $e->getMessage()));
});

$logger = new Logger($composite);

use Thingston\Log\Adapter\MinLevelAdapter;
use Psr\Log\LogLevel;

$alertsOnly = new MinLevelAdapter($slackAdapter, LogLevel::ERROR);

use Thingston\Log\Adapter\NullAdapter;

$logger = new Logger(new NullAdapter());

use Thingston\Log\Adapter\StreamAdapter;

new StreamAdapter('/var/log/app.log');          // file path, opened in "ab" mode
new StreamAdapter('php://stdout');               // any stream wrapper
new StreamAdapter(fopen('php://stderr', 'wb'));   // an existing resource (not closed on destruct)

use Thingston\Log\Adapter\RotatingFileAdapter;

$adapter = new RotatingFileAdapter(
    filenamePattern: '/var/log/app-{date}.log', // must contain "{date}"
    maxFiles: 14,                                // keep the 14 most recent files; 0 = unlimited
    dateFormat: 'Y-m-d',                          // default
);

use Thingston\Log\Adapter\SyslogAdapter;

$adapter = new SyslogAdapter(
    ident: 'my-app',
    facility: LOG_USER, // default
    options: LOG_PID,   // default
);

use Thingston\Log\Adapter\PdoAdapter;

$pdo = new PDO('mysql:host=localhost;dbname=app', $user, $pass);
$adapter = new PdoAdapter($pdo, table: 'logs'); // table name is validated against ^[A-Za-z_][A-Za-z0-9_]*$

// One-time setup, e.g. in a migration:
// CREATE TABLE logs (
//     id         INTEGER PRIMARY KEY AUTO_INCREMENT,
//     channel    VARCHAR(255) NULL,
//     level      VARCHAR(20)  NOT NULL,
//     message    TEXT         NOT NULL,
//     context    TEXT         NULL,
//     created_at DATETIME     NOT NULL
// );

use Aws\CloudWatchLogs\CloudWatchLogsClient;
use Thingston\Log\Adapter\Cloud\CloudWatchLogsAdapter;

$client = new CloudWatchLogsClient([
    'region' => 'us-east-1',
    'version' => 'latest',
]);

$adapter = new CloudWatchLogsAdapter($client, logGroupName: '/my/app', logStreamName: gethostname());

use Google\Cloud\Logging\LoggingClient;
use Thingston\Log\Adapter\Cloud\GoogleCloudLoggingAdapter;

$loggingClient = new LoggingClient(['projectId' => 'my-project']);
$logger = $loggingClient->logger('my-app');

$adapter = new GoogleCloudLoggingAdapter($logger);

use Thingston\Log\Adapter\Cloud\AzureMonitorAdapter;

$adapter = new AzureMonitorAdapter(
    workspaceId: $workspaceId,   // Log Analytics workspace (customer) ID
    sharedKey: $sharedKeyBase64, // primary or secondary workspace key
    logType: 'MyAppLogs',        // custom log type name; default "PsrLog"
);

use Thingston\Log\Adapter\Cloud\PapertrailAdapter;

$adapter = new PapertrailAdapter(
    host: 'logsN.papertrailapp.com',
    port: 12345,
    appName: 'my-app', // default "app"
    useTls: true,       // default true
);

use Thingston\Log\Adapter\Cloud\SlackWebhookAdapter;
use Thingston\Log\Adapter\MinLevelAdapter;

$slack = new SlackWebhookAdapter(
    webhookUrl: $webhookUrl,
    channel: '#alerts', // optional, overrides the webhook's default channel
    username: 'app-bot', // optional
);

$adapter = new MinLevelAdapter($slack, minLevel: 'error');

use Thingston\Log\Adapter\Cloud\HttpTransportInterface;

final class MyHttpTransport implements HttpTransportInterface
{
    public function send(string $url, string $body, array $headers = []): void
    {
        // ...
    }
}

$adapter = new SlackWebhookAdapter($webhookUrl, transport: new MyHttpTransport());

use Thingston\Log\Adapter\AdapterInterface;
use Thingston\Log\LogRecord;

final class MyAdapter implements AdapterInterface
{
    public function handle(LogRecord $record): void
    {
        // $record->level     e.g. "error"
        // $record->message   already PSR-3 interpolated
        // $record->context   the raw context array
        // $record->channel   e.g. "app"
        // $record->timestamp a DateTimeImmutable
    }
}

$logger->warning('User {user} hit rate limit ({count}/{max})', [
    'user' => 'ana',
    'count' => 105,
    'max' => 100,
]);
// "User ana hit rate limit (105/100)"
bash
composer