export declare enum LogLevel {
    none = 0,
    info = 1,
    warn = 2,
    debug = 4,
    error = 8,
    all = 15,
}
export interface ILogger {
    /**
     * Logs a debug message.
     *
     * @param message The message to log.
     */
    debug(message: string): void;
    /**
     * Logs info.
     *
     * @param message The message to log.
     */
    info(message: string): void;
    /**
     * Logs a warning.
     *
     * @param message The message to log.
     */
    warn(message: string): void;
    /**
     * Logs an error.
     *
     * @param message The message to log.
     */
    error(message: string): void;
}
export declare class LoggingService {
    static loggers: Array<ILogger>;
    static logLevel: LogLevel;
    static moduleName: string;
    static debug(message: string): void;
    static info(message: string): void;
    static warn(message: string): void;
    static error(message: string): void;
    /**
     * Log a message at potentially multiple levels instead of just one.
     *
     * The message will be logged just once, at the first log level in the intersection between
     * the given log level and the current log level, in the following order of precendence:
     *
     *  1. error
     *  2. warn
     *  3. info
     *  4. debug
     *
     * So if the current log level is info|error and you call `message("a message", LogLevel.info|LogLevel.error)`
     * then you will see the message logged as an error.
     *
     * @param message
     * @param level log level(s)
     */
    static message(message: string, level?: LogLevel): void;
    static addLogger(logger: ILogger): void;
    static removeLogger(logger: ILogger): void;
    static stringifyObject(obj: any): string;
}
