Skip to content
Abstract logger TypeScript interface along with a dummy logger that does nothing, useful as default dummy logger for libraries.
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.

TypeScript Abstract Logger

Travis Coverage Downloads Version License

Abstract logger TypeScript interface along with a dummy logger that does nothing.

Useful for libraries wanting to provide a pluggable logger that does nothing by default (or provide your own default such as bunyan).

  • Matches the built-in console that can be used directly.
  • Also matches bunyan.
  • Provides usage and custom logger example.
  • Written in TypeScript, no need for extra typings.
  • No dependencies, 24 LOC with comments, 100% test coverage.


This package is distributed via npm

npm install ts-log
yarn add ts-log


import { dummyLogger, Logger } from "ts-log";
import * as fs from "fs";

// example class that uses the logger
class Calculator {
  // accept the logger in the constructor, defaulting to dummy logger that does nothing
  public constructor(private readonly log: Logger = dummyLogger) {}

  public sum(a: number, b: number) {
    const result = a + b;

    // call the logger`summing ${a} + ${b} = ${result}`, a, b, result);

    return result;

// example custom logger that logs to a file
class FileLogger implements Logger {
  private readonly fd: number;

  public constructor(filename: string) {
    this.fd = fs.openSync(filename, "a");

  public trace(message?: any, ...optionalParams: any[]): void {
    this.append("TRACE", `${message} ${JSON.stringify(optionalParams)}`);

  public debug(message?: any, ...optionalParams: any[]): void {
    this.append("DEBUG", `${message} ${JSON.stringify(optionalParams)}`);

  public info(message?: any, ...optionalParams: any[]): void {
    this.append("INFO ", `${message} ${JSON.stringify(optionalParams)}`);

  public warn(message?: any, ...optionalParams: any[]): void {
    this.append("WARN ", `${message} ${JSON.stringify(optionalParams)}`);

  public error(message?: any, ...optionalParams: any[]): void {
    this.append("ERROR", `${message} ${JSON.stringify(optionalParams)}`);

  private append(type: string, message: string) {
    fs.writeSync(this.fd, `${new Date().toISOString()} ${type} ${message}\n`);

// don't define a logger, defaults to dummy logger that does nothing
const calculator1 = new Calculator();

// use the built-in console as the logger
const calculator2 = new Calculator(console);

// use the custom file logger
const calculator3 = new Calculator(new FileLogger("log.txt"));

// run the calculator
calculator1.sum(2, 3);
calculator2.sum(-4, 1);
calculator3.sum(6, 3);


  • yarn start to start the example application.
  • yarn build to build the production version.
  • yarn test to run tests.
  • yarn coverage to gather code coverage.
  • yarn lint to lint the codebase.
  • yarn prettier to run prettier.
  • yarn validate to run all pre-commit checks (prettier, build, lint, test)
You can’t perform that action at this time.