Skip to content

logger config

  • Source: src/config/logger.ts

Usage

Import from the framework:

ts
import { logger } from '@zintrust/core';

// Example (if supported by the module):
// logger.*

Snapshot (top)

ts
/**
 * Logger utility - Central logging configuration
 * Sealed namespace pattern - all exports through Logger namespace
 * Replaces console.* calls throughout the codebase
 */
import { Env } from '@zintrust/core';
import { appConfig } from '@zintrust/core';

interface ILogger {
  debug(message: string, data?: unknown, category?: string): void;
  info(message: string, data?: unknown, category?: string): void;
  warn(message: string, data?: unknown, category?: string): void;
  error(message: string, error?: unknown, category?: string): void;
  fatal(message: string, error?: unknown, category?: string): void;
}

const isDevelopment = (): boolean => appConfig.isDevelopment();
const isProduction = (): boolean => appConfig.isProduction();

const getLogFormat = (): string => Env.get('LOG_FORMAT', 'text');
const isJsonFormat = (value: unknown): value is 'json' => value === 'json';

const SENSITIVE_FIELDS = new Set\<string>([
  'password',
  'token',
  'authorization',
  'secret',
  'apikey',
  'api_key',
  'jwt',
  'bearer',
]);

const redactSensitiveData = (data: unknown): unknown => {
  const seen = new WeakSet\<object>();

  const walk = (value: unknown): unknown => {
    if (Array.isArray(value)) {
      if (seen.has(value)) return '[Circular]';
      seen.add(value);
      return value.map((v) => walk(v));
    }

    if (typeof value === 'object' && value !== null) {
      const asObj = value as Record\<string, unknown>;
      if (seen.has(asObj)) return '[Circular]';
      seen.add(asObj);

      const out: Record\<string, unknown> = {};
      for (const [key, inner] of Object.entries(asObj)) {
        if (SENSITIVE_FIELDS.has(key.toLowerCase())) {
          out[key] = '[REDACTED]';
        } else {
          out[key] = walk(inner);
        }
      }
      return out;
    }

    return value;
  };

  return walk(data);
};

const safeStringify = (obj: unknown, indent: boolean = false): string => {
  const seen = new WeakSet\<object>();
  return JSON.stringify(
    obj,
    (_key: string, value: unknown) => {

Snapshot (bottom)

ts
  emitCloudLogs({
    timestamp,
    level: 'fatal',
    message,
    category,
    error: errorMessage,
  });

  if (isProduction() && typeof process !== 'undefined') {
    process.exit(1);
  }
};

const createLoggerScope = (scope: string): ILogger => {
  return {
    debug(message: string, data?: unknown): void {
      logDebug(`[${scope}] ${message}`, data, scope);
    },
    info(message: string, data?: unknown): void {
      logInfo(`[${scope}] ${message}`, data, scope);
    },
    warn(message: string, data?: unknown): void {
      logWarn(`[${scope}] ${message}`, data, scope);
    },
    error(message: string, error?: unknown): void {
      logError(`[${scope}] ${message}`, error, scope);
    },
    fatal(message: string, error?: unknown): void {
      logFatal(`[${scope}] ${message}`, error, scope);
    },
  };
};

// Expose log cleanup API and sealed namespace with all logger functionality
export const cleanLogsOnce = async (): Promise\<string[]> => {
  if (!shouldLogToFile()) return [];

  try {
    const mod = await import('@zintrust/core/node');
    const deleted = mod.cleanOnce();
    logInfo('Log cleanup executed', { deletedCount: deleted.length });
    return deleted;
  } catch (err: unknown) {
    logError('Log cleanup failed', err as Error);
    return [];
  }
};

export const Logger = Object.freeze({
  debug: logDebug,
  info: logInfo,
  warn: logWarn,
  error: logError,
  fatal: logFatal,
  cleanLogsOnce,
  scope: createLoggerScope,
});

export default Logger;

Released under the MIT License.