Quellcode durchsuchen

修复和优化日志,修复格式

zhusiqing vor 3 Jahren
Ursprung
Commit
b86f0b6e90

+ 1 - 0
.eslintrc.js

@@ -22,6 +22,7 @@ module.exports = {
     'no-extra-semi': 'off',
     'quotes': [1, 'single'], // 必须使用单引号
     'semi': [2, 'always'], //语句强制分号结尾
+    'max-len': ['warn', { code: 100, tabWidth: 2, ignoreUrls: true }],
     '@typescript-eslint/adjacent-overload-signatures': 'error', // 强制函数重载是连续的
     '@typescript-eslint/no-empty-function': 'off', // 允许空函数
     '@typescript-eslint/no-extra-semi': ['error'], // 多余分号去掉

+ 4 - 5
src/app.ts

@@ -26,8 +26,7 @@ import localDbMiddleware from './middlewares/localDb';
 import server from '@utils/server';
 import Plugins from '@/plugins';
 
-const plugins =  Plugins();
-
+const plugins = Plugins();
 const app = new Koa<DefaultState, Context>();
 
 // 为了获取到真实的ip
@@ -69,9 +68,9 @@ if (run) {
 app.on('error', (err, ctx: Context) => {
   ctx.$response(err, 'error', false);
   const errMsg: string = err.message || '服务出错';
-  console.log(errMsg);
-  console.log(ctx);
-  plugins.logger.middleware(ctx).error(errMsg);
+  console.log(err);
+  // console.log(ctx);
+  plugins.logger.formatLog('error', errMsg, ctx);
 });
 
 // 注册路由

+ 1 - 1
src/middlewares/localDb.ts

@@ -3,7 +3,7 @@ import { Context, Next } from 'koa';
 
 export default (db: LocalDb) => {
   return async(ctx: Context, next: Next): Promise<void> => {
-    ctx.$db = db;
+    ctx.$db = db.db;
     await next();
   };
 };

+ 7 - 8
src/middlewares/logs.ts

@@ -1,5 +1,5 @@
 import { Context, Next } from 'koa';
-import { InterfaceLogger, InterfaceLogInfo, formatOutputHandle } from '@/plugins/logger';
+import { InterfaceLogger } from '@/plugins/logger';
 
 export default (logger: InterfaceLogger): (ctx: Context, next: Next) => Promise<void> => {
   const loggerMiddleware = async(ctx, next) => {
@@ -9,14 +9,13 @@ export default (logger: InterfaceLogger): (ctx: Context, next: Next) => Promise<
     await next();
     const b = Date.now();
     if (ctx.response && ctx.status < 400) {
-      const commonInfo: InterfaceLogInfo = {
-        ip: ctx.ip,
+      const options: Record<string, string|number> = {
         time: b - a
       };
       if (ctx.request.body) {
-        commonInfo.params = ctx.request.body;
+        options.params = ctx.request.body;
       }
-      $log.info(formatOutputHandle(ctx, null, commonInfo));
+      $log.info('', options);
     }
     else {
       ctx.throw(ctx.status, ctx.response);
@@ -30,9 +29,9 @@ export default (logger: InterfaceLogger): (ctx: Context, next: Next) => Promise<
       return;
     }
     return loggerMiddleware(ctx, next).catch(error => {
-      const { body, status = 500, message } = error;
-      const errorText = `res: ${JSON.stringify({ status, message, body })}`;
-      ctx.$log.error(errorText);
+      const { status = 500 } = error;
+      console.log(error);
+      ctx.$log.error(error);
       ctx.status = status;
     });
   };

+ 1 - 0
src/plugins/index.ts

@@ -44,6 +44,7 @@ export default () => {
   const memoryCache = new MemoryCachePlugin();
   const localDb = new LocalDbPlugin(localDbOption);
   const logger = new MyLogger();
+  logger.middleware = logger.middleware.bind(logger);
   return {
     redis,
     memoryCache,

+ 43 - 13
src/plugins/logger.ts

@@ -20,14 +20,18 @@ export interface InterfaceLog {
   mark: InterfaceLogFn
 }
 interface InterfaceLogFn {
-  (message: string): void;
+  (message: string, options?: { [key: string]: string|number }): void;
 }
 interface InterfaceAppenders {
   [key: string]: DateFileAppender | ConsoleAppender
 }
 
 // 输出格式化配置
-export const formatOutputHandle = (ctx: Context, message: string | null | undefined , commonInfo: InterfaceLogInfo): string => {
+export const formatOutputHandle = (
+  ctx: Context,
+  message: string | null | undefined ,
+  commonInfo: InterfaceLogInfo
+): string => {
   const {
     method, // 请求方式
     headers, // 请求headers
@@ -39,24 +43,27 @@ export const formatOutputHandle = (ctx: Context, message: string | null | undefi
     ...newCommonInfo
    } = commonInfo;
   interface client {
-    originalUrl: string,
-    userAgent: string,
+    'content-type'?: string
     query?: string
   }
-  const client: client = {
-    originalUrl,
-    userAgent: headers['user-agent']
-  };
+  const client: client = {};
+  if (headers['content-type']) {
+    client['content-type'] = headers['content-type'];
+  }
   if (ctx.querystring) {
     client.query = ctx.querystring;
   }
   let text = `[${method}] ${ctx.status} [${origin}${originalUrl}] ${time ? time + 'ms' : ''}
 req: ${JSON.stringify(Object.assign(client, newCommonInfo))}`;
-
-  if (['[object Object]', '[object Array]', '[object Error]'].includes(Object.prototype.toString.call(message))) {
+  if ([
+    '[object Object]',
+    '[object Array]'
+  ].includes(Object.prototype.toString.call(message))) {
     message = JSON.stringify(message);
   }
-
+  if (Object.prototype.toString.call(message) === '[object Error]') {
+    message = message?.toString();
+  }
   if (message) {
     text += '\n' + String(message);
   }
@@ -166,10 +173,33 @@ export default class MyLogger {
       mark: () => {}
     };
     methods.map(el => {
-      $log[el] = (message) => {
-        this.logger[el](formatOutputHandle(ctx, message, { ip: ctx.ip }));
+      $log[el] = (message, options?: { [key: string]: string }) => {
+        this.logger[el](formatOutputHandle(ctx, message, Object.assign({ ip: ctx.ip }, options)));
       };
     });
     return $log;
   }
+  formatLog(
+    this: MyLogger,
+    type: 'trace'|'debug'|'info'|'warn'|'error'|'fatal'|'mark',
+    message: string ,
+  ): void
+  formatLog(
+    this: MyLogger,
+    type: 'trace'|'debug'|'info'|'warn'|'error'|'fatal'|'mark',
+    message: string ,
+    ctx?: Context,
+    options?: { [key: string]: string|number }): void
+  formatLog(
+    this: MyLogger,
+    type: 'trace'|'debug'|'info'|'warn'|'error'|'fatal'|'mark',
+    message: string ,
+    ctx?: Context,
+    options?: { [key: string]: string|number }): void {
+    if (ctx) {
+      this.logger[type](formatOutputHandle(ctx, message, Object.assign({ ip: ctx.ip }, options)));
+    } else {
+      this.logger[type](message);
+    }
+  }
 }

+ 6 - 3
src/plugins/redis.ts

@@ -37,9 +37,12 @@ class Redis {
     });
     return client;
   }
-  get = (key: string): Promise<string | null> | undefined => this.client?.get && promisify(this.client.get).bind(this.client)(key)
-  set = (key: string, value: string): Promise<unknown> | undefined => this.client?.set && promisify(this.client.set).bind(this.client)(key, value)
-  setex = (key: string, ttl: number, value: string): Promise<unknown> | undefined => this.client?.setex && promisify(this.client.setex).bind(this.client)(key, ttl, value)
+  get = (key: string): Promise<string | null> | undefined =>
+    this.client?.get && promisify(this.client.get).bind(this.client)(key)
+  set = (key: string, value: string): Promise<unknown> | undefined =>
+    this.client?.set && promisify(this.client.set).bind(this.client)(key, value)
+  setex = (key: string, ttl: number, value: string): Promise<unknown> | undefined =>
+    this.client?.setex && promisify(this.client.setex).bind(this.client)(key, ttl, value)
   init(client: redis.RedisClient): void {
     // redis查询和设置await/async化
     this.get = (key) => promisify(client.get).bind(this.client)(key);

+ 22 - 5
src/services/document.ts

@@ -3,7 +3,10 @@ import { InterfaceResponseData } from '@utils/response';
 import { InterfaceDocument, InterfacePage, InterfaceTag, InterfaceDocumentList } from '@/controllers/document';
 import { CODE, decipher, cipher, MapDocMethod } from '@/utils';
 
-const putDocument = async (ctx: Context, params: InterfaceDocument) :Promise<InterfaceResponseData> => {
+const putDocument = async (
+  ctx: Context,
+  params: InterfaceDocument
+) :Promise<InterfaceResponseData> => {
   const reData: InterfaceResponseData = {
     data: null,
     message: '',
@@ -82,7 +85,10 @@ const getDocument = async (ctx: Context, id: string) :Promise<InterfaceResponseD
   });
 };
 
-const getDocumentList = async (ctx: Context, params: InterfaceDocumentList) :Promise<InterfaceResponseData> => {
+const getDocumentList = async (
+  ctx: Context,
+  params: InterfaceDocumentList
+) :Promise<InterfaceResponseData> => {
   const reData: InterfaceResponseData = {
     data: null,
     message: '',
@@ -145,7 +151,10 @@ const deleteDocument = async (ctx: Context, id: string) :Promise<InterfaceRespon
   });
 };
 
-const updateDocument = async (ctx:Context, { _id, tag, ...params }: InterfaceDocument) :Promise<InterfaceResponseData> => {
+const updateDocument = async (
+  ctx:Context,
+  { _id, tag, ...params }: InterfaceDocument
+) :Promise<InterfaceResponseData> => {
   const decodeId = decipher(_id || '');
   const reData: InterfaceResponseData = {
     data: null,
@@ -223,7 +232,10 @@ const putTag = async (ctx:Context, params: InterfaceTag) :Promise<InterfaceRespo
   });
 };
 
-const updateTag = async (ctx:Context, { _id, ...params }: InterfaceTag) :Promise<InterfaceResponseData> => {
+const updateTag = async (
+  ctx:Context,
+  { _id, ...params }: InterfaceTag
+) :Promise<InterfaceResponseData> => {
   const reData: InterfaceResponseData = {
     data: null,
     message: '',
@@ -285,7 +297,12 @@ const getTagList = async (ctx: Context, params: InterfacePage) :Promise<Interfac
     code: 400000
   };
   return new Promise(resolve => {
-    ctx.$db.tag.find({}).sort({ url: 1 }).skip((params.page - 1) * params.size).limit(params.size).exec((err, tags) => {
+    ctx.$db.tag
+      .find({})
+      .sort({ url: 1 })
+      .skip((params.page - 1) * params.size)
+      .limit(params.size)
+      .exec((err, tags) => {
         if (err) {
           ctx.$log.error(err);
           ctx.status = 500;

+ 1 - 1
tsconfig.json

@@ -2,7 +2,7 @@
   "compileOnSave": true,
   "compilerOptions": {
     "outDir": "./dist",
-    "target": "es2020",
+    "target": "es2017",
     "module": "commonjs", // 采用commonjs的模块风格
     "strict": true, // 启用所有严格类型检查选项
     "noImplicitAny": false, // 隐式any检查