Skip to content

Structured Transport Browser Server Deno Bun

A console-based transport with structured logging enabled by default. Unlike the Console Transport, which requires manually configuring messageField, levelField, and dateField, the Structured Transport comes pre-configured with sensible defaults.

Transport Source

Installation

No additional packages needed beyond the core loglayer package:

sh
npm i loglayer
sh
pnpm add loglayer
sh
yarn add loglayer

Setup

typescript
import { LogLayer, StructuredTransport } from 'loglayer'

const log = new LogLayer({
  transport: new StructuredTransport({
    logger: console,
  })
})

log.info('User logged in')
// console.info({ level: 'info', time: '2025-01-01T00:00:00.000Z', msg: 'User logged in' })

Default Fields

The transport outputs structured log objects with the following default fields:

FieldDefault KeyDescription
LevellevelThe log level (e.g., info, warn, error)
TimestamptimeISO 8601 date string
MessagemsgThe log message (multi-parameter messages are joined with a space)

Metadata and context data are merged into the log object alongside these fields.

Configuration Options

Required Parameters

None - all parameters are optional.

Optional Parameters

NameTypeDefaultDescription
level"trace" | "debug" | "info" | "warn" | "error" | "fatal""trace"Sets the minimum log level to process. Messages with a lower priority level will be ignored
messageFieldstring"msg"The field name for the log message. Multi-parameter messages will be joined with a space
dateFieldstring"time"The field name for the timestamp. If dateFn is defined, will call dateFn to derive the date
levelFieldstring"level"The field name for the log level. If levelFn is defined, will call levelFn to derive the level
dateFn() => string | number-If defined, a function that returns a string or number for the value to be used for the dateField
levelFn(logLevel: LogLevelType) => string | number-If defined, a function that returns a string or number for a given log level
stringifybooleanfalseIf true, applies JSON.stringify to the structured log output
messageFn(params: LogLayerTransportParams) => string-Custom function to format the log message output. Receives log level, messages, and data; returns the formatted string

Examples

With Metadata and Context

typescript
const log = new LogLayer({
  transport: new StructuredTransport({
    logger: console,
  })
})

log.withContext({ service: 'api' })
log.withMetadata({ requestId: 'abc-123' }).info('Request received')
// console.info({
//   level: 'info',
//   time: '2025-01-01T00:00:00.000Z',
//   msg: 'Request received',
//   service: 'api',
//   requestId: 'abc-123'
// })

Custom Field Names

typescript
const log = new LogLayer({
  transport: new StructuredTransport({
    logger: console,
    messageField: 'message',
    levelField: 'severity',
    dateField: 'timestamp'
  })
})

log.info('User logged in')
// console.info({ severity: 'info', timestamp: '2025-01-01T00:00:00.000Z', message: 'User logged in' })

Custom Date Function

typescript
const log = new LogLayer({
  transport: new StructuredTransport({
    logger: console,
    dateFn: () => Date.now() // Unix timestamp instead of ISO string
  })
})

log.info('User logged in')
// console.info({ level: 'info', time: 1701437400000, msg: 'User logged in' })

Custom Level Function

typescript
const log = new LogLayer({
  transport: new StructuredTransport({
    logger: console,
    levelFn: (level) => level.toUpperCase()
  })
})

log.warn('Disk space low')
// console.warn({ level: 'WARN', time: '2025-01-01T00:00:00.000Z', msg: 'Disk space low' })

JSON String Output

typescript
const log = new LogLayer({
  transport: new StructuredTransport({
    logger: console,
    stringify: true
  })
})

log.withMetadata({ user: 'john' }).info('User logged in')
// console.info('{"level":"info","time":"2025-01-01T00:00:00.000Z","msg":"User logged in","user":"john"}')

Custom Message Formatting

typescript
import { LogLayer, StructuredTransport } from 'loglayer'
import type { LogLayerTransportParams } from 'loglayer'

const log = new LogLayer({
  transport: new StructuredTransport({
    logger: console,
    messageFn: ({ logLevel, messages }: LogLayerTransportParams) => {
      return `[${logLevel.toUpperCase()}] ${messages.join(' ')}`
    }
  })
})

log.info('User logged in')
// console.info({ level: 'info', time: '...', msg: '[INFO] User logged in' })

Prefix behavior

If you use withPrefix(), the prefix is applied to the messages before they reach messageFn. For example, log.withPrefix('[MyApp]').info('Hello') would pass messages: ['[MyApp] Hello'] to your messageFn.

Log Level Mapping

LogLayerConsole
tracedebug
debugdebug
infoinfo
warnwarn
errorerror
fatalerror