import {RuntimeUtil} from '../RuntimeUtil';
import {ClassUtil} from '../reflect/ClassUtil';
import {MethodUtil} from '../reflect/MethodUtil';
import {DateUtil} from './DateUtil';
import {Listeners} from './Listeners';
import {LoggerInfo} from './LoggerInfo';
import {StringBuffer} from './StringBuffer';
import {StringUtil} from './StringUtil';
//==========================================================
// 日志工具类。
//
// @reference
// @author maocy
// @version 141229
//==========================================================
export class LoggerUtil {
// 日志标志
public static debugAble: boolean = true;
public static infoAble: boolean = true;
public static warnAble: boolean = true;
public static errorAble: boolean = true;
public static fatalAble: boolean = true;
// 标签长度
private static _labelLength;
// 日志长度
private static _logger: LoggerInfo;
// 输出监听集合
private static _lsnsOutput: Listeners;
//==========================================================
// 静态初始化。
//==========================================================
public static initialize() {
this._labelLength = 40;
this._logger = new LoggerInfo();
this._lsnsOutput = new Listeners();
}
//==========================================================
// 获得输出监听集合。
//
// @return 输出监听集合
//==========================================================
public static get outputListeners(): Listeners {
return this._lsnsOutput;
}
//==========================================================
// 输出日志信息。
//
// @method
// @param sender:Object 发送者
// @param message:String 消息
//==========================================================
public static output(sender: any, code: string, message: string, parameters: Array): string {
// 格式化参数
var result = new StringBuffer();
result.append(DateUtil.format('yymmdd-hh24miss.ms'));
result.append(code);
var formatMessage: string = message;
var count: number = parameters.length;
for (var n: number = 0; n < count; n++) {
var parameter = parameters[n];
var value = '';
if (parameter != null) {
if (typeof (parameter) == 'function') {
value = MethodUtil.shortName(parameter);
} else {
value = parameter.toString();
}
}
formatMessage = formatMessage.replace('{' + (n + 1) + '}', value);
}
result.append(formatMessage);
var outputMessage = result.flush();
// 日志输出
var logger: LoggerInfo = this._logger;
logger.sender = sender;
logger.message = outputMessage;
this._lsnsOutput.process(logger);
// console.trace();
// 返回内容
return outputMessage;
}
//==========================================================
//显示一个调试信息。
//
// @method
// @param owner:Object 消息对象
// @param message:String 消息内容
// @param params:Object... 消息参数列表
//==========================================================
public static debug(owner: any, message: string, ...parameters: Array) {
// 检查标志
if (!this.debugAble) {
return;
}
// 获得函数名称
var name = null;
if (owner) {
name = MethodUtil.shortName(owner.constructor);
}
//var caller = RLogger.debug.caller;
//if (caller) {
// name = RMethod.shortName(caller);
//} else if ((arguments as any).caller) {
// name = RMethod.shortName((arguments as any).caller[0]);
//}
if (name == null) {
name = 'unknown';
} else {
name = name.replace('_', '.');
}
if (owner && owner.hashCode) {
name += '@' + owner.hashCode;
}
//..........................................................
var code: string = '|D [' + StringUtil.rpad(name, this._labelLength) + '] ';
this.output(owner, code, message, parameters);
}
//==========================================================
//显示一个提示信息。
//
// @method
// @param owner:Object 消息对象
// @param message:String 消息内容
// @param params:Object... 消息参数列表
//==========================================================
public static info(owner: any, message: string, ...parameters: Array) {
// 检查标志
if (!this.infoAble) {
return;
}
// 获得函数名称
var name = null;
if (owner) {
name = MethodUtil.shortName(owner.constructor);
}
//var caller = RLogger.info.caller;
//if (caller) {
//name = RMethod.shortName(caller);
//} else if ((arguments as any).caller) {
//name = RMethod.shortName((arguments as any).caller[0]);
//}
if (name == null) {
name = 'unknown';
} else {
name = name.replace('_', '.');
}
if (owner && owner.hashCode) {
name += '@' + owner.hashCode;
}
//..........................................................
var code: string = '|I [' + StringUtil.rpad(name, this._labelLength) + '] ';
this.output(owner, code, message, parameters);
}
//==========================================================
// 显示一个警告信息。
//
// @method
// @param owner:Object 消息对象
// @param message:String 消息内容
// @param params:Object... 消息参数列表
//==========================================================
public static warn(owner: any, message: string, ...parameters: Array) {
// 检查标志
if (!this.warnAble) {
return;
}
// 获得函数名称
var name = null;
if (owner) {
name = MethodUtil.shortName(owner.constructor);
}
//var caller = RLogger.warn.caller;
//if (caller) {
// name = RMethod.shortName(caller);
//} else if ((arguments as any).caller) {
// name = RMethod.shortName((arguments as any).caller[0]);
//}
if (name == null) {
name = 'unknown';
} else {
name = name.replace('_', '.');
}
if (owner && owner.hashCode) {
name += '@' + owner.hashCode;
}
//..........................................................
var code: string = '|W [' + StringUtil.rpad(name, this._labelLength) + '] ';
this.output(owner, code, message, parameters);
}
//==========================================================
// 显示一个错误信息。
//
// @method
// @param owner:Object 消息对象
// @param message:String 消息内容
// @param params:Object... 消息参数列表
//==========================================================
public static error(owner: any, message: string, ...parameters: Array) {
// 检查标志
if (!this.errorAble) {
return;
}
// 获得函数名称
var name = null;
if (owner) {
name = MethodUtil.shortName(owner.constructor);
}
//var caller = RLogger.error.caller;
//if (caller) {
// name = RMethod.shortName(caller);
//} else if ((arguments as any).caller) {
// name = RMethod.shortName((arguments as any).caller[0]);
//}
if (name == null) {
name = 'unknown';
} else {
name = name.replace('_', '.');
}
if (owner && owner.hashCode) {
name += '@' + owner.hashCode;
}
//..........................................................
var code: string = '|E [' + StringUtil.rpad(name, this._labelLength) + '] ';
this.output(owner, code, message, parameters);
}
//==========================================================
// 显示一个例外信息。
//
// @method
// @param owner:Object 消息对象
// @param error:Object 例外对象
// @param message:String 消息内容
// @param params:Object... 消息参数列表
//==========================================================
public static fatal(owner: any, error: any, message: string, ...params: Array) {
// 检查标志
if (!this.fatalAble) {
return;
}
// 建立函数调用关系的堆栈
var stack = new StringBuffer();
var stacks = new Array();
//var caller = RLogger.fatal.caller;
//while (caller) {
// if (RArray.contains(stacks, caller)) {
// break;
// }
// stacks.push(caller);
// caller = caller.caller;
//}
var count = stacks.length;
for (var i = 0; i < count; i++) {
//caller = stacks[i];
if (i > 0) {
stack.appendLine();
}
//stack.append(' ' + (count - i) + ': ' + RMethod.shortName(caller));
}
// 建立消息信息
var result = new StringBuffer();
//result.appendLine(RContext.get('RMessage:fatal'));
result.appendLine(StringUtil.repeat('-', 60));
result.append(ClassUtil.dump(owner), ': ');
if (message) {
var count = arguments.length;
for (var i = 3; i < count; i++) {
var parameter = arguments[i];
if ('function' == typeof (parameter)) {
parameter = MethodUtil.shortName(parameter);
}
message = message.replace('{' + (i - 2) + '}', parameter);
}
}
result.appendLine(message);
result.appendLine(StringUtil.repeat('-', 60));
result.appendLine('Stack:');
result.append(stack.flush());
var text = result.flush();
//o.output(owner, text);
// 显示信息
//if (RuntimeUtil.isPlatformPc() && !RuntimeUtil.isRelease()) {
throw new Error(text);
//}
}
//==========================================================
//显示一个弹出信息。
//
// @method
// @param owner:Object 消息对象
// @param message:String 消息内容
// @param params:Object... 消息参数列表
//==========================================================
public static show(owner: any, message: string, ...parameters: Array) {
// 获得函数名称
var name = null;
//var caller = RLogger.show.caller;
//if (caller) {
// name = RMethod.shortName(caller);
//} else if ((arguments as any).caller) {
// name = RMethod.shortName((arguments as any).caller[0]);
//}
if (name == null) {
name = 'unknown';
} else {
name = name.replace('_', '.');
}
//if ((owner as any).hashCode) {
// name += '@' + owner.hashCode();
//}
//..........................................................
var code: string = '|S [' + StringUtil.rpad(name, this._labelLength) + '] ';
var result = this.output(owner, code, message, parameters);
//..........................................................
alert(result);
}
}
LoggerUtil.initialize();