ホームページ  >  記事  >  ウェブフロントエンド  >  Koaログミドルウェアのカプセル化と開発方法の紹介

Koaログミドルウェアのカプセル化と開発方法の紹介

不言
不言転載
2019-03-08 17:20:372300ブラウズ


この記事では、Koa ログ ミドルウェアのパッケージ化と開発方法について紹介します。これには一定の参考価値があります。必要な友人は参考にしていただければ幸いです。役に立つでしょう。

サーバーアプリケーションではログの記録は必須であり、プロジェクトプログラムが毎日何をしているのか、いつエラーが発生したか、どのようなエラーが発生したかなどを記録し、将来の利便性を高めるために使用する必要があります。サーバーの実行ステータスをリアルタイムで確認し、問題のシナリオを復元します。

ログの機能

サーバー プログラムの実行ステータスを記録し、開発者がエラーを迅速に捕捉し、障害を特定して解決できるようにします。

ログミドルウェア開発ツール log4js

node には組み込みのログモジュールがないため、サードパーティのモジュールを使用する必要があります。モジュールの使用: log4js インストール: npm i log4js - Slogsjs 公式ドキュメント

ログ分類:

アクセス ログ: プロジェクトへのクライアントのアクセス (主に http リクエスト) を記録します。 Web サイトのパフォーマンスとユーザー エクスペリエンスの改善と向上に役立てるために使用されます; アプリケーション ログ: プロジェクトの実行ステータスのクエリとバグの特定 (デバッグ、情報を含む) を容易にするために、異常な状況を含むプロジェクト マークと記録場所によって出力されるログ、警告やエラーなどのレベル)。

#ログ レベル

ログ レベルが設定されている場合、設定されたログ レベルよりも高いレベルのログ情報のみを記録できます。ログ レベル図

Koaログミドルウェアのカプセル化と開発方法の紹介

level:'error'を設定した場合、error、fatar、markレベルのログ情報のみ出力可能

ログミドルウェア開発

必要な情報セグメントを設定ログに記録される ( log_info.js )

export default (ctx, message, commonInfo) => {
    const {
      method,  // 请求方法
      url,          // 请求链接
      host,      // 发送请求的客户端的host
      headers      // 请求中的headers
    } = ctx.request;
    const client = {
      method,
      url,
      host,
      message,
      referer: headers['referer'],  // 请求的源地址
      userAgent: headers['user-agent']  // 客户端信息 设备及浏览器信息
    }
    return JSON.stringify(Object.assign(commonInfo, client));
}
    ユニバーサル取得設定された log4js オブジェクトを設定します (logger.js)
  1. const getLog = ({env, appLogLevel, dir}, name) => {
        
        //log4js基本说明配置项,可自定义设置键名,用于categories.appenders自定义选取
        let appenders = {
            // 自定义配置项1
            cheese: {
                type: 'dateFile', //输出日志类型
                filename: `${dir}/task`,  //输出日志路径
                pattern: '-yyyy-MM-dd.log', //日志文件后缀名(task-2019-03-08.log)
                alwaysIncludePattern: true
            }
        }
        // 如果为开发环境配置在控制台上打印信息
        if (env === "dev" || env === "local" || env === "development") {
            // 自定义配置项2
            appenders.out = {
              type: "stdout"
            }
        }
        // log4js配置
        let config = {
            appenders,
            //作为getLogger方法获取log对象的键名,default为默认使用
            categories: {
              default: {
                appenders: Object.keys(appenders), // 取appenders中的说有配置项
                level: appLogLevel
              }
            }
        }
        log4js.configure(config) //使用配置项
        return log4js.getLogger(name)// 这个cheese参数值先会在categories中找,找不到就会默认使用default对应的appenders,信息会输出到yyyyMMdd-out.log
    }
    ログ ログ ミドルウェア開発 ( logger.js)
  1. export default (options) => {
        const contextLogger = {}; //后期赋值给ctx.log
        const { env, appLogLevel, dir, serverIp, projectName } = Object.assign({}, baseInfo, options || {});
        // 取出通用配置(项目名,服务器请求IP)
        const commonInfo = { projectName, serverIp };
    
        const logger = getLog({env, appLogLevel, dir},'cheese');
    
        return async (ctx, next) => {
            const start = Date.now(); //日志记录开始时间
            // 将日志类型赋值ctx.log,后期中间件特殊位置需要记录日志,可直接使用ctx.log.error(err)记录不同类型日志
            methods.forEach((method, i) => {
                contextLogger[method] = (message) => {
                    logger[method](logInfo(ctx, message, commonInfo))
                }
            })
            ctx.log = contextLogger;
            // 执行中间件
            await next()
            // 结束时间
            const responseTime = Date.now() - start;
            // 将执行时间记录logger.info
            logger.info(logInfo(ctx,
                {
                    responseTime: `响应时间为${responseTime/1000}s`
                }, commonInfo)
            )
        }
    }
    ミドルウェアの使用法 (app.js)
  1. import Log from '../log/logger';
    ...
    app.use(Log({
            env: app.env,  // koa 提供的环境变量
            projectName: 'back-API',
            appLogLevel: 'debug',
            dir: 'logs',
            serverIp: ip.address()
        }))
    その他の特別な場所ではログの使用法が必要です
  1. ctx.log.error(err.stack); //记录错误日志
    ctx.log.info(err.stack); // 记录信息日志
    ctx.log.warn(err.stack); // 记录警告日志
    ...
    スクリーンショットの実行

