ノードはどのようにしてリンク全体のログをエレガントに出力するのでしょうか?次の記事では、node でフルリンクのログをエレガントに出力する方法を紹介します。
ユーザーが問題を報告した場合: 特定のオンライン機能の使用中にエラーが発生した場合、どのようにすれば迅速かつ正確にエラーを特定できるでしょうか?特定のリクエスト インターフェイスがデータを返すのが遅い場合に最適化を効果的に追跡するにはどうすればよいでしょうか?
ご存知のとおり、リクエストが届くと、おそらく次のログが生成されます:
1. AceesLog : ユーザー アクセス ログ
##2. 例外: コード例外ログ##3. SQL: SQL クエリ ログ
##4. ThirdParty: サードパーティ サービス ログ1 つのリクエストによって生成されたすべてのログを追跡するには? 一般的なアプローチは、requestId を一意の識別子として使用することです。次に、ミドルウェアを作成し、requestId をコンテキストに挿入します。ロギングが必要な場合は、コンテキストから出力します。 サードパーティ サービスと SQL ログでは、印刷のために requestId も対応する関数に渡す必要があります。このレイヤーごとの転送は非常に面倒で、コードも比較的煩雑です。 私たちの目標は、コードの侵入性を軽減し、コードを一度挿入すれば自動的に追跡することです。 調査後、async_hooks は非同期動作のライフ サイクルを追跡できます。各非同期リソース (各リクエストは非同期リソースです) には 2 つの ID があり、 は asyncId (現在のライフ サイクル ID)非同期リソースの)、trigerAsyncId (親非同期リソース ID)。 async_hooks は、非同期リソースを監視するための次のライフ サイクル フックを提供します。asyncHook = async_hook.createHook({ // 监听异步资源的创建 init(asyncId,type,triggerAsyncId,resource){}, // 异步资源回调函数开始执行之前 before(asyncId){}, // 异步资源回调函数开始执行后 after(asyncId){}, // 监听异步资源的销毁 destroy(asyncId){} })
const createNamespace = require('cls-hooked').createNamespace const session = createNamespace('requestId-store') module.exports = session
const session = require('./session') module.exports = { info: (message) => { const requestId = session.get('requestId') console.log(`requestId:${requestId}`, message) }, error: (message) => { const requestId = session.get('requestId') console.error(`requestId:${requestId}`, message) } }
const logger = require("./logger") new Sequelize( logging: function (sql, costtime) { logger.error( `sql exe : ${sql} | costtime ${costtime} ms` ); } )
const session = require('./session') const logger = require('./logger') async function accessHandler(ctx, next) { const requestId = ctx.header['x-request-id'] || uuid() const params = ctx.request.body ? JSON.stringify(ctx.request.body) : JSON.stringify(ctx.request.query) // 设置requestId session.run(() => { session.set('requestId', requestId) logger.info(`url:${ctx.request.path};params:${params}`) next() // 设置返回响应头 ctx.res.setHeader('X-Request-Id',requestId) }) }
访问日志: requestId:79f422a6-6151-4bfd-93ca-3c6f892fb9ac url:/home;params:{"a":"1"} Sql日志: requestId:79f422a6-6151-4bfd-93ca-3c6f892fb9ac sql exe : Executed (default): SELECT `id` FROM t_user
#async_hook を使用しない場合よりも約 10% 増加します。
レベル 100 の QPS システムには問題ありませんが、同時実行性の高いサービスの場合は、慎重に検討する必要があるかもしれません。
ps: エラーがある場合は指摘してください。気に入らない場合はコメントしないでください。ノード関連の詳細については、nodejs を参照してください。チュートリアル###!
以上がノードでフルリンクのログをエレガントに出力する方法を段階的に説明しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。