graphql-logger.ts
1 import chalk from "chalk"; 2 3 export default (_, { strapi }) => { 4 return async (ctx, next) => { 5 const start = Date.now(); 6 await next(); 7 const delta = Math.ceil(Date.now() - start); 8 9 if (ctx.url === "/graphql") { 10 const user = ctx.state?.user?.username; 11 const { operationName = "", variables, query } = ctx.request.body || {}; 12 const status = graphqlStatus(ctx.body); 13 14 strapi.log.http( 15 `${chalk.magenta( 16 "GRAPHQL" 17 )} ${operationName} (${delta} ms) ${graphqlCodeColor(status)}`, 18 { 19 meta: { 20 operationName, 21 variables, 22 query, 23 status, 24 delta, 25 user, 26 }, 27 } 28 ); 29 } else { 30 strapi.log.http( 31 `${ctx.method} ${ctx.url} (${delta} ms) ${httpCodeColor(ctx.status)}` 32 ); 33 } 34 }; 35 }; 36 37 const graphqlStatus = (response) => { 38 if (!response) return "NOT FOUND"; 39 40 try { 41 const { errors = null } = response ? JSON.parse(response) : {}; 42 if (errors) return "ERROR"; 43 } catch (error) { 44 console.error(error); 45 return "ERROR"; 46 } 47 48 return "OK"; 49 }; 50 51 const graphqlCodeColor = (status) => { 52 switch (status) { 53 case "ERROR": 54 return chalk.red(status); 55 case "NOT_FOUND": 56 return chalk.yellow(status); 57 default: 58 return chalk.green(status); 59 } 60 }; 61 62 const httpCodeColor = (code) => { 63 return code >= 500 64 ? chalk.red(code) 65 : code >= 400 66 ? chalk.yellow(code) 67 : code >= 300 68 ? chalk.cyan(code) 69 : code >= 200 70 ? chalk.green(code) 71 : code; 72 };