You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

112 lines
3.8 KiB
TypeScript

import {
Injectable,
NestInterceptor,
ExecutionContext,
CallHandler,
Logger,
} from '@nestjs/common';
import { Observable } from 'rxjs';
import { tap } from 'rxjs/operators';
import { Request } from 'express';
import { getMongoRepository } from 'typeorm';
// import { LogMongo } from '../../log/log.mongo';
function createGraphqlLog(request: Request, info, resolve_time: number) {
setImmediate(async () => {
try {
// @ts-ignore
const user = request.user;
// const new_log = new LogMongo();
// new_log.path_name = info.fieldName;
// new_log.parent_type_name = info.parentType.name;
// new_log.field_name = info.fieldName;
// new_log.type = 'graphql';
// new_log.ip = request.ip;
// new_log.resolve_time = resolve_time;
// new_log.content_length = request.headers['content-length'];
// new_log.user_agent = request.headers['user-agent'];
// new_log.sec_fetch_site = String(request.headers['sec-fetch-site']);
// new_log.referer = request.headers.referer;
// new_log.method = request.method;
// if (user) {
// new_log.user_id = user.id;
// new_log.roles = user.roles;
// new_log.permissions = user.permissions;
// }
// if (request.body.query) {
// new_log.query = request.body.query;
// }
// await getMongoRepository(LogMongo, 'mongo').save(new_log);
Logger.debug(`graphql ${info.fieldName} [${resolve_time} ms]`);
} catch (e) {
Logger.error(`http graphql 中间件错误 ${e.message}`);
}
});
}
function createApiLog(request: Request, resolve_time: number) {
setImmediate(async () => {
try {
// @ts-ignore
const user = request.user;
// const new_log = new LogMongo();
// new_log.path_name = request.originalUrl;
// // new_log.parent_type_name = info.parentType.name;
// // new_log.field_name = info.fieldName;
// new_log.type = 'api';
// new_log.ip = request.ip;
// new_log.resolve_time = resolve_time;
// new_log.content_length = request.headers['content-length'];
// new_log.user_agent = request.headers['user-agent'];
// new_log.sec_fetch_site = String(request.headers['sec-fetch-site']);
// new_log.referer = request.headers.referer;
// new_log.method = request.method;
// if (user) {
// new_log.user_id = user.id;
// new_log.roles = user.roles;
// new_log.permissions = user.permissions;
// }
// if (request.body) {
// new_log.body = JSON.stringify(request.body);
// }
// if (request.query) {
// new_log.query = JSON.stringify(request.query);
// }
// if (request.params) {
// new_log.params = JSON.stringify(request.params);
// }
// await getMongoRepository(LogMongo, 'mongo').save(new_log);
Logger.debug(`api ${request.url} [${resolve_time} ms]`);
} catch (e) {
Logger.error(`http api 中间件错误 ${e.message}`);
}
});
}
// 拦截所有的请求 并记录所有请求的时间
@Injectable()
export class LoggingInterceptor implements NestInterceptor {
intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
const start = Date.now();
return next.handle().pipe(
tap(() => {
const ctx = context.switchToHttp();
const request = ctx.getRequest<Request>();
const resolve_time = Date.now() - start;
if (!request || request.url.startsWith('/graphql')) {
// @ts-ignore
const info = context.args[3];
// @ts-ignore
const old_request = context.args[2].request;
createGraphqlLog(old_request, info, resolve_time);
} else if (request) {
createApiLog(request, resolve_time);
}
}),
);
}
}