Koaログミドルウェアのカプセル化と開発方法の紹介log4js は基本的な構成とプロセス分析を使用します

設定項目を設定します,

#
// 配置项形式
{
    appenders:{
        [自定义key]:{}
    },
    categories:{
    }
}
// 配置
config: {
    appenders:{
        // 每一个属性可以看作为一个配置模块
        out: {
            type: 'dateFile', //输出日志类型
            filename: `log/task`,  //输出日志路径
            pattern: '-yyyy-MM-dd.log', //日志文件后缀名(task-2019-03-08.log)
            ...//具体配置看官网
        },
        error: {
            type: 'dateFile',
            filename: 'log/error',
            pattern: '-yyyy-MM-dd.log'',
            "alwaysIncludePattern": true
        },
        stdout: { type: 'stdout' }, //在控制台上打印信息
    },
    // 通过categories来取出给log4js按需配置,返回配置后的log4js对象,每个属性配置相当于一个不同的log4js配置对象入口;default为默认入口(getLogger()找不到入口时默认使用default)
    categories:{
        // 配置默认入口,使用appenders中的'stdout','out'配置模块,记录trace以上等级日志
        default: { appenders: ['stdout','out'], level: 'trace' },
        // 配置error门入口,使用appenders中的'stdout','err'配置模块,记录error以上等级日志
        error : {appenders: ['err'], level: 'error'}
    }
}
    let logger_out = log4js.getLogger('app');
  1. log4js.getLogger('app') を使用して、特定の log4js オブジェクト プロセスを検索します。まず、app パラメーター値に基づいてカテゴリで検索します。 、 app がないことがわかり、デフォルトで設定にデフォルトに対応するアペンダが使用されます。つまり、情報は log/task-yyyy-mm-dd.log ファイルに出力され、コンソールへの出力

Use let logger_out = log4js.getLogger('error');

error パラメータ値に基づいてカテゴリを検索し、エラー設定がないことを確認します。エラーに対応するアペンダが設定に使用されます。つまり、情報は log/error-yyyy- mm-dd.log ファイルに出力されます。エラー設定項目アペンダでは stdout モジュールが使用されないため、コンソールに情報は出力されません

ログをデータベースに保存する必要があるかどうかは後で検討します ログ記録を永久に保存することは不可能であることを考慮して、ログの永続化を実行します1 か月前や 1 週間前のログを保存する必要はないかもしれませんが、期限切れのログファイルを定期的に自動的に削除する設定を開発する必要があります(データベースのログレコードを取得)

以上がKoaログミドルウェアのカプセル化と開発方法の紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。