是Nest.js的新手,
我正在尝试实现一个简单的记录器来跟踪HTTP请求,例如:
:method :url :status :res[content-length] - :response-time ms根据我的理解,最好的选择是拦截器。但我也使用守卫,正如我所提到的,警卫在中间件之后触发,而在拦截器之前触发。
意思是,我禁止的访问没有被记录。我可以在两个不同的地方编写日志记录部分,而不是。有什么想法吗?
谢谢!
我的拦截器代码:
import { Injectable, NestInterceptor, ExecutionContext, HttpException, HttpStatus } from '@nestjs/common';
import { Observable, throwError } from 'rxjs';
import { catchError, tap } from 'rxjs/operators';
@Injectable()
export class HTTPLoggingInterceptor implements NestInterceptor {
intercept(context: ExecutionContext, call$: Observable<any>): Observable<any> {
const now = Date.now();
const request = context.switchToHttp().getRequest();
const method = request.method;
const url = request.originalUrl;
return call$.pipe(
tap(() => {
const response = context.switchToHttp().getResponse();
const delay = Date.now() - now;
console.log(`${response.statusCode} | [${method}] ${url} - ${delay}ms`);
}),
catchError((error) => {
const response = context.switchToHttp().getResponse();
const delay = Date.now() - now;
console.error(`${response.statusCode} | [${method}] ${url} - ${delay}ms`);
return throwError(error);
}),
);
}
}发布于 2020-07-23 18:17:46
试试下面的代码=>
@Injectable()
export class LoggerMiddleware implements NestMiddleware {
use(req: Request, res: Response, next: Function) {
const { ip, method, originalUrl: url } = req;
const hostname = require('os').hostname();
const userAgent = req.get('user-agent') || '';
const referer = req.get('referer') || '';
res.on('close', () => {
const { statusCode, statusMessage } = res;
const contentLength = res.get('content-length');
logger.log(`[${hostname}] "${method} ${url}" ${statusCode} ${statusMessage} ${contentLength} "${referer}" "${userAgent}" "${ip}"`);
});
next();
}
}https://stackoverflow.com/questions/55093055
复制相似问题