안녕하세요, 여러분! 오늘은 여러분의 프로젝트에 꼭 필요한 새로운 로깅 라이브러리를 소개해드리려고 합니다. 바로 LogTape입니다.
LogTape은 JavaScript와 TypeScript를 위한 로깅 라이브러리입니다. 간단하면서도 유연한 로깅 시스템을 제공하는데, 특히 라이브러리 개발자들이나 여러 런타임 환경에서 작업하는 개발자들에게 매우 유용합니다.
제로 의존성: LogTape은 외부 의존성이 하나도 없습니다. 무거운 의존성을 멀리하고 가벼운 라이브러리를 좋아하는 분들에게 안성맞춤입니다.
라이브러리 지원: 앱뿐만 아니라 라이브러리에서도 사용할 수 있도록 설계되었습니다. 라이브러리 사용자들에게 로깅 기능을 제공하기가 훨씬 쉬워졌죠.
다양한 런타임 지원: Node.js, Bun, Deno, Cloudflare Works 같은 에지 함수, 브라우저 등 여러 환경을 지원합니다. 코드를 변경할 필요 없이 여러 플랫폼에서 그대로 사용할 수 있어요!
구조화된 로깅: 메시지와 함께 구조화된 데이터도 로깅할 수 있습니다. 로그 분석이 한결 수월해집니다.
계층적 카테고리: 계층적 카테고리 시스템으로 로거를 관리합니다. 로그 레벨을 아주 세세하게 제어할 수 있습니다.
템플릿 리터럴 지원: 템플릿 리터럴로 로그 메시지를 작성할 수 있어, 읽기 쉬운 로그 메시지를 만들 수 있습니다.
간단한 싱크(sink) 추가: 새로운 싱크(로그 출력 대상)를 쉽게 추가할 수 있습니다.
먼저 설치부터 해볼까요?
npm add @logtape/logtape
bun add @logtape/logtape
deno add @logtape/logtape
LogTape을 사용하는 기본적인 방법을 살펴보겠습니다.
import { configure, getConsoleSink, getLogger } from "@logtape/logtape";
// LogTape 설정
await configure({
sinks: { console: getConsoleSink() },
filters: {},
loggers: [
{ category: "my-app", level: "debug", sinks: ["console"] }
]
});
// 로거 생성
const logger = getLogger(["my-app", "my-module"]);
// 로그 메시지 작성
logger.debug`안녕하세요, ${value}!`;
logger.info("이것은 {value}와 함께 하는 info 메시지입니다.", { value });
logger.warn(l => l`${expensiveComputation()}와 함께 하는 경고 메시지입니다.`);
LogTape의 계층적 카테고리 시스템을 사용하면 로그 레벨을 아주 세밀하게 제어할 수 있습니다.
const rootLogger = getLogger("my-app");
const dbLogger = rootLogger.getChild("database");
const apiLogger = rootLogger.getChild("api");
// my-app.database 카테고리의 로그만 디버그 레벨로 설정
await configure({
// ... 다른 설정들 ...
loggers: [
{ category: "my-app", level: "info" },
{ category: ["my-app", "database"], level: "debug" }
]
});
LogTape으로 커스텀 싱크(sink)를 추가하는 것은 매우 간단합니다. 예를 들어, Slack으로 로그를 보내는 싱크를 만들어볼까요?
import { Sink, LogRecord } from "@logtape/logtape";
const slackSink: Sink = (record: LogRecord) => {
const message = record.message.join('');
fetch('https://slack.com/api/chat.postMessage', {
method: 'POST',
headers: { 'Authorization': `Bearer ${SLACK_TOKEN}` },
body: JSON.stringify({
channel: '#logs',
text: `[${record.level.toUpperCase()}] ${message}`
})
});
};
await configure({
sinks: { slack: slackSink },
// ... 다른 설정들 ...
});
LogTape으로 구조화된 데이터를 로깅하는 것도 매우 쉽습니다.
logger.info("사용자 {userId}가 {ip}에서 로그인했습니다", {
userId: user.id,
ip: request.ip,
browser: request.headers['user-agent']
});
이렇게 로깅하면 나중에 로그를 분석할 때 정말 편리해요!
LogTape은 간단하면서도 강력한 기능을 제공하는 로깅 라이브러리입니다. 제로 의존성, 다양한 런타임 지원, 구조화된 로깅 등 현대적인 개발 환경에 꼭 필요한 기능들을 모두 갖추고 있습니다.
여러분의 프로젝트에 LogTape을 한번 써보세요. 로깅이 이렇게 재미있을 수 있다는 걸 느끼실 거예요!
더 자세한 내용은 LogTape GitHub 저장소를 참고해주세요. 여러분의 피드백이나 기여는 언제나 환영입니다!
즐거운 로깅 되세요!