Announcing LogTape 1.0.0

洪 民憙 (Hong Minhee) @hongminhee@hackers.pub
What is LogTape?
LogTape is a logging library designed specifically for the modern JavaScript ecosystem. It stands out with its zero-dependency architecture, universal runtime support across Node.js, Deno, Bun, browsers, and edge functions, and a library-first design philosophy that allows library authors to add logging without imposing any burden on their users. When LogTape isn't configured, logging calls have virtually no performance impact, making it the only truly unobtrusive logging solution available.
For a comprehensive overview of LogTape's capabilities and philosophy, see our introduction guide.
Milestone achievement
We're excited to announce LogTape 1.0.0, marking a significant milestone in the library's development. This release represents our commitment to API stability and long-term support. The 1.0.0 designation signals that LogTape's core APIs are now stable and ready for production use, with any future breaking changes following semantic versioning principles.
This milestone builds upon months of refinement, community feedback, and real-world usage, establishing LogTape as a mature and reliable logging solution for JavaScript applications and libraries.
Major new features
High-performance logging infrastructure
LogTape 1.0.0 introduces several performance-oriented features designed for high-throughput production environments. The new non-blocking sink option allows console, stream, and file sinks to buffer log records and flush them asynchronously, preventing logging operations from blocking your application's main thread.
import { configure, getConsoleSink } from "@logtape/logtape";
await configure({
sinks: {
console: getConsoleSink({
nonBlocking: {
bufferSize: 1000,
flushInterval: 50
}
})
},
// ...
});
The new fromAsyncSink()
function provides a clean way to integrate asynchronous logging operations while maintaining LogTape's synchronous sink interface. This enables scenarios like sending logs to remote servers or databases without blocking your application.
import { fromAsyncSink } from "@logtape/logtape";
const webhookSink = fromAsyncSink(async (record) => {
await fetch("https://logs.example.com", {
method: "POST",
body: JSON.stringify(record)
});
});
For file operations specifically, the new getStreamFileSink()
function in the @logtape/file package leverages Node.js PassThrough streams to deliver optimal I/O performance with automatic backpressure management.
New sink integrations
This release significantly expands LogTape's integration capabilities with two major new sink packages. The @logtape/cloudwatch-logs package enables direct integration with AWS CloudWatch Logs, featuring intelligent batching, exponential backoff retry strategies, and support for structured logging through JSON Lines formatting.
import { getCloudWatchLogsSink } from "@logtape/cloudwatch-logs";
const sink = getCloudWatchLogsSink({
logGroupName: "/aws/lambda/my-function",
logStreamName: "my-stream",
region: "us-east-1"
});
The @logtape/windows-eventlog package brings native Windows Event Log support with cross-runtime compatibility across Deno, Node.js, and Bun. This integration uses runtime-optimized FFI implementations for maximum performance while maintaining proper error handling and resource cleanup.
Beautiful development experience
The new @logtape/pretty package transforms console logging into a visually appealing experience designed specifically for local development. Inspired by Signale, it features colorful emojis for each log level, smart category truncation that preserves important context, and perfect column alignment that makes logs easy to scan.
import { configure, getConsoleSink } from "@logtape/logtape";
import { prettyFormatter } from "@logtape/pretty";
await configure({
sinks: {
console: getConsoleSink({ formatter: prettyFormatter })
},
// ...
});
As shown above, the pretty formatter supports true color terminals with rich color schemes, configurable icons, and intelligent word wrapping that maintains visual consistency even for long messages.
Ecosystem integration
Perhaps most significantly, LogTape 1.0.0 introduces adapter packages that bridge the gap between LogTape's library-friendly design and existing logging infrastructure. The @logtape/adaptor-winston and @logtape/adaptor-pino packages allow applications using these established logging libraries to seamlessly integrate LogTape-enabled libraries without changing their existing setup.
// Quick setup with winston
import "@logtape/adaptor-winston/install";
// Or with custom configuration
import { install } from "@logtape/adaptor-winston";
import winston from "winston";
const logger = winston.createLogger({/* your config */});
install(logger);
These adapters preserve LogTape's structured logging capabilities while routing everything through your preferred logging system, making adoption of LogTape-enabled libraries frictionless for existing applications.
Developer experience enhancements
This release includes several quality-of-life improvements for developers working with LogTape. The new getLogLevels()
function provides programmatic access to all available log levels, while the LogMethod
type offers better type inference for logging methods.
Browser compatibility has been improved, particularly for the @logtape/otel package, which previously had issues in browser environments due to Node.js-specific imports. The package now works seamlessly across all JavaScript runtimes without throwing module resolution errors.
Breaking changes and migration guide
LogTape 1.0.0 includes one notable breaking change: the removal of the deprecated LoggerConfig.level
property. This property was deprecated in version 0.8.0 in favor of the more descriptive LoggerConfig.lowestLevel
property.
If your configuration still uses the old property, simply rename it:
// Before (deprecated)
{ category: ["app"], level: "info", sinks: ["console"] }
// After
{ category: ["app"], lowestLevel: "info", sinks: ["console"] }
For more complex filtering requirements, consider using the LoggerConfig.filters
option instead, which provides more flexibility and supports inheritance from parent loggers.
Complete package ecosystem
LogTape 1.0.0 represents the culmination of a comprehensive package ecosystem, now consisting of 11 specialized packages that address different aspects of logging infrastructure. This modular approach allows you to install only the packages you need, keeping your dependency footprint minimal while accessing powerful logging capabilities when required.
Package | JSR | npm | Description |
---|---|---|---|
@logtape/logtape | JSR | npm | Core logging functionality |
@logtape/adaptor-pino | JSR | npm | Pino adapter |
@logtape/adaptor-winston | JSR | npm | winston adapter |
@logtape/cloudwatch-logs | JSR | npm | AWS CloudWatch Logs sink |
@logtape/file | JSR | npm | File sinks |
@logtape/otel | JSR | npm | OpenTelemetry sink |
@logtape/pretty | JSR | npm | Beautiful text formatter |
@logtape/redaction | JSR | npm | Data redaction |
@logtape/sentry | JSR | npm | Sentry sink |
@logtape/syslog | JSR | npm | Syslog sink |
@logtape/windows-eventlog | JSR | npm | Windows Event Log sink |
Getting started
Whether you're new to LogTape or upgrading from a previous version, getting started with 1.0.0 is straightforward. For new projects, begin with a simple configuration and gradually add the packages and features you need:
import { configure, getConsoleSink } from "@logtape/logtape";
await configure({
sinks: { console: getConsoleSink() },
loggers: [
{ category: "my-app", lowestLevel: "info", sinks: ["console"] }
]
});
Existing applications using winston or Pino can immediately benefit from LogTape-enabled libraries by installing the appropriate adapter. For comprehensive migration guidance and detailed feature documentation, visit our documentation site.
The 1.0.0 release represents not just a version number, but a commitment to the stability and maturity that production applications require. We're excited to see what you'll build with LogTape.