LogTape 1.0.0 출시 발표

洪 民憙 (Hong Minhee) @hongminhee@hackers.pub

LogTape이란 무엇인가요?

LogTape은 현대 JavaScript 생태계를 위해 특별히 설계된 로깅 라이브러리입니다. 의존성이 전혀 없는 아키텍처, Node.js, Deno, Bun, 브라우저 및 엣지 함수에 걸친 범용 런타임 지원, 그리고 라이브러리 작성자가 사용자에게 부담을 주지 않고 로깅을 추가할 수 있는 라이브러리 우선 설계 철학으로 차별화됩니다. LogTape이 구성되지 않은 경우, 로깅 호출은 사실상 성능에 영향을 미치지 않아 진정으로 방해가 되지 않는 유일한 로깅 솔루션입니다.

LogTape의 기능과 철학에 대한 포괄적인 개요는 소개 가이드를 참조하세요.

중요한 이정표 달성

LogTape 1.0.0 출시를 발표하게 되어 기쁩니다. 이는 라이브러리 개발의 중요한 이정표를 나타냅니다. 이번 릴리스는 API 안정성과 장기 지원에 대한 우리의 약속을 보여줍니다. 1.0.0 지정은 LogTape의 핵심 API가 이제 안정적이고 프로덕션 사용 준비가 되었으며, 향후 주요 변경사항은 시맨틱 버저닝 원칙을 따를 것임을 의미합니다.

이 이정표는 수개월간의 개선, 커뮤니티 피드백 및 실제 사용 경험을 바탕으로 LogTape을 JavaScript 애플리케이션과 라이브러리를 위한 성숙하고 신뢰할 수 있는 로깅 솔루션으로 확립했습니다.

주요 새 기능

고성능 로깅 인프라

LogTape 1.0.0은 고처리량 프로덕션 환경을 위해 설계된 여러 성능 지향 기능을 도입합니다. 새로운 논블로킹 싱크(non-blocking sink) 옵션을 사용하면 콘솔, 스트림 및 파일 싱크가 로그 레코드를 버퍼링하고 비동기적으로 플러시할 수 있어, 로깅 작업이 애플리케이션의 메인 스레드를 차단하지 않습니다.

import { configure, getConsoleSink } from "@logtape/logtape";

await configure({
  sinks: {
    console: getConsoleSink({ 
      nonBlocking: {
        bufferSize: 1000,
        flushInterval: 50
      }
    })
  },
  // ...
});

새로운 fromAsyncSink() 함수는 LogTape의 동기식 싱크 인터페이스를 유지하면서 비동기 로깅 작업을 통합하는 깔끔한 방법을 제공합니다. 이를 통해 애플리케이션을 차단하지 않고 원격 서버나 데이터베이스에 로그를 보내는 등의 시나리오가 가능해집니다.

import { fromAsyncSink } from "@logtape/logtape";

const webhookSink = fromAsyncSink(async (record) => {
  await fetch("https://logs.example.com", {
    method: "POST",
    body: JSON.stringify(record)
  });
});

파일 작업에 특화된 기능으로, @logtape/file 패키지의 새로운 getStreamFileSink() 함수는 Node.js PassThrough 스트림을 활용하여 자동 백프레셔(backpressure) 관리와 함께 최적의 I/O 성능을 제공합니다.

새로운 싱크 통합

이번 릴리스는 두 가지 주요 새 싱크 패키지를 통해 LogTape의 통합 기능을 크게 확장합니다. @logtape/cloudwatch-logs 패키지는 AWS CloudWatch Logs와의 직접 통합을 가능하게 하며, 지능적인 배치 처리, 지수 백오프 재시도 전략, JSON Lines 형식을 통한 구조화된 로깅 지원 기능을 제공합니다.

import { getCloudWatchLogsSink } from "@logtape/cloudwatch-logs";

const sink = getCloudWatchLogsSink({
  logGroupName: "/aws/lambda/my-function",
  logStreamName: "my-stream",
  region: "us-east-1"
});

@logtape/windows-eventlog 패키지는 Deno, Node.js 및 Bun에 걸친 크로스 런타임 호환성과 함께 네이티브 Windows 이벤트 로그 지원을 제공합니다. 이 통합은 적절한 오류 처리와 리소스 정리를 유지하면서 최대 성능을 위해 런타임 최적화된 FFI 구현을 사용합니다.

아름다운 개발 경험

새로운 @logtape/pretty 패키지는 콘솔 로깅을 로컬 개발을 위해 특별히 설계된 시각적으로 매력적인 경험으로 변환합니다. Signale에서 영감을 받아, 각 로그 레벨에 대한 다채로운 이모지, 중요한 컨텍스트를 보존하는 스마트 카테고리 축약, 로그를 쉽게 스캔할 수 있게 해주는 완벽한 열 정렬 기능을 제공합니다.

이모지와 완벽한 정렬이 있는 다채로운 콘솔 로그를 보여주는 LogTape pretty 포맷터 출력

import { configure, getConsoleSink } from "@logtape/logtape";
import { prettyFormatter } from "@logtape/pretty";

await configure({
  sinks: {
    console: getConsoleSink({ formatter: prettyFormatter })
  },
  // ...
});

위에서 볼 수 있듯이, pretty 포맷터는 풍부한 색상 구성표, 구성 가능한 아이콘, 긴 메시지에도 시각적 일관성을 유지하는 지능적인 단어 줄바꿈을 갖춘 트루 컬러 터미널을 지원합니다.

