Skip to content
LogoLogo
@tevm/logger

One logger for every Tevm package

@tevm/logger is the shared structured-logging layer for Tevm core and the Tevm bundler. A thin, typed wrapper over pino — one log format, one level vocabulary, zero config drift between packages.

pnpm add @tevm/logger

Try the playground →

@tevm/logger — live output
info{"level":30, "time":1700000000000, "pid":4242, "name":"tevm:node", "msg":"Tevm node ready — listening for JSON-RPC requests"}

At a glance

import { createLogger } from '@tevm/logger'
 
const logger = createLogger({
	name: 'my-module',
	level: 'debug', // trace | debug | info | warn | error | fatal
})
 
logger.info({ chainId: 1 }, 'Tevm node ready')
// {"level":30,"time":1700000000000,"pid":4242,"name":"my-module","chainId":1,"msg":"Tevm node ready"}
 
logger.debug('SSTORE slot 0x0…3f9a')
logger.error(new Error('fork transport timeout'))

Why it exists

One log shape

Every Tevm package logs the same pino JSON lines, so a single pino-pretty or log drain formats all of them.

Typed levels

fatal | error | warn | info | debug | trace as a first-class union type — no stringly typed verbosity flags.

Named loggers

Every line carries a name field (tevm:vm, tevm:bundler, …) so you can filter a noisy trace down to one module.

Fast by default

Built on pino — the fastest Node.js logger — so tracing the EVM doesn't slow the EVM down.

Try it

Pick a level, emit logs, and watch how createLogger({ level }) filters the stream:

createLogger({ name: 'my-module', level: 'trace' })
// Nothing logged yet — emit a log above. Logs below the logger level are silently dropped.

The Tevm family

This site is one of the *.tevm.sh docs sites — jump between them: