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\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
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.