Hallmark
A PSR-3 logger for PHP 8.3+, with Monolog's handlers, formatters and processors, and Monolog's output.Un logger PSR-3 para PHP 8.3+, con los handlers, formatters y processors de Monolog, y su misma salida.Un logger PSR-3 per PHP 8.3+, con gli handler, i formatter e i processor di Monolog, e lo stesso output.
Monolog's design, rewritten for PHP 8.3El diseño de Monolog, reescrito para PHP 8.3Il design di Monolog, riscritto per PHP 8.3
Hallmark has the same parts as Monolog and writes the same output, compared against Monolog itself. The code is new.Hallmark tiene las mismas partes que Monolog y escribe la misma salida, comparada con el propio Monolog. El código es nuevo.Hallmark ha le stesse parti di Monolog e scrive lo stesso output, confrontato con Monolog stesso. Il codice è nuovo.
| The sameLo mismoLo stesso | Built withConstruido conCostruito con |
|---|---|
| The eight severities and their values, 100 to 600Las ocho severidades y sus valores, de 100 a 600Le otto severità e i loro valori, da 100 a 600 | A backed enum, LevelUn enum respaldado, LevelUn enum con valori, Level |
| A record of channel, level, message, context and extraUn registro de canal, nivel, mensaje, contexto y extraUn record di canale, livello, messaggio, contesto ed extra | A readonly value object, enriched by copyUn objeto de valor readonly, enriquecido por copiaUn value object readonly, arricchito per copia |
| Handler and processor stacks, bubblingPilas de handlers y processors, con bubblingStack di handler e processor, con bubbling | Processors run once, only when a handler takes the recordLos processors corren una vez, solo si un handler toma el registroI processor girano una volta, solo se un handler prende il record |
The JSON a log store reads, empty bags as {}El JSON que lee un almacén de logs, bolsas vacías como {}Il JSON che legge un archivio di log, contenitori vuoti come {} | JsonFormatter, BatchMode |
| Timestamps with microsecondsMarcas de tiempo con microsegundosTimestamp con microsecondi | The record's own time, in the logger's timezoneLa hora del propio registro, en la zona horaria del loggerL'ora del record stesso, nel fuso orario del logger |
| The PSR-3 interfaceLa interfaz PSR-3L'interfaccia PSR-3 | An unknown level throws PSR-3's own exceptionUn nivel desconocido lanza la excepción del propio PSR-3Un livello sconosciuto lancia l'eccezione di PSR-3 |
A checkout's logEl log de un checkoutIl log di un checkout
The output of the script below. The debug line is below the handler's level, the card number is masked, and each line has the request's correlation id.La salida del script de abajo. La línea de debug está por debajo del nivel del handler, el número de tarjeta está enmascarado y cada línea tiene el correlation id de la petición.L'output dello script qui sotto. La riga di debug è sotto il livello dell'handler, il numero di carta è mascherato e ogni riga ha il correlation id della richiesta.
$ php checkout.php
The script, as it ran:El script, tal como se ejecutó:Lo script, così come è stato eseguito:
$log = new Logger('shop', [new StreamHandler('php://stdout', Level::Info)], [new CorrelationIdProcessor(id: 'req-7f3a')]);
$log->pushProcessor(new PsrLogMessageProcessor());
$log->pushProcessor(new RedactionProcessor());
$log->debug('cart loaded');
$log->info('Order {order} placed', ['order' => 4711]);
$log->warning('Payment {order} retried', ['order' => 4711, 'card_number' => '4242424242424242']);
$log->error('Gateway declined {order}', ['order' => 4711, 'code' => 402]);
A logger, a sink, a catalog, a testUn logger, un destino, un catálogo, una pruebaUn logger, una destinazione, un catalogo, un test
Every sample is taken from the manual, whose samples the test suite runs as written.Cada ejemplo sale del manual, cuyos ejemplos la suite de pruebas ejecuta tal como están escritos.Ogni esempio viene dal manuale, i cui esempi la suite di test esegue così come sono scritti.
$log = new Logger('app', [
new StreamHandler('php://stdout', Level::Warning),
]);
$log->info('Cache warmed');
$log->warning('Low disk space', ['free_mb' => 128]);
$log = new Logger('app', [new FingersCrossedHandler($stream, activationLevel: Level::Error)]);
$log->debug('cart loaded');
$log->info('charging card');
$log->error('card declined'); // now all three are written
event_codeUn código declarado una vez, con el nivel y el mensaje derivados de él, buscable como event_codeUn codice dichiarato una volta, con livello e messaggio derivati da esso, ricercabile come event_code
enum PaymentEvent: string implements EventCode
{
case AuthorizationFailed = 'PAY-1001';
// code(), level(), message()
}
$log->event(PaymentEvent::AuthorizationFailed, ['order' => 4711]);
'hallmark' => [
'driver' => 'hallmark',
'path' => storage_path('logs/laravel.log'),
'level' => env('LOG_LEVEL', 'debug'),
'days' => 14,
],
$handler = new TestHandler();
(new Logger('shop', [$handler]))->warning('payment retry scheduled');
$this->assertLoggedThatContains($handler, Level::Warning, 'retry');
Use casesCasos de usoCasi d'uso
Drag or scroll sideways.Arrastra o desplázate lateralmente.Trascina o scorri lateralmente.
How it worksCómo funcionaCome funziona
A record goes from the logger, through its processors, to each handler that takes it.Un registro va del logger, a través de sus processors, a cada handler que lo toma.Un record va dal logger, attraverso i suoi processor, a ogni handler che lo prende.
InstallInstalarInstalla
composer require hallmark/hallmark: psr/log is the only package it brings.composer require hallmark/hallmark: psr/log es el único paquete que trae.composer require hallmark/hallmark: psr/log è l'unico pacchetto che porta.
Pick the sinksElegir los destinosScegli le destinazioni
A file, a daily file, stderr, syslog, or a decorator around one of them; each with its own level and formatter.Un archivo, un archivo diario, stderr, syslog o un decorador alrededor de uno; cada uno con su nivel y su formatter.Un file, un file giornaliero, stderr, syslog o un decoratore attorno a uno di essi; ognuno con il suo livello e il suo formatter.
Stamp the recordsSellar los registrosMarchia i record
Processors add the correlation id, the call site, the memory, and mask what must not be written.Los processors agregan el correlation id, el punto de llamada, la memoria, y enmascaran lo que no debe escribirse.I processor aggiungono il correlation id, il punto di chiamata, la memoria, e mascherano ciò che non va scritto.
LogRegistrarRegistra
The eight PSR-3 methods, log(), or event() for a catalogued event.Los ocho métodos de PSR-3, log(), o event() para un evento catalogado.Gli otto metodi di PSR-3, log(), oppure event() per un evento catalogato.
setExceptionHandler() receives what a handler throws, a full disk or an unwritable path, instead of the code that logged.¿El logging no debe romper la petición? setExceptionHandler() recibe lo que lanza un handler, un disco lleno o una ruta sin permisos, en lugar del código que registró.Il logging non deve rompere la richiesta? setExceptionHandler() riceve ciò che lancia un handler, un disco pieno o un percorso non scrivibile, invece del codice che ha registrato.Quick startInicio rápidoAvvio rapido
PHP 8.3 or newer. Require the package:PHP 8.3 o más reciente. Requiere el paquete:PHP 8.3 o più recente. Richiedi il pacchetto:
composer require hallmark/hallmark
Build a logger and write a line:Crea un logger y escribe una línea:Crea un logger e scrivi una riga:
use Hallmark\Handler\StreamHandler;
use Hallmark\Level;
use Hallmark\Logger;
$log = new Logger('app', [
new StreamHandler(__DIR__ . '/var/logs/app.log', Level::Warning),
]);
$log->warning('Low disk space', ['free_mb' => 128]);
In Laravel, add a channel with 'driver' => 'hallmark'. Then read the manual, from installation to the reference.En Laravel, agrega un canal con 'driver' => 'hallmark'. Después lee el manual, de la instalación a la referencia.In Laravel, aggiungi un canale con 'driver' => 'hallmark'. Poi leggi il manuale, dall'installazione al riferimento.
Where a record goesA dónde va un registroDove va un record
Nine handlers, each with its own level and formatter. Their options are on the handlers page:Nueve handlers, cada uno con su nivel y su formatter. Sus opciones están en la página de handlers:Nove handler, ognuno con il suo livello e il suo formatter. Le loro opzioni sono nella pagina degli handler:
| Handler | Writes toEscribe enScrive su |
|---|---|
StreamHandler | A file path or any stream, with optional locking.Una ruta de archivo o cualquier stream, con bloqueo opcional.Un percorso di file o qualsiasi stream, con lock opzionale. |
RotatingFileHandler | One file per day of each record's own date, with a retention window.Un archivo por día de la fecha de cada registro, con una ventana de retención.Un file per giorno della data di ogni record, con una finestra di conservazione. |
StderrHandler | php://stderr, for CLI tools and containers.php://stderr, para herramientas CLI y contenedores.php://stderr, per strumenti CLI e container. |
SyslogHandler | The system logger, each level at its syslog priority.El logger del sistema, cada nivel con su prioridad de syslog.Il logger di sistema, ogni livello con la sua priorità syslog. |
NullHandler | Nowhere: it silences the levels it takes for the handlers behind it.A ningún lado: silencia los niveles que toma para los handlers detrás de él.Da nessuna parte: zittisce i livelli che prende per gli handler dietro di lui. |
TestHandler | Memory, for assertions.Memoria, para aserciones.Memoria, per le asserzioni. |
BufferHandler | Another handler, in one batch.Otro handler, en un solo lote.Un altro handler, in un solo lotto. |
FingersCrossedHandler | Another handler, only once something goes wrong.Otro handler, solo cuando algo sale mal.Un altro handler, solo quando qualcosa va storto. |
SamplingHandler | Another handler, one record in N.Otro handler, un registro de cada N.Un altro handler, un record ogni N. |
Why HallmarkPor qué HallmarkPerché Hallmark
Monolog's output, measuredLa salida de Monolog, medidaL'output di Monolog, misurato
Level values, JSON, empty bags and dates match Monolog's, checked against Monolog itself, so dashboards and log shippers keep working.Los valores de nivel, el JSON, las bolsas vacías y las fechas coinciden con los de Monolog, comprobados contra el propio Monolog, así que los paneles y los enviadores de logs siguen funcionando.I valori dei livelli, il JSON, i contenitori vuoti e le date coincidono con quelli di Monolog, verificati contro Monolog stesso, così dashboard e log shipper continuano a funzionare.
Typed end to endTipado de punta a puntaTipizzato da capo a fondo
PHPStan at level max over the source, the integrations and the tests. Levels are an enum and records are readonly, so one handler cannot change what the next sees.PHPStan en el nivel máximo sobre el código, las integraciones y las pruebas. Los niveles son un enum y los registros son readonly, así que un handler no puede cambiar lo que ve el siguiente.PHPStan al livello massimo su sorgenti, integrazioni e test. I livelli sono un enum e i record sono readonly, quindi un handler non può cambiare ciò che vede il successivo.
Nothing else to installNada más que instalarNient'altro da installare
psr/log is the only package Hallmark needs. Laravel and PHPUnit are needed only by the integrations that use them.psr/log es el único paquete que Hallmark necesita. Laravel y PHPUnit solo los necesitan las integraciones que los usan.psr/log è l'unico pacchetto di cui Hallmark ha bisogno. Laravel e PHPUnit servono solo alle integrazioni che li usano.
Built for workersPensado para workersPensato per i worker
reset() returns every buffer, trigger, count and id to a clean state between requests on a long-lived process.reset() devuelve cada buffer, disparador, contador e id a un estado limpio entre peticiones en un proceso de larga vida.reset() riporta ogni buffer, trigger, contatore e id a uno stato pulito tra le richieste in un processo di lunga durata.
Secrets stay outLos secretos quedan afueraI segreti restano fuori
RedactionProcessor masks auth and payment keys at any depth, and runs before interpolation when pushed last.RedactionProcessor enmascara claves de autenticación y de pago a cualquier profundidad, y corre antes de la interpolación si se agrega último.RedactionProcessor maschera le chiavi di autenticazione e di pagamento a qualsiasi profondità, e gira prima dell'interpolazione se aggiunto per ultimo.
The docs are testedLa documentación está probadaLa documentazione è testata
Every PHP sample in the README and the manual runs in the test suite, and must print the output it shows.Cada ejemplo PHP del README y del manual se ejecuta en la suite de pruebas, y debe imprimir la salida que muestra.Ogni esempio PHP del README e del manuale gira nella suite di test, e deve stampare l'output che mostra.
FAQPreguntas frecuentesDomande frequenti
The short answers — the manual has the long ones.Las respuestas breves — el manual tiene las largas.Le risposte brevi — il manuale ha quelle lunghe.
No. Hallmark is an independent implementation inspired by Monolog's design. It shares no code with it, has its own Hallmark namespace, and matches Monolog's output where tools depend on it.No. Hallmark es una implementación independiente inspirada en el diseño de Monolog. No comparte código con él, tiene su propio namespace Hallmark y coincide con la salida de Monolog donde las herramientas dependen de ella.No. Hallmark è un'implementazione indipendente ispirata al design di Monolog. Non condivide codice con esso, ha il suo namespace Hallmark e coincide con l'output di Monolog dove gli strumenti ne dipendono.
Wherever code asks for a PSR-3 logger, yes. Code that uses Monolog's own classes, such as a Monolog handler from another package, needs Monolog.Donde el código pida un logger PSR-3, sí. El código que usa las clases propias de Monolog, como un handler de Monolog de otro paquete, necesita Monolog.Ovunque il codice chieda un logger PSR-3, sì. Il codice che usa le classi di Monolog, come un handler Monolog di un altro pacchetto, ha bisogno di Monolog.
Yes. Laravel builds a stack from its channels' Monolog handlers, and a hallmark channel gives it one that forwards each record to the Hallmark logger.Sí. Laravel arma un stack con los handlers de Monolog de sus canales, y un canal hallmark le da uno que reenvía cada registro al logger de Hallmark.Sì. Laravel costruisce uno stack dagli handler Monolog dei suoi canali, e un canale hallmark gliene fornisce uno che inoltra ogni record al logger di Hallmark.
PHP 8.3 and newer. CI runs the whole check on 8.3, 8.4 and 8.5.PHP 8.3 y más recientes. La CI ejecuta todas las verificaciones en 8.3, 8.4 y 8.5.PHP 8.3 e successivi. La CI esegue tutti i controlli su 8.3, 8.4 e 8.5.
By default the exception reaches the code that logged. With setExceptionHandler(), it goes to your callback instead, with the record, and the request goes on.Por defecto la excepción llega al código que registró. Con setExceptionHandler(), va a tu callback en su lugar, con el registro, y la petición sigue.Per impostazione predefinita l'eccezione arriva al codice che ha registrato. Con setExceptionHandler(), va invece alla tua callback, con il record, e la richiesta prosegue.
Hallmark is MIT-licensed.Hallmark tiene licencia MIT.Hallmark ha licenza MIT.