생태계 통합

아마도 가장 중요한 것은, LogTape 1.0.0이 LogTape의 라이브러리 친화적 설계와 기존 로깅 인프라 사이의 격차를 해소하는 어댑터 패키지를 도입한다는 점입니다. @logtape/adaptor-winston@logtape/adaptor-pino 패키지를 통해 이러한 기존 로깅 라이브러리를 사용하는 애플리케이션은 기존 설정을 변경하지 않고도 LogTape 지원 라이브러리를 원활하게 통합할 수 있습니다.

// winston과 빠른 설정
import "@logtape/adaptor-winston/install";
// 또는 사용자 정의 구성으로
import { install } from "@logtape/adaptor-winston";
import winston from "winston";

const logger = winston.createLogger({/* 당신의 설정 */});
install(logger);

이러한 어댑터는 LogTape의 구조화된 로깅 기능을 유지하면서 모든 것을 선호하는 로깅 시스템을 통해 라우팅하여, 기존 애플리케이션에서 LogTape 지원 라이브러리의 도입을 원활하게 만듭니다.

개발자 경험 개선

이번 릴리스에는 LogTape을 사용하는 개발자를 위한 여러 가지 품질 개선 사항이 포함되어 있습니다. 새로운 getLogLevels() 함수는 사용 가능한 모든 로그 레벨에 대한 프로그래밍 방식의 접근을 제공하며, LogMethod 타입은 로깅 메서드에 대한 더 나은 타입 추론을 제공합니다.

브라우저 호환성이 개선되었으며, 특히 Node.js 특정 임포트로 인해 이전에 브라우저 환경에서 문제가 있었던 @logtape/otel 패키지가 개선되었습니다. 이제 이 패키지는 모듈 해결 오류를 발생시키지 않고 모든 JavaScript 런타임에서 원활하게 작동합니다.

주요 변경사항 및 마이그레이션 가이드

LogTape 1.0.0에는 한 가지 주목할 만한 주요 변경사항이 포함되어 있습니다: 더 이상 사용되지 않는 LoggerConfig.level 속성의 제거입니다. 이 속성은 버전 0.8.0에서 더 설명적인 LoggerConfig.lowestLevel 속성을 선호하여 사용 중단되었습니다.

구성에서 여전히 이전 속성을 사용하는 경우, 간단히 이름을 바꾸면 됩니다:

// 이전 (사용 중단됨)
{ category: ["app"], level: "info", sinks: ["console"] }
// 이후
{ category: ["app"], lowestLevel: "info", sinks: ["console"] }

더 복잡한 필터링 요구 사항의 경우, 더 많은 유연성을 제공하고 부모 로거로부터의 상속을 지원하는 LoggerConfig.filters 옵션을 대신 사용하는 것을 고려하세요.

완전한 패키지 생태계

LogTape 1.0.0은 로깅 인프라의 다양한 측면을 다루는 11개의 특화된 패키지로 구성된 포괄적인 패키지 생태계의 정점을 나타냅니다. 이러한 모듈식 접근 방식을 통해 필요한 패키지만 설치할 수 있어, 의존성 공간을 최소화하면서도 필요할 때 강력한 로깅 기능에 접근할 수 있습니다.

패키지 JSR npm 설명
@logtape/logtape JSR npm 핵심 로깅 기능
@logtape/adaptor-pino JSR npm Pino 어댑터
@logtape/adaptor-winston JSR npm winston 어댑터
@logtape/cloudwatch-logs JSR npm AWS CloudWatch Logs 싱크
@logtape/file JSR npm 파일 싱크
@logtape/otel JSR npm OpenTelemetry 싱크
@logtape/pretty JSR npm 아름다운 텍스트 포맷터
@logtape/redaction JSR npm 데이터 편집
@logtape/sentry JSR npm Sentry 싱크
@logtape/syslog JSR npm Syslog 싱크
@logtape/windows-eventlog JSR npm Windows 이벤트 로그 싱크

시작하기

LogTape을 처음 사용하든 이전 버전에서 업그레이드하든, 1.0.0 버전으로 시작하는 것은 간단합니다. 새 프로젝트의 경우, 간단한 구성으로 시작하여 필요한 패키지와 기능을 점진적으로 추가하세요:

import { configure, getConsoleSink } from "@logtape/logtape";

await configure({
  sinks: { console: getConsoleSink() },
  loggers: [
    { category: "my-app", lowestLevel: "info", sinks: ["console"] }
  ]
});

winston이나 Pino를 사용하는 기존 애플리케이션은 적절한 어댑터를 설치하여 LogTape 지원 라이브러리의 이점을 즉시 활용할 수 있습니다. 포괄적인 마이그레이션 가이드와 상세한 기능 문서는 문서 사이트를 방문하세요.

1.0.0 릴리스는 단순한 버전 번호가 아니라 프로덕션 애플리케이션에 필요한 안정성과 성숙도에 대한 약속을 나타냅니다. 여러분이 LogTape으로 무엇을 구축할지 기대됩니다.

8

No comments

If you have a fediverse account, you can comment on this article from your own instance. Search https://hackers.pub/ap/articles/019795aa-3487-7467-97ea-4250e721e8c2 on your instance and reply to it.