LogTape changelog
Version 2.0.1
Released on January 20, 2026.
@logtape/otel
Fixed OpenTelemetry sink to preserve nested object structures in attributes instead of converting them to JSON strings. This follows the OpenTelemetry specification which supports
map<string, AnyValue>for nested objects. [#135]Before this fix, nested objects were serialized as JSON strings:
logger.info("Event", { workspace: { id: 42, name: "test" } }); // OpenTelemetry attribute: workspace = '{"id":42,"name":"test"}'After this fix, nested objects are preserved as structured data:
logger.info("Event", { workspace: { id: 42, name: "test" } }); // OpenTelemetry attribute: workspace = { id: 42, name: "test" }This allows OpenTelemetry backends (like Axiom, Honeycomb, etc.) to properly query and filter on nested properties (e.g.,
workspace.id = 42).Errorobjects in properties (whenexceptionAttributesis"raw"orfalse) are now serialized as structured objects instead of JSON strings, preserving properties likename,message,stack,cause, and custom properties.
Version 2.0.0
Released on January 15, 2026.
@logtape/logtape
Added
lazy()function for deferred evaluation of contextual properties. This allows properties passed toLogger.with()to be evaluated at logging time rather than atwith()call time. [#131]import { getLogger, lazy } from "@logtape/logtape"; let currentUser: string | null = null; const logger = getLogger("app").with({ user: lazy(() => currentUser) }); logger.info("Action"); // logs with user: null currentUser = "alice"; logger.info("Action"); // logs with user: "alice"- Added
Lazy<T>type to represent a lazy value. - Added
isLazy()function to check if a value is a lazy value.
- Added
Added
Erroroverloads forLogger.error(),Logger.warn()/Logger.warning(), andLogger.fatal()as a shorthand for logging errors as structured properties. The default message template forlogger.error(error)(and the corresponding warning/fatal overloads) is{error.message}. Note thatlogger.warn(new Error(...))andlogger.fatal(new Error(...))may result in slightly different output compared to previous versions, where this looked like a{*}(properties-only) shorthand. [#123]Improved JSON Lines formatter serialization of
ErrorandAggregateErrorvalues in properties so thatname,message,stack,cause, anderrorsare preserved in JSON output. [#123]Added
"none"and"disabled"options forAnsiColorFormatterOptions.timestampto disable timestamp display, consistent withTextFormatterOptions. [#120, #121 by Jonathan Wilbur]- Added
"none"and"disabled"to thetimestampoption type. - Changed the custom timestamp formatter return type to
string | null(wasstring). - Fixed
getAnsiColorFormatter()to properly handlenulltimestamps instead of rendering"null"with ANSI styling.
- Added
Added
lineEndingoption to text and JSON Lines formatters for Windows compatibility. [#113 by Joonmo]- Added
lineEndingoption toTextFormatterOptionsinterface. - Added
lineEndingoption toJsonLinesFormatterOptionsinterface. - Supports
"lf"(Unix-style, default) and"crlf"(Windows-style) line endings. getAnsiColorFormatter()automatically inherits the option fromgetTextFormatter().
- Added
Replaced the deprecated
unloadevent withpagehidefor automatic disposal in browser environments. [#79, #124, #125 by Pavel Semiklit]The
unloadevent is deprecated and will be removed from browsers (starting with Chrome in 2025). It also prevents pages from being eligible for browser back/forward cache (bfcache), which significantly impacts navigation performance. Thepagehideevent fires at nearly the same timing asunloadbut is bfcache-compatible and more reliable on mobile browsers.Note that Deno continues to use the
unloadevent since it does not supportpagehide.Added
FingersCrossedOptions.bufferLeveloption to configure which severity levels are buffered separately from the trigger level. [#126]- When set, only log records at or below
bufferLevelare buffered. - Records above
bufferLevelbut belowtriggerLevelpass through immediately without buffering. - Throws
RangeErrorifbufferLevelis greater than or equal totriggerLevel.
- When set, only log records at or below
Added
Logger.isEnabledFor()method to check if a log level would be processed by the logger. [#129]- Returns
trueif the level is at or abovelowestLeveland at least one sink is configured to receive logs at that level. - Useful for conditionally executing expensive computations before logging, particularly for async operations where lazy evaluation callbacks cannot be used.
- Returns
Added async callback support for lazy evaluation of structured data. [#129]
- All logging methods (
trace(),debug(),info(),warn(),warning(),error(),fatal()) now accept async callbacks that returnPromise<Record<string, unknown>>. - When an async callback is passed, the method returns
Promise<void>. - The async callback is only invoked if the log level is enabled; if disabled, the callback is never called and the returned
Promiseresolves immediately. - Added corresponding overloads to
Loggerinterface andLogMethodinterface.
- All logging methods (
@logtape/adaptor-log4js
Added a new package
@logtape/adaptor-log4jsfor integrating LogTape with log4js logging infrastructure. [#57]- Added
getLog4jsSink()function to forward LogTape log records to log4js loggers. - Added
Log4jsSinkOptionstype (discriminated union) for configuring the adapter behavior with type-safe context strategy options:Log4jsSinkOptionsMdc: For MDC strategy withcontextPreservationLog4jsSinkOptionsArgs: For args strategy (excludescontextPreservation)
- Added
install()function for convenient auto-configuration with custom log4js logger and configuration options. - Added
categoryMapperoption to customize how LogTape categories are mapped to log4js categories (default: join with dots). - Added
contextStrategyoption to control how LogTape properties are handled:"mdc"(default): Use log4js MDC (Mapped Diagnostic Context)"args": Pass properties as additional arguments to log methods
- Added
contextPreservationoption for MDC strategy to control handling of existing log4js context:"preserve"(default): Save and restore existing context"merge": Merge LogTape properties with existing context"replace": Replace existing context with LogTape properties
- Maps LogTape log levels to equivalent log4js levels (trace, debug, info, warn, error, fatal).
- Supports dynamic logger creation based on LogTape categories or using a fixed log4js logger instance.
- Enables seamless adoption of LogTape-enabled libraries in applications using log4js without requiring logging infrastructure changes.
- Added
@logtape/config
Added a new package
@logtape/configfor configuring LogTape from plain objects. [#117]- Added
configureFromObject()function to configure LogTape from plain JavaScript objects loaded from JSON, YAML, TOML, or other formats. - Added module reference syntax (
module#export()) for specifying sinks, filters, and formatters. - Added built-in shorthands for common sinks and formatters (
#console(),#text(),#ansiColor(),#jsonLines()). - Added
ConfigureOptionsinterface withshorthandsandonInvalidConfigoptions. - Added
onInvalidConfigoption for graceful error handling:"throw"(default): ThrowConfigErroron invalid configuration"warn": Apply valid parts and log warnings to meta logger
- Added
expandEnvVars()utility function for environment variable expansion with${VAR}and${VAR:default}syntax. - Added
LogTapeConfig,SinkConfig,FilterConfig,FormatterConfig,LoggerConfig, andShorthandRegistryinterfaces. - Added
ConfigErrorclass for configuration errors. - Added
DEFAULT_SHORTHANDSconstant with built-in shorthand mappings.
- Added
@logtape/elysia
Added a new package
@logtape/elysiafor Elysia integration. [#111]- Added
elysiaLogger()function to create Elysia plugin for HTTP request logging. - Supports predefined formats (
combined,common,dev,short,tiny) compatible with Morgan. - Supports custom format functions returning string or structured objects.
- Supports configurable log levels via
leveloption. - Supports request skipping via
skipoption. - Supports immediate logging mode via
logRequestoption. - Supports Elysia plugin scopes via
scopeoption (global,scoped,local). - Logs errors at error level via
onErrorhook.
- Added
@logtape/otel
Removed the
attributes.prefix from property keys when converting LogTape properties to OpenTelemetry attributes. Properties are now sent with their original key names as flat attributes, which aligns with standard OpenTelemetry conventions and prevents double nesting (e.g.,attributes.attributes.method) in OpenTelemetry backends. [[#127], #130]- Changed
convertToAttributes()to use property keys directly without adding anattributes.prefix. - This is a breaking change: existing users with queries or dashboards that rely on the
attributes.*key names will need to update them to use the new flat key names (e.g.,attributes.methodbecomesmethodin the attributes field).
- Changed
Added
exceptionAttributesoption to control howErrorobjects in properties are handled. [#123]"semconv"(default): Follows OpenTelemetry semantic conventions for exceptions, converting Error objects toexception.type,exception.message, andexception.stacktraceattributes."raw": Serializes Error objects as JSON strings with their properties (name,message,stack,cause,errors) preserved.false: Treats Error objects as regular objects (typically results in empty objects).
IMPORTANT
This is a behavior change: Error objects in properties now follow semantic conventions by default instead of being serialized as JSON strings. If you need the previous behavior, set
exceptionAttributes: "raw".Fixed primitive type preservation in attributes: numbers and booleans are now preserved as their original types instead of being converted to strings.
@logtape/file
Added
getTimeRotatingFileSink()function for time-based log file rotation. [#82]- Supports
"hourly","daily", and"weekly"rotation intervals. - Default filename patterns:
YYYY-MM-DD.log(daily),YYYY-MM-DD-HH.log(hourly),YYYY-WNN.log(weekly). - Added
TimeRotatingFileSinkOptions.filenameoption for custom filename patterns. - Added
TimeRotatingFileSinkOptions.maxAgeMsoption for automatic cleanup of old log files. - Supports buffering and non-blocking mode like other file sinks.
- Added
TimeRotatingFileSinkOptionsinterface. - Added
TimeRotationIntervaltype.
- Supports
@logtape/windows-eventlog
Improved Windows Event Log message formatting using
NELOG_OEM_Code(3299) from netmsg.dll. [#115 by Roland Kaufmann]- Changed default event ID to
NELOG_OEM_Code(3299), which provides a generic message format that properly displays log messages in Windows Event Viewer. - Added
formatteroption toWindowsEventLogSinkOptionsfor custom text formatting of log records. - Refactored FFI implementations (Deno, Node.js, Bun) to use a common
WindowsEventLogFFIinterface. - Added documentation for registering netmsg.dll as an event message file in the Windows Registry.
- Changed default event ID to
Version 1.3.6
Released on January 7, 2026.
@logtape/cloudwatch-logs
- Fixed
getCloudWatchLogsSink()to properly close internally createdCloudWatchLogsClientconnections on disposal. Previously, when the sink created its own client (i.e., whenoptions.clientwas not provided), the client's TLS connections were not closed, causing resource leaks that were detected by Deno's stricter resource leak checking in newer versions.
Version 1.3.5
Released on December 19, 2025.
@logtape/redaction
- Fixed a regression where
Error,Date,RegExp, and other built-in objects were incorrectly converted to empty objects{}when processed byredactByField()andredactByPattern(). These objects are now preserved without modification. [#114]
Version 1.3.4
Released on December 18, 2025.
@logtape/redaction
- Fixed
redactByField()to use redacted property values for all message placeholders, not just those directly matching field patterns. Previously, named placeholders like{args}would use original values even when containing nested sensitive fields (e.g.,args[0].email), exposing sensitive data in the log message. [#99]
Version 1.3.3
Released on December 18, 2025.
@logtape/redaction
- Fixed
redactByField()to recursively process arrays, ensuring that sensitive fields inside objects within arrays are properly redacted. Previously, arrays were not traversed, so sensitive data in nested structures like{ args: [{ email: "..." }] }would not be redacted. [#99]
Version 1.3.2
Released on December 18, 2025.
- Reduced npm package sizes by excluding unnecessary source files from published packages. Previously, the src/ directory was included in npm packages, which increased download sizes without providing runtime value. [#112]
Version 1.3.1
Released on December 16, 2025.
@logtape/otel
Fixed a bug where log records sent during lazy initialization were silently dropped. Now, log records are buffered during initialization and emitted once the OpenTelemetry logger provider is ready. [#110]
Added
OpenTelemetrySinkinterface which extendsSinkwithreadyproperty andAsyncDisposable.Added
OpenTelemetrySink.readyproperty, aPromise<void>that resolves when lazy initialization completes. For sinks created with an explicitloggerProvider, this resolves immediately.
Version 1.3.0
Released on December 15, 2025.
@logtape/logtape
Added context-based category prefix feature for library hierarchies. [#98]
- Added
withCategoryPrefix()function to prepend category prefixes to all log records within a callback context. - Uses the existing
contextLocalStorageconfiguration, so no additional setup is required if implicit contexts are already enabled. - Useful for SDKs that wrap internal libraries and want to show their own category in logs from those libraries.
- Prefixes accumulate when nested, allowing multi-layer architectures.
- Added
@logtape/drizzle-orm
Added @logtape/drizzle-orm package for Drizzle ORM integration. [#104]
- Added
getLogger()function to create a Drizzle ORM-compatible logger. - Added
DrizzleLoggerOptionsinterface for configuration. - Added
DrizzleLoggerclass implementing Drizzle'sLoggerinterface. - Logs queries with structured data:
formattedQuery(with parameter substitution),query(original), andparams(original array).
- Added
@logtape/express
Added @logtape/express package for Express.js HTTP request logging using LogTape as the backend. [#105]
- Added
expressLogger()function to create Express middleware for request logging. - Added
ExpressLogTapeOptionsinterface for configuration. - Added
RequestLogPropertiesinterface for structured log properties. - Added
FormatFunctiontype for custom format functions. - Added
PredefinedFormattype for Morgan-compatible format names. - Supports predefined formats:
combined,common,dev,short,tiny. - Supports custom format functions returning strings or objects.
- Supports
skipfunction to conditionally skip logging. - Supports
immediateoption to log on request arrival vs response.
- Added
@logtape/fastify
Added @logtape/fastify package for using LogTape as Fastify's logging backend. [#102]
- Added
getLogTapeFastifyLogger()function to create a Pino-compatible logger wrapper for Fastify'sloggerInstanceoption. - Added
FastifyLogTapeOptionsinterface for configuration. - Added
PinoLikeLoggerinterface implementing Pino's logger contract. - Added
PinoLogMethodinterface for Pino-style log method signatures. - Added
PinoLeveltype for Pino log levels. - Supports all Pino method signatures: string messages, object + message, object-only, and printf-style interpolation (
%s,%d,%j,%o). - Implements
child(bindings)method using LogTape'sLogger.with().
- Added
@logtape/hono
Added @logtape/hono package for Hono HTTP request logging using LogTape as the backend. [#107]
- Added
honoLogger()function to create Hono middleware for request logging. - Added
HonoLogTapeOptionsinterface for configuration. - Added
HonoContextinterface for context type compatibility. - Added
RequestLogPropertiesinterface for structured log properties. - Added
FormatFunctiontype for custom format functions. - Added
PredefinedFormattype for Morgan-compatible format names. - Supports predefined formats:
combined,common,dev,short,tiny. - Supports custom format functions returning strings or objects.
- Supports
skipfunction to conditionally skip logging. - Supports
logRequestoption to log on request arrival vs response. - Cross-runtime compatible: works on Cloudflare Workers, Deno, Bun, and Node.js.
- Added
@logtape/koa
Added @logtape/koa package for Koa HTTP request logging using LogTape as the backend. [#106]
- Added
koaLogger()function to create Koa middleware for request logging. - Added
KoaLogTapeOptionsinterface for configuration. - Added
KoaContextinterface for context type compatibility. - Added
RequestLogPropertiesinterface for structured log properties. - Added
FormatFunctiontype for custom format functions. - Added
PredefinedFormattype for Morgan-compatible format names. - Supports predefined formats:
combined,common,dev,short,tiny. - Supports custom format functions returning strings or objects.
- Supports
skipfunction to conditionally skip logging. - Supports
logRequestoption to log on request arrival vs response.
- Added
@logtape/otel
Added support for gRPC and HTTP/Protobuf protocols for OTLP log export. [#103]
Added
@opentelemetry/exporter-logs-otlp-grpcdependency for gRPC protocol support.Added
@opentelemetry/exporter-logs-otlp-protodependency for HTTP/Protobuf protocol support.Protocol is determined by environment variables following the OpenTelemetry specification:
OTEL_EXPORTER_OTLP_LOGS_PROTOCOL(highest priority)OTEL_EXPORTER_OTLP_PROTOCOL(fallback)- Default:
"http/json"(for backward compatibility)
Added
OtlpProtocoltype for protocol values ("grpc","http/protobuf","http/json").Uses dynamic imports to maintain browser compatibility when gRPC is not used.
Added
OpenTelemetrySinkExporterOptions.additionalResourceoption to merge custom resource attributes with the default resource. [#108 by Nils Bergmann]This allows adding attributes like
ATTR_DEPLOYMENT_ENVIRONMENT_NAMEwithout providing a customloggerProvider:import { getOpenTelemetrySink } from "@logtape/otel"; import { resourceFromAttributes } from "@opentelemetry/resources"; import { SEMRESATTRS_DEPLOYMENT_ENVIRONMENT } from "@opentelemetry/semantic-conventions"; getOpenTelemetrySink({ serviceName: "my-service", additionalResource: resourceFromAttributes({ [SEMRESATTRS_DEPLOYMENT_ENVIRONMENT]: "production", }), });Refactored
OpenTelemetrySinkOptionsto a discriminated union type for better type safety.- Added
OpenTelemetrySinkProviderOptionsinterface for providing a customLoggerProvider(recommended for production use). - Added
OpenTelemetrySinkExporterOptionsinterface for automatic exporter creation based on environment variables. loggerProviderand exporter options (serviceName,otlpExporterConfig) are now mutually exclusive at the type level.
- Added
Changed the exporter initialization to use lazy loading. The exporter is now created asynchronously when the first log record is emitted, rather than synchronously when
getOpenTelemetrySink()is called. This allows the main API to remain synchronous while supporting dynamic imports for protocol selection.Added automatic fallback to no-op logger when no OTLP endpoint is configured. This prevents repeated transport errors when environment variables like
OTEL_EXPORTER_OTLP_ENDPOINTorOTEL_EXPORTER_OTLP_LOGS_ENDPOINTare not set and no URL is provided in the exporter configuration.
@logtape/redaction
Fixed a security vulnerability where
redactByField()andredactByPattern()could enter an infinite loop when processing objects with circular references, leading to a denial-of-service (DoS) attack. The redaction functions now correctly handle circular references, preventing stack overflows.Fixed a security vulnerability where sensitive data in class instances was not being redacted. The redaction logic now recursively processes class instances, ensuring that sensitive fields are redacted regardless of the object's structure.
@logtape/sentry
Enhanced Sentry sink with modern observability features including automatic trace correlation, breadcrumbs, and structured logging support. [#90]
- The
getSentrySink()function now accepts an optionalSentrySinkOptionsobject instead of a Sentry client instance. The old patterngetSentrySink(getClient())still works with a deprecation warning. - Added automatic trace correlation with active Sentry spans (
trace_id,span_idcontext). - Added
enableBreadcrumbsoption to create breadcrumbs for all log events. - Added
beforeSendhook to transform or filter records before sending. - Added automatic structured logging support via Sentry's Logs API (SDK v9.41.0+ with
enableLogs: true). - Added ParameterizedString support for better message grouping in Sentry.
- The
@logtape/syslog
Added
SyslogSinkOptions.secureoption to enable TLS for TCP connections, addressing a vulnerability where logs were sent in plaintext over the network.Added
SyslogSinkOptions.tlsOptionsoption to configure TLS connections.- Added
SyslogTlsOptionsinterface for TLS configuration. - Added
SyslogTlsOptions.rejectUnauthorizedoption to control certificate validation (defaults totruefor security). - Added
SyslogTlsOptions.caoption to specify custom CA certificates.
- Added
Version 1.2.6
Released on January 7, 2026.
@logtape/cloudwatch-logs
- Fixed
getCloudWatchLogsSink()to properly close internally createdCloudWatchLogsClientconnections on disposal. Previously, when the sink created its own client (i.e., whenoptions.clientwas not provided), the client's TLS connections were not closed, causing resource leaks that were detected by Deno's stricter resource leak checking in newer versions.
Version 1.2.5
Released on December 18, 2025.
@logtape/redaction
- Fixed
redactByField()to use redacted property values for all message placeholders, not just those directly matching field patterns. Previously, named placeholders like{args}would use original values even when containing nested sensitive fields (e.g.,args[0].email), exposing sensitive data in the log message. [#99]
Version 1.2.4
Released on December 18, 2025.
@logtape/redaction
- Fixed
redactByField()to recursively process arrays, ensuring that sensitive fields inside objects within arrays are properly redacted. Previously, arrays were not traversed, so sensitive data in nested structures like{ args: [{ email: "..." }] }would not be redacted. [#99]
Version 1.2.3
Released on December 18, 2025.
- Reduced npm package sizes by excluding unnecessary source files from published packages. Previously, the src/ directory was included in npm packages, which increased download sizes without providing runtime value. [#112]
Version 1.2.2
Released on November 29, 2025.
@logtape/redaction
- Fixed
redactByField()to properly redact sensitive fields in objects passed via the{*}wildcard placeholder. Previously, the original object reference was kept in the message array, exposing sensitive field values even when they were redacted in properties. [#99]
Version 1.2.1
Released on November 28, 2025.
@logtape/redaction
- Fixed
redactByField()to also redact sensitive values in themessagearray, not just inproperties. Previously, sensitive field values were exposed in the log message even when the corresponding property was redacted. [#99]
Version 1.2.0
Released on November 11, 2025.
@logtape/logtape
Added support for nested property access in message template placeholders, enabling direct access to nested objects, arrays, and complex data structures without manual property extraction. [#91, #93 by 伍闲犬]
- Dot notation:
{user.name},{order.customer.profile.tier} - Array indexing:
{users[0]},{users[0].name} - Bracket notation with quotes:
{user["full-name"]},{data["a.b c"]} - Escape sequences in quoted strings:
\",\',\\,\n,\t,\r,\b,\f,\v,\0, and Unicode escapes (\uXXXX) - Optional chaining:
{user?.profile?.email},{data?.items?.[0]?.name} - Combined patterns:
{users[0]?.profile?.["contact-info"]?.email} - Enhanced security: blocks access to
__proto__,prototype, andconstructorat any depth to prevent prototype pollution
- Dot notation:
Added context-based isolation for fingers crossed sink to handle scenarios like HTTP request tracing where logs should be isolated by implicit context values. [#86]
- Added
isolateByContextoption toFingersCrossedOptionsfor isolating buffers based on specified context keys from log record properties. - Context isolation can be combined with existing category isolation for fine-grained control over buffer flushing behavior.
- Each context buffer maintains separate trigger states and size limits, preventing unrelated logs from being flushed together.
- Added memory management options for context isolation to prevent memory leaks in high-traffic applications:
bufferTtlMsfor time-based cleanup,cleanupIntervalMsfor configurable cleanup intervals, andmaxContextsfor LRU-based capacity limits. TTL and LRU can be used independently or together for comprehensive memory management.
- Added
Changed the type of the
TextFormatterOptions.valuecallback to accept a second parameter that provides access to the default cross-runtimeinspect()function, making it easier to implement custom value formatting with fallback to default behavior.- Changed the type of
TextFormatterOptions.valueto(value: unknown, inspect: (value: unknown, options?: { colors?: boolean }) => string) => string(was(value: unknown) => string). - The second parameter is optional and can be ignored for backward compatibility.
- Users can now customize formatting for specific value types while falling back to the cross-runtime
inspect()function for others, without needing to reimplement the complex runtime detection logic.
- Changed the type of
@logtape/pretty
- Added support for
gettersandshowProxyoptions ininspectOptionsto allow fine-grained control over how objects and proxies are displayed. These options are available in Node.js, Deno, and Bun runtimes, providing consistent behavior across platforms. [#95]
@logtape/redaction
- Extended field-based redaction to recursively redact sensitive fields in objects nested within arrays, providing more comprehensive protection for structured data. [#94]
Version 1.1.8
Released on January 7, 2026.
@logtape/cloudwatch-logs
- Fixed
getCloudWatchLogsSink()to properly close internally createdCloudWatchLogsClientconnections on disposal. Previously, when the sink created its own client (i.e., whenoptions.clientwas not provided), the client's TLS connections were not closed, causing resource leaks that were detected by Deno's stricter resource leak checking in newer versions.
Version 1.1.7
Released on December 18, 2025.
@logtape/redaction
- Fixed
redactByField()to use redacted property values for all message placeholders, not just those directly matching field patterns. Previously, named placeholders like{args}would use original values even when containing nested sensitive fields (e.g.,args[0].email), exposing sensitive data in the log message. [#99]
Version 1.1.6
Released on December 18, 2025.
@logtape/redaction
- Fixed
redactByField()to recursively process arrays, ensuring that sensitive fields inside objects within arrays are properly redacted. Previously, arrays were not traversed, so sensitive data in nested structures like{ args: [{ email: "..." }] }would not be redacted. [#99]
Version 1.1.5
Released on December 18, 2025.
- Reduced npm package sizes by excluding unnecessary source files from published packages. Previously, the src/ directory was included in npm packages, which increased download sizes without providing runtime value. [#112]
Version 1.1.4
Released on November 29, 2025.
@logtape/redaction
- Fixed
redactByField()to properly redact sensitive fields in objects passed via the{*}wildcard placeholder. Previously, the original object reference was kept in the message array, exposing sensitive field values even when they were redacted in properties. [#99]
Version 1.1.3
Released on November 28, 2025.
@logtape/redaction
- Fixed
redactByField()to also redact sensitive values in themessagearray, not just inproperties. Previously, sensitive field values were exposed in the log message even when the corresponding property was redacted. [#99]
Version 1.1.2
Released on October 22, 2025.
- Fixed Vercel Edge Runtime compatibility issue where LogTape caused “Node.js API is used (process.on) which is not supported in the Edge Runtime” error during configuration. Implemented defense-in-depth approach with both
EdgeRuntimeglobal variable detection and dynamic bracket notation access (proc?.["on"]) to avoid static analysis detection while ensuring runtime safety. [#92]
Version 1.1.1
Released on September 18, 2025.
@logtape/pretty
- Fixed a bug where logs with long property keys would cause the formatter to fail, resulting in no output being displayed. The issue occurred when property keys exceeded the indentation width, causing negative padding calculations that threw a
RangeError. [#87]
Version 1.1.0
Released on September 11, 2025.
@logtape/logtape
Added “fingers crossed” logging feature that buffers debug logs in memory and only outputs them when a trigger event occurs, reducing log noise while preserving context for debugging. [#59]
- Added
fingersCrossed()function that implements the fingers crossed logging pattern with support for trigger levels, buffer management, and category isolation. - Added
FingersCrossedOptionsinterface for configuring fingers crossed behavior with options for trigger level, buffer size, and category isolation modes.
- Added
Added
Logger.emit()method for emitting log records with custom fields, particularly useful for integrating external logs while preserving their original timestamps. [#78]
@logtape/file
Changed
getStreamFileSink()to implementAsyncDisposableinstead ofDisposable.Fixed flaky behavior in high-volume logging scenarios where some log records could be lost during sink disposal. The sink now ensures all data is fully written to disk before disposal completes.
@logtape/pretty
- Added
PrettyFormatterOptions.propertiesoption for displayingLogRecord.properties(structured data). [#69, #70 by Matthias Feist]
@logtape/sentry
Changed the type of the
getSentrySink()function to accept any Sentry client implementing the public capture APIs (was(client?: Client) => Sink). Introduced a structuralSentryClientLikeinterface to avoid nominal type conflicts across differing@sentry/coreinstances. [#80 by Sora Morimoto]Fixed preservation of Sentry template metadata by returning a
ParameterizedStringfrom the internalgetParameterizedString()so thatcaptureMessagereceives the templated form and breadcrumbs/formatting can leverage__sentry_template_*metadata. [#80 by Sora Morimoto]Fixed cross-runtime compatibility by removing an unnecessary
node:utiltype import referenced only by documentation, avoiding module resolution issues outside Node.js. [#80 by Sora Morimoto]
Version 1.0.6
Released on October 22, 2025.
Fixed Vercel Edge Runtime compatibility issue where LogTape caused “Node.js API is used (process.on) which is not supported in the Edge Runtime” error during configuration. Implemented defense-in-depth approach with both
EdgeRuntimeglobal variable detection and dynamic bracket notation access (proc?.["on"]) to avoid static analysis detection while ensuring runtime safety. [#92]Changed
getStreamFileSink()in @logtape/file package to returnSink & AsyncDisposableinstead ofSink & Disposablefor proper asynchronous stream cleanup. The previous synchronous disposal did not wait for streams to finish flushing data to disk, causing incomplete writes in high-volume logging scenarios and resource leaks. The new async disposal properly waits for both the stream ‘finish’ event and file handle closure, ensuring all data is written and resources are cleaned up correctly.
Version 1.0.5
Released on September 10, 2025.
- The satellite packages (@logtape/file, @logtape/otel, @logtape/redaction, @logtape/sentry, and @logtape/syslog) now properly specify version compatibility constraints for their peer dependency on @logtape/logtape, ensuring consumers install compatible versions of the core package.
Version 1.0.4
Released on July 6, 2025.
- Fixed a bug where the optimized code paths in
getJsonLinesFormatter()did not output newline characters between JSON objects, violating the JSON Lines specification. This completes the fix that was partially addressed in version 1.0.3.
Version 1.0.3
Released on July 6, 2025.
- Fixed a bug where
jsonLinesFormatterand the formatter returned bygetJsonLinesFormatter()did not output newline characters between JSON objects, violating the JSON Lines specification that requires one JSON object per line.
Version 1.0.2
Released on July 4, 2025.
- Fixed Vercel Edge Functions compatibility issue where LogTape caused Node.js API warnings due to
process.onusage detection. Refactored process access to use type-safeglobalThiscasting instead of@ts-ignoredirective. [#66, #67 by Martin Petrovsky]
Version 1.0.1
Released on July 3, 2025.
Fixed React Native compatibility issue in @logtape/pretty package where top-level Node.js imports caused build failures. Replaced direct
node:utilimports with platform-specific utilities using conditional module loading via package.json imports map. [#63]Fixed compatibility issue with Cloudflare Workers where
process.on()is not available, causing configuration to fail withprocess.on is not a functionerror. LogTape now checks forprocess.on()availability before attempting to register exit handlers. [#64, #65 by Martin Petrovsky]
Version 1.0.0
Released on June 22, 2025.
Added
getLogLevels()function to retrieve all available log levels.Added
LogMethodtype for better type inference of logger methods.Added
nonBlockingoption togetConsoleSink(),getStreamSink(),getFileSink(), andgetRotatingFileSink()for high-performance logging scenarios. When enabled, log records are buffered and flushed in the background, preventing blocking of the main thread.- Console and stream sinks accept
nonBlocking?: boolean | { bufferSize?: number; flushInterval?: number }option. - File sinks accept
nonBlocking?: booleanoption. - Default buffer size is 100 records for console/stream sinks and background flushing for file sinks.
- Default flush interval is 100ms for console/stream sinks.
- Console sink returns
Sink & Disposablein non-blocking mode. - Stream and file sinks return
Sink & AsyncDisposablein non-blocking mode. - Buffer-full flushes are now asynchronous (non-blocking) instead of synchronous to maintain performance during high-volume logging.
- Console and stream sinks include automatic buffer overflow protection that prevents unbounded memory growth by dropping oldest records when buffer exceeds 2x the configured size.
- Errors during background flushing are silently ignored to prevent application disruption.
- Console and stream sinks accept
Added
getStreamFileSink()function in @logtape/file package for high-performance file logging using Node.js PassThrough streams.- Added
StreamFileSinkOptionsinterface for configuring stream-based file sink behavior. - Uses PassThrough streams piped to WriteStreams for optimal I/O performance with automatic backpressure management and non-blocking writes.
- Optimized for high-volume logging scenarios with superior throughput compared to standard file sinks.
- Simple configuration with
highWaterMark(default: 16384 bytes) and optional customformatteroptions. - Automatic stream cleanup and proper resource disposal via
Disposableinterface. - Ideal for production applications requiring high-performance file logging without complex buffering configuration.
- Added
Added
fromAsyncSink()function to convert async sinks to regular sinks with proper async handling.- Added
AsyncSinktype:(record: LogRecord) => Promise<void>. fromAsyncSink()chains async operations to ensure order preservation.- Errors in async sinks are caught to prevent breaking the promise chain.
- Returns a sink with
AsyncDisposablesupport that waits for all pending operations on disposal.
- Added
Added @logtape/cloudwatch-logs package for AWS CloudWatch Logs integration. [#48, #49]
- Added
getCloudWatchLogsSink()function to send logs to AWS CloudWatch Logs. - Added
CloudWatchLogsSinkOptionsinterface for configuration. - Supports intelligent batching up to 10,000 events or 1MiB per batch.
- Includes exponential backoff retry strategy for error handling.
- Works with existing CloudWatch Logs clients or creates new ones automatically.
- Supports custom AWS credentials and regions.
- Added
formatteroption to support custom text formatters, includingjsonLinesFormatter()for enhanced CloudWatch Logs Insights querying capabilities with dot notation support.
- Added
Added @logtape/windows-eventlog package for Windows Event Log integration. [#47, #50]
- Added
getWindowsEventLogSink()function to send logs to Windows Event Log. - Added
WindowsEventLogSinkOptionsinterface for configuration. - Cross-runtime support: Works with Deno, Node.js, and Bun on Windows.
- Uses runtime-optimized FFI implementations: Deno FFI, koffi for Node.js, and Bun FFI for maximum performance.
- Supports all LogTape log levels with proper Event Log type mapping (Error, Warning, Information).
- Includes structured logging support with formatted context information.
- Added
validateWindowsPlatform()function for platform validation. - Added
WindowsPlatformErrorandWindowsEventLogErrorfor proper error handling. - Platform-restricted installation (Windows only) for safety.
- Includes PowerShell-based test verification for actual Event Log integration.
- Added
Added @logtape/pretty package for beautiful console formatting designed for local development. [#46, #51]
- Added
getPrettyFormatter()function to create visually appealing log formatters with colorful icons, smart category truncation, and perfect column alignment. - Added
prettyFormatterconstant for quick setup with sensible defaults. - Added
PrettyFormatterOptionsinterface for extensive customization. - Features Signale-inspired design with emojis for each log level: 🔍 trace, 🐛 debug, ✨ info, ⚠️ warning, ❌ error, 💀 fatal.
- Includes smart category truncation that preserves important context while maintaining layout (e.g.,
app·server…middleware). - Supports true color terminals with rich color schemes and dimmed text for enhanced readability.
- Provides optional timestamp display, custom icons, color control, and flexible layout options.
- Supports multiple text styles combination (e.g.,
["bold", "underline"]) for level, category, message, and timestamp formatting. - Includes word wrapping feature with proper indentation alignment to maintain visual consistency for long messages.
- Optimized for development environments with focus on visual clarity and developer experience.
- Added
Added @logtape/adaptor-pino package for integrating LogTape with Pino logging infrastructure. [#52]
- Added
getPinoSink()function to forward LogTape log records to Pino loggers. - Added
PinoSinkOptionsinterface for configuring the adapter behavior. - Added
CategoryOptionsinterface for customizing category formatting in Pino log messages. - Added
install()function for convenient auto-configuration with custom Pino logger and configuration options. - Supports configurable category display with position (
start/end), decorators ([],(),<>,{},:,-,|,/, or none), and custom separators for multi-part categories. - Maps LogTape log levels to equivalent Pino levels.
- Preserves LogTape's structured logging properties as Pino fields.
- Enables seamless adoption of LogTape-enabled libraries in applications using Pino without requiring logging infrastructure changes.
- Added
Added @logtape/adaptor-winston package for integrating LogTape with winston logging infrastructure. [#52]
- Added
getWinstonSink()function to forward LogTape log records to winston loggers. - Added
WinstonSinkOptionsinterface for configuring the adapter behavior. - Added
CategoryOptionsinterface for customizing category formatting in winston log messages. - Added
install()function for convenient auto-configuration with optional custom winston logger and configuration options. - Added
install.tsmodule for automatic setup via simple import. - Supports configurable category display with position (
start/end), decorators ([],(),<>,{},:,-,|,/, or none), and custom separators for multi-part categories. - Maps LogTape log levels to equivalent winston levels with customizable level mapping.
- Supports custom value formatters for interpolated values in log messages.
- Preserves LogTape's structured logging properties as winston fields.
- Enables seamless adoption of LogTape-enabled libraries in applications using winston without requiring logging infrastructure changes.
- Added
Fixed browser support for @logtape/otel package by removing direct
node:processdependency. [#53]- Replaced
node:processimport with cross-runtime environment variable access that works in Deno, Node.js, and browsers. - Changed tsdown platform setting from
"node"to"neutral"to enable browser compatibility. - The
getOpenTelemetrySink()function now works in all JavaScript runtimes without throwing module resolution errors.
- Replaced
Removed the deprecated
LoggerConfig.levelproperty. UseLoggerConfig.lowestLevelinstead for setting the minimum log level, or useLoggerConfig.filtersfor more advanced filtering.
Version 0.12.3
Released on September 10, 2025.
- The satellite packages (@logtape/file, @logtape/otel, @logtape/redaction, @logtape/sentry, and @logtape/syslog) now properly specify version compatibility constraints for their peer dependency on @logtape/logtape, ensuring consumers install compatible versions of the core package.
Version 0.12.2
Released on July 6, 2025.
- Fixed a bug where
jsonLinesFormatterand the formatter returned bygetJsonLinesFormatter()did not output newline characters between JSON objects, violating the JSON Lines specification that requires one JSON object per line.
Version 0.12.1
Released on June 19, 2025.
Fixed module resolution issues in CommonJS environments and bundlers like Vite by properly configuring conditional exports for types.
- Updated all package.json exports to use conditional
typesexports with separate.d.tsfiles for ESM imports and.d.ctsfiles for CommonJS requires. - This resolves runtime errors in frameworks like SvelteKit that require proper CommonJS modules for modules imported in CommonJS contexts.
- Updated all package.json exports to use conditional
Version 0.12.0
Released on June 15, 2025.
Added the
"trace"severity level, which is lower than"debug". [#24]- Added
"trace"to theLogLevelunion type. - Added
Logger.trace()method.
- Added
Added
Logger.warning()method which is an alias forLogger.warn(). [#44]Added
bufferSizeandflushIntervaloptions toFileSinkOptionsfor configurable buffering in file sinks.getFileSink()andgetRotatingFileSink()functions now accept abufferSizeoption to control write buffering behavior.getFileSink()andgetRotatingFileSink()functions now accept aflushIntervaloption to control the time-based flushing of the buffer to disk.- When
bufferSizeis 0 or negative, writes are immediate without buffering. - When
bufferSizeis positive, log entries are buffered until the buffer size is exceeded, then flushed to disk. - Default buffer size is 8192 characters for improved performance.
- Buffer content is automatically flushed when the sink is disposed.
- When
flushIntervalis 0 or negative, the time-based flushing is disabled. - Default
flushIntervalis 5000 milliseconds (5 seconds) for periodic flushing.
Added @logtape/syslog package for sending log messages to syslog servers using RFC 5424 format.
- Added
getSyslogSink()function to create syslog sinks with support for both UDP and TCP protocols. - Supports all standard RFC 5424 facilities (
kern,user,mail,daemon,local0–7, etc.) and automatic priority calculation. - Includes structured data support for log record properties with proper RFC 5424 escaping of special characters.
- Cross-runtime compatibility with Deno, Node.js, and Bun.
- Configurable connection timeouts, custom hostnames, and application names.
- Added
Now @logtape/otel, @logtape/sentry, and @logtape/syslog packages are released along with @logtape/logtape package. This means they share the same version number and changelog. This is to ensure that the packages are always compatible with each other and to simplify the release process.
Improved build and test infrastructure by migrating from dnt to tsdown for npm package bundling. [#43]
Version 0.11.1
Released on July 6, 2025.
- Fixed a bug where
jsonLinesFormatterand the formatter returned bygetJsonLinesFormatter()did not output newline characters between JSON objects, violating the JSON Lines specification that requires one JSON object per line.
Version 0.11.0
Released on June 2, 2025.
Loggers now allow to interpolate all properties at once through the special placeholder
{*}. This is useful for logging objects with many properties without having to specify each property name in the message template.Logger.debug(),Logger.info(),Logger.warn(),Logger.error(), andLogger.fatal()methods now accept a message template with the{*}placeholder. Unless there is a property with the name*, the{*}placeholder will be replaced with a stringified version of theLogRecord.propertiesobject.- As a shorthand, overloads of
Logger.debug(),Logger.info(),Logger.warn(),Logger.error(), andLogger.fatal()methods that accept an object as the first argument now treat the object as a message template with the{*}placeholder. This is equivalent to calling the method with a message template of{*}and the object as the second argument.
Added the built-in JSON Lines formatter.
- Added
jsonLinesFormatter()function. - Added
getJsonLinesFormatter()function. - Added
JsonLinesFormatterOptionsinterface.
- Added
Version 0.10.0
Released on May 19, 2025.
Added
@logtape/redactionpackage for redacting sensitive information from log records.- Added
redactByField()function. - Added
FieldPatterntype. - Added
FieldPatternstype. - Added
FieldRedactionOptionsinterface. - Added
DEFAULT_REDACT_FIELDSconstant. - Added
redactByPattern()function. - Added
RedactionPatterninterface. - Added
RedactionPatternstype. - Added
CREDIT_CARD_NUMBER_PATTERNconstant. - Added
EMAIL_ADDRESS_PATTERNconstant. - Added
JWT_PATTERNconstant. - Added
KR_RRN_PATTERNconstant. - Added
US_SSN_PATTERNconstant.
- Added
The text formatter now can omit the timestamp from the formatted message. [#35 by Ooker]
- Changed the type of the
TextFormatterOptions.timestampoption to"date-time-timezone" | "date-time-tz" | "date-time" | "time-timezone" | "time-tz" | "time" | "date" | "rfc3339" | "none" | "disabled" | ((ts: number) => string | null)(was"date-time-timezone" | "date-time-tz" | "date-time" | "time-timezone" | "time-tz" | "time" | "date" | "rfc3339" | ((ts: number) => string)). - Changed the type of the
FormattedValues.timestampproperty tostring | null(wasstring).
- Changed the type of the
Added
FileSinkOptions.lazyoption. [#38, #39 by Rickey Ward]The
configure()andconfigureSync()functions now check for duplicate logger configurations with the same category and throw aConfigErrorwhen detected. This prevents unintended overriding of logger configurations when configuring multiple loggers with the same category. [#41]
Version 0.9.2
Released on May 15, 2025.
- Fixed a bug where importing
@logtape/logtapethrew aReferenceErroron Node.js or Bun when LogTape was installed from JSR (instead of npm). [#42]
Version 0.9.1
Released on April 24, 2025.
- Fixed a CORS error when using LogTape in web browser environments like Fresh islands components due to importing Node.js
node:utilmodule. [#40]
Version 0.9.0
Released on March 1, 2025.
Moved file sinks and rotating file sinks to separate packages. [#19, #27, #28]
- Moved
getFileSink()function to@logtape/filepackage. - Moved
FileSinkOptionsinterface to@logtape/filepackage. - Moved
getRotatingFileSink()function to@logtape/filepackage. - Moved
RotatingFileSinkOptionsinterface to@logtape/filepackage.
- Moved
Added synchronous versions of configuration functions. [#12, #29 by Murph Murphy]
- Added
configureSync()function. - Added
disposeSync()function. - Added
resetSync()function.
- Added
Added
ConsoleSinkOptions.levelMapoption.
Version 0.8.2
Released on February 11, 2025.
- Fixed a bug of text formatters where they truncated string and array values in the formatted message. [#30]
Version 0.8.1
Released on February 1, 2025.
- Fixed a bug where when a child logger is configured with a lower
lowestLevelthan its parent logger, a log record with a severity level lower than the parent logger'slowestLeveland higher than the child logger'slowestLevelwould not be filtered out by the parent logger.
Version 0.8.0
Released on November 20, 2024.
Renewed the API to configure the lowest severity level of loggers. [#26]
- Added
LoggerConfig.lowestLevelproperty. - Deprecated
LoggerConfig.levelproperty in favor ofLoggerConfig.lowestLevel.
- Added
Added
compareLogLevel()function.
Version 0.7.2
Released on February 11, 2025.
- Fixed a bug of text formatters where they truncated string and array values in the formatted message. [#30]
Version 0.7.1
Released on October 30, 2024.
- The
withContext()function no more throws an error even if nocontextLocalStorageis configured. Instead, it will log a warning message to the["logtape", "meta"]logger.
Version 0.7.0
Released on October 29, 2024.
Introduced implicit contexts.
- Added
withContext()function. - Added
Config.contextLocalStorageoption. - Added
ContextLocalStorageinterface.
- Added
Version 0.6.5
Released on February 11, 2025.
- Fixed a bug of text formatters where they truncated string and array values in the formatted message. [#30]
Version 0.6.4
Released on October 28, 2024.
- Fixed a build warning due to importing
node:fsandnode:utilmodules on Next.js' client rendering. [#19] - Made it to work on Deno 2.0.0 or higher.
Version 0.6.3
Released on October 3, 2024.
- Fixed a build error due to importing
node:fsandnode:utilmodules on Next.js' client rendering.
Version 0.6.2
Released on September 24, 2024.
Version 0.6.1
Released on September 24, 2024.
Version 0.6.0
Released on September 24, 2024.
Loggers now can override sinks of their ascendants. Still, they inherit the sinks of their ascendants by default. [#15]
- Added
LoggerConfig.parentSinksproperty.
- Added
Placeholders in message templates now forgive leading and trailing spaces. However, if a property with exactly the same name exists, it will be prioritized over space-trimmed properties. [#16]
Added
LogRecord.rawMessageproperty. [#17]Built-in text formatters now can be customized with a
TextFormatterOptionsobject. [#13]- Added
TextFormatterOptionsinterface. - Added
FormattedValuesinterface. - Added
getTextFormatter()function. - Added
AnsiColortype. - Added
AnsiStyletype. - Added
AnsiColorFormatterOptionsinterface. - Added
getAnsiColorFormatter()function.
- Added
Version 0.5.4
Released on September 24, 2024.
Version 0.5.3
Released on September 24, 2024.
Version 0.5.2
Released on September 23, 2024.
Version 0.5.1
Released on September 10, 2024.
Fixed a bug of
defaultTextFormatter()function where it rendered embedded values in the message as JSON instead ofutil.inspect()on Node.js and Bun.Fixed a bug of
ansiColorFormatter()function where it failed to colorize embedded values in the message on Node.js and Bun.
Version 0.5.0
Released on August 29, 2024.
LogTape now provides contexts for loggers. [#7, #8]
- Added
Logger.with()method.
- Added
The console sink now can take a
TextFormatterbesides aConsoleFormatterfor formatting log records.- The type of
ConsoleSinkOptions.formatterbecameConsoleFormatter | TextFormatter | undefined(wasConsoleFormatter | undefined).
- The type of
Added
ansiColorFormatter()function.configure()function'sfiltersoption became optional.- The type of
Config.filtersbecameRecord<string, FilterLike> | undefined(wasRecord<string, FilterLike>).
- The type of
Version 0.4.3
Released on August 22, 2024.
- Fixed a bug where
getRotatingFileSink()function had failed to create a new log file when there's no log file to rotate yet. [#9]
Version 0.4.2
Released on July 15, 2024.
LogTape now works well on edge functions. [#5]
- The npm version of LogTape no more depends on
node:stream/webmodule. - LogTape now works well with JavaScript runtimes that do not support
node:fsmodule. - LogTape now works well with JavaScript runtimes that do not support
WeakRefclass. - Got rid of
eval()from LogTape.
- The npm version of LogTape no more depends on
Version 0.4.1
Released on July 2, 2024.
- Fixed a bug where LogTape failed to load under Node.js when incorporated in a project from JSR. [#3, #4 by Kitson Kelly]
Version 0.4.0
Released on May 7, 2024.
Version 0.3.1
Released on May 7, 2024.
- Fixed a bug where two or more versions of LogTape were imported in the same runtime, the
Loggerinstances would not be shared between them. This was caused by theLoggerinstances being stored in a module-level variable.
Version 0.3.0
Released on April 22, 2024.
- Added
parseLogLevel()function. - Added
isLogLevel()function. - Added
getConfig()function. - Added
withFilter()function.
Version 0.2.3
Released on May 7, 2024.
- Fixed a bug where two or more versions of LogTape were imported in the same runtime, the
Loggerinstances would not be shared between them. This was caused by theLoggerinstances being stored in a module-level variable.
Version 0.2.2
Released on April 21, 2024.
- Fixed a bug where the configured sinks and filters were reset after some inactivity. This was caused by garbage collection of the
Loggerinstances. TheLoggerinstances are now kept alive by an internal set of strong references until explicitlyreset()is called.
Version 0.2.1
Released on April 20, 2024.
- Removed
FileSinkDriverinterface. - Added
RotatingFileSinkOptionsinterface.
Version 0.2.0
Released on April 20, 2024.
Sinks now can be asynchronously disposed of. This is useful for sinks that need to flush their buffers before being closed.
- Added
dispose()function. - The return type of
configure()function becamePromise<void>(wasvoid). - The return type of
reset()function becamePromise<void>(wasvoid). - Configured sinks that implement
AsyncDisposableare now disposed of asynchronously when the configuration is reset or the program exits.
- Added
The return type of
getStreamSink()function becameSink & AsyncDisposable(wasSink & Disposable).Added
getRotatingFileSink()function.
Version 0.1.2
Released on May 7, 2024.
- Fixed a bug where two or more versions of LogTape were imported in the same runtime, the
Loggerinstances would not be shared between them. This was caused by theLoggerinstances being stored in a module-level variable.
Version 0.1.1
Released on April 21, 2024.
- Fixed a bug where the configured sinks and filters were reset after some inactivity. This was caused by garbage collection of the
Loggerinstances. TheLoggerinstances are now kept alive by an internal set of strong references until explicitlyreset()is called.
Version 0.1.0
Initial release. Released on April 19, 2024.