te-one-xlog
Version:
the te-one's xlog
79 lines (75 loc) • 3.92 kB
text/typescript
import { safeGet, serverIp, asyncify } from './utils';
import LOGPARAMS, { XLOG } from './interface';
import { getLogger } from 'te-one-log4js';
import * as qs from 'querystring';
import * as uuidv4 from 'uuid/v4';
import * as cookie from 'cookie';
import * as day from 'dayjs';
function queue(log_arguments: XLOG): void {
setImmediate(() => {
getLogger('xlog').info(log_arguments);
});
}
if (!Object.getOwnPropertyNames(Promise.prototype).includes('finally')) {
Promise.prototype['finally'] = function (callback) {
let P = this.constructor;
return this.then(value => P.resolve(callback()).then(() => value), reason => P.resolve(callback()).then(() => {
throw reason
}));
};
}
export default function AutoXLog(pt: string): Function {
return function autoXlog(target) {
const prototypes: object = target.prototype;
const names: string[] = Object.getOwnPropertyNames(prototypes);
names
.filter(n => n !== 'constructor')
.forEach(function (f) {
const fun: Function = asyncify(target.prototype[f]);
target.prototype[f] = async function (...params) {
const ctx: object = params.slice(-1)[0];
const xlogInstance = new LOGPARAMS();
let log_arguments = xlogInstance.log;
ctx['xlog'] = xlogInstance;
log_arguments.pt = pt;
log_arguments.int_xapi_count = ctx["int_xapi_count"] = (+safeGet(ctx, "header.xapicount", 0)) * 10000;
const cookies: Object = cookie.parse(safeGet(ctx, 'header.cookie', ""));
log_arguments.url = 'https://' + safeGet(ctx, 'header.host', '') + safeGet(ctx, 'url', '').split("?")[0];
log_arguments.ip_clientIp = safeGet(ctx, serverIp, null);
log_arguments.serverIp = serverIp || null;
log_arguments.date_logTime = day().format("YYYY-MM-DDTHH:mm:ss.SSS+0800");
log_arguments.key_id = uuidv4();
log_arguments.wxVer = safeGet(ctx, 'header.weixinversion', "");
log_arguments.version = safeGet(ctx, 'header.appversion', "");
log_arguments.system = safeGet(ctx, 'header.model', "");
log_arguments.xcxPubAPPVersion = safeGet(ctx, 'header.pubappversion', "");
log_arguments.sdkVer = safeGet(ctx, 'header.sdkversion', "");
log_arguments.SDKVersion = safeGet(ctx, 'header.sdkversion', "");
log_arguments.userAgent = safeGet(ctx, 'header["user-agent"]', "");
log_arguments.params = safeGet(ctx, 'request.method') === "POST" ? JSON.stringify(safeGet(ctx, 'request.body')) : JSON.stringify(qs.parse(safeGet(ctx, 'req._parsedUrl.query')));
log_arguments.orderId = safeGet(params, 'orderid', '');
log_arguments.text_cookie = safeGet(ctx, 'header.cookie', "");
log_arguments.key_ck_AUTH_UNIONID = safeGet(cookies, 'AUTH_UNIONID', "");
log_arguments.key_ck_H5Channel = safeGet(cookies, 'H5Channel', "");
log_arguments.key_ck_H5CookieId = safeGet(cookies, 'H5CookieId', "");
log_arguments.key_ck_H5SessionId = safeGet(cookies, 'H5SessionId', "");
log_arguments.key_ck_SessionToken = safeGet(cookies, 'SessionToken', "");
log_arguments.key_ck_cityid = safeGet(cookies, 'cityid', "");
log_arguments.key_ck_openid = safeGet(cookies, 'openid', "");
let response: any = await fun
.apply(this, params)
.catch(err => {
if (process.env.NODE_ENV === 'dev')
throw err;
});
log_arguments.text_response = JSON.stringify(response);
if (safeGet(response, "error", '') || safeGet(response, "errorCode", '')) { //业务异常
log_arguments.errorCode = safeGet(response, "errorCode", '');
log_arguments.errorMessage = safeGet(response, "errorMessage", '');
}
queue(log_arguments);
return response;
}
})
}
};