/// <reference types="node" />
/// <reference types="node" />
import { Stats, WriteStream } from 'node:fs';
import { InspectOptions } from 'node:util';
import { TypedEmitter } from './TypedEmitter';
import { Awaitable } from '../../types';
export declare enum LoggerLevel {
    INFO = 1,
    WARN = 2,
    ERROR = 3,
    DEBUG = 4
}
export interface LoggerOptions {
    formatMessage?: (message: string, level: LoggerLevel, logger: Logger) => string;
    /**
     * @deprecated Use {@link LoggerOptions.formatMessage} instead
     */
    formatMessageLines?: {
        [level: number]: ((message: string, logger: Logger) => string) | undefined;
    };
    objectInspectOptions?: InspectOptions | null;
    enableDebugmode?: boolean | null;
    forceEmitLogEvents?: boolean | null;
    writeStream?: WriteStream | null;
    name?: string | null;
    parent?: Logger | null;
}
export interface LoggerFileWriteStreamOptions {
    file: string;
    renameOldFile?: boolean;
    handleOldFile?: (file: string) => Awaitable<void>;
}
export interface LoggerEvents {
    log: [message: string];
    warn: [message: string];
    err: [message: string];
    debug: [message: string];
}
export declare class Logger extends TypedEmitter<LoggerEvents> {
    readonly parent?: Logger;
    formatMessage?: (message: string, level: LoggerLevel, logger: Logger) => string;
    formatMessageLines: Exclude<LoggerOptions['formatMessageLines'], undefined>;
    objectInspectOptions?: InspectOptions;
    enableDebugmode: boolean | null;
    forceEmitLogEvents: boolean;
    writeStream?: WriteStream;
    name?: string;
    get isDebugging(): boolean;
    constructor(options?: LoggerOptions);
    emit<K extends keyof LoggerEvents>(eventName: K, ...args: LoggerEvents[K]): boolean;
    emit<K extends string | symbol>(eventName: K, ...args: any): boolean;
    info(...message: any[]): void;
    warn(...message: any[]): void;
    err(...message: any[]): void;
    log(...messages: any[]): void;
    warning(...messages: any[]): void;
    error(...messages: any[]): void;
    debug(...messages: any[]): void;
    /**
     * @deprecated Use {@link Logger.createFileWriteStream} instead
     */
    logToFile(filePath: string, keepOldFile?: boolean, renameFileName?: string | ((stat: Stats) => string)): this;
    createFileWriteStream(options: LoggerFileWriteStreamOptions): Promise<this>;
    setDebugMode(enabled: boolean | null): this;
    setName(name: string): this;
    setWriteStream(writeStream: WriteStream, close?: boolean): this;
    closeWriteStream(): this;
    clone(options?: LoggerOptions): Logger;
    protected _print(messages: any[], level: LoggerLevel): string[];
    protected _write(message: string, level: LoggerLevel, logToConsole?: boolean, logToFile?: boolean): void;
}
