nexus-logger
Async actor-backed PSR-3 logger where log calls return immediately — formatting and I/O happen on a dedicated LogActor turn, off the request path.
What's in this package
NexusLogger— fluent builder; returns a PSR-3LoggerInterfaceLogger— PSR-3 façade;withChannel()andwithMinLevel()fork lightweight sub-loggersRecord— immutable log record;context(per-call) andextra(MDC/processors)Mdc— mapped diagnostic context;putStatic()for thread-wide,put()for coroutine/fiber-scopedConsoleHandler,FileHandler,ThreadQueueHandler— output handlersLineFormatter,JsonFormatter— native formattersMonologHandlerAdapter,MonologFormatterAdapter— drop-in Monolog interopCallerInfoProcessor— captures call site viadebug_backtrace(); level-gated for performanceLevelenum — aligned with PSR-3LogLevel
Install
composer require nexus-actors/logger
Quick example
src/Bootstrap/LoggerSetup.php
use Monadial\Nexus\Logger\Formatter\LineFormatter;
use Monadial\Nexus\Logger\Handler\ConsoleHandler;
use Monadial\Nexus\Logger\Level;
use Monadial\Nexus\Logger\NexusLogger;
$logger = NexusLogger::create($system, 'app')
->minLevel(Level::Info)
->handler(new ConsoleHandler(STDOUT, new LineFormatter()))
->build();
$logger->info('user {name} logged in', ['name' => 'tomas', 'userId' => 42]);
// → [2026-06-14T13:50:01.234Z] app.INFO: user tomas logged in {"userId":42}
For multi-thread Swoole deployments, use ThreadQueueHandler to push formatted lines onto a shared Swoole\Thread\Queue and drain them with a single dedicated writer thread — no locks, no per-write fopen.
See also
- nexus-http-server-swoole-threads — async logging setup with thread-mode servers
- nexus-core —
ActorSystemthe logger actor runs on