[API reference](https://evolu.dev/docs/api-reference) › [@evolu/common](https://evolu.dev/docs/api-reference/common) › [Console](https://evolu.dev/docs/api-reference/common/Console) › createConsoleFormatter

```ts
function createConsoleFormatter(
  __namedParameters?: Partial<TimeDep>,
): (config: ConsoleFormatterConfig) => ConsoleFormatter;
```

Defined in: [packages/common/src/Console.ts:543](https://github.com/evoluhq/evolu/blob/037c390af081e9944d616ff298a729515c5c5ab7/packages/common/src/Console.ts#L543)

Creates a [ConsoleFormatter](https://evolu.dev/docs/api-reference/common/Console/type-aliases/ConsoleFormatter) for [ConsoleConfig.formatter](https://evolu.dev/docs/api-reference/common/Console/interfaces/ConsoleConfig#formatter).

Prepends timestamps and path prefixes to entry args.

### Example

```ts
import {
  assertEqual,
  assertType,
  createConsoleFormatter,
  Data,
  Millis,
  testCreateTime,
  type ConsoleEntry,
} from "@evolu/common";

const time = testCreateTime({ startAt: Millis.orThrow(0) });
const formatRelative = createConsoleFormatter({ time })({
  timestampFormat: "relative",
});
const connected: ConsoleEntry = {
  method: "log",
  path: ["relay"],
  args: ["connected"],
};

const relative = formatRelative(connected);
assertType(Data, relative);
assertEqual(relative, ["+0.000s [relay]", "connected"]);
time.advance("1.5s");
const nested = formatRelative({
  ...connected,
  path: ["relay", "db"],
  args: ["opened"],
});
assertType(Data, nested);
assertEqual(nested, ["+1.500s [relay] [db]", "opened"]);

const localTimestamp = new globalThis.Date(
  2026,
  0,
  28,
  14,
  30,
  15,
  123,
).getTime();
const formatAbsolute = createConsoleFormatter({
  time: testCreateTime({ startAt: Millis.orThrow(localTimestamp) }),
})({ timestampFormat: "absolute" });
const absolute = formatAbsolute(connected);
assertType(Data, absolute);
assertEqual(absolute, ["14:30:15.123 [relay]", "connected"]);
```