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
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);
|
|
}
|
|
}),
|
|
);
|
|
}
|
|
}
|