Skip to content
IvanPopov edited this page Nov 14, 2012 · 2 revisions

Обзор

Как использовать?

#include "logger.ts"

В движке создается один экземпляр Logger. Доступен по akra.logger.

Уровни лога

Описание

enum ELogLevel {
    NONE = 0x0000, //не выводить в лог ничего
    LOG = 0x0001, //в лог выводиться только сообщения продуцируемые функцией logger.log 
    INFORMATION = 0x0002, //logger.info
    WARNING = 0x0004, //logger.warning
    ERROR = 0x0008, //logger.error
    CRITICAL = 0x0010, //logger.critical_error и logger.assert
    ALL = 0x001F //выводить все
}

Пример

logger.setLogLevel(ELogLevel.WARNING | ELogLevel.ERROR | ELogLevel.CRIICAL);

При таком уровне лога как в примере, сообщения выводимые функцией log и info выводиться не будут

Описание функций

Интерфейс

log(...pArgs: any[]);

info(pEntity: ILoggerEntity): void;
info(eCode: uint, ...pArgs: any[]): void;
info(...pArgs: any[]): void;

warning(pEntity: ILoggerEntity): void;
warning(eCode: uint, ...pArgs: any[]): void;
warning(...pArgs: any[]): void;

error(pEntity: ILoggerEntity): void;
error(eCode: uint, ...pArgs: any[]): void;
error(...pArgs: any[]): void;

/**
 * в независимости от уровня лога выводит alert с предупреждением и продуцирует ошибку. 
 * Если установлен уровень CRITICAL, то выведет в лог сообщение об ошибке.
 */
criticalError(pEntity: ILoggerEntity): void;
criticalError(eCode: uint, ...pArgs: any[]): void;
criticalError(...pArgs: any[]):void;

/**
 * Если bCondition ложно, работает как critical_error, 
 * с той разницей, что ошибка продуцируется по желанию пользователя.
 */
assert(bCondition: bool, pEntity: ILoggerEntity): void;
assert(bCondition: bool, eCode: uint, ...pArgs: any[]): void;
assert(bCondition: bool, ...pArgs: any[]):void;

Семейства кодов

У Logger-а можно регистрировать диапазон кодов, и задать ему имя. Ко всем кодам из данного диапазона можно применять свои собственные правила вывода ошибок. Если функции вывода не определена, то будет использована стандартная.

Пример:

logger.registerCodeFamily(0, 100, "SystemCodes");
logger.registerCodeFamily(2000, 2199, "ParserSyntaxErrors");
logger.registerCodeFamily(2200, 2500, "EffectSyntaxErrors");

Пользовательские функции вывода сообщений

Можно определять свои функции вывода ошибок. На каждое семейство ошибок и на каждый уровень лога можно определить свою функцию.

Формат функции:

interface ILogRoutineFunc {
    (pEntity: ILoggerEntity): void;
}

На вход она всегда получает параметр типа ILoggerEntity:

interface ILoggerEntity {
    code: uint; //код сообщения
    location: ISourceLocation; // где произошла. {file: string; line: uint}
    message?: string; // сообщение
    info: any; // дополнительная информация об ошибке        
}

Интерфейс для подвязывания функции вывода:

//Глобально для всех кодов
setLogRoutine(fnLogRoutine: ILogRoutineFunc, eLevel: ELogLevel): void;

//Только для семейства кодов
setCodeFamilyRoutine(eCodeFromFamily: uint, fnLogRoutine: ILogRoutineFunc, eLevel: ELogLevel): bool;
setCodeFamilyRoutine(sFamilyName: string, fnLogRoutine: ILogRoutineFunc, eLevel: ELogLevel): bool;

Примеры:

logger.setLogRoutine(logRoutine, ELogLevel.LOG | 
                                 ELogLevel.INFORMATION);
logger.setCodeFamilyRoutine("ParserSyntaxErrors", syntaxErrorLogRoutine, ELogLevel.ERROR);

Регистрация кодов

Интерфейс:

registerCode(eCode: uint, sMessage?: string): bool;

Пример:

logger.registerCode(2202, "Grammar error. Empty additional function name.");

Макросы:

В движке определены следующие макросы: LOG, ERROR, WARNING, INFO, CRITICAL, CRITICAL_ERROR, assert. Используя их в поле location у ILoggerEntity окажется файл и строка в которых был использован этот макрос.