广告
返回顶部
首页 > 资讯 > 精选 >怎么使用webpack在日志中记录文件行号
  • 199
分享到

怎么使用webpack在日志中记录文件行号

2023-07-04 14:07:03 199人浏览 泡泡鱼
摘要

本文小编为大家详细介绍“怎么使用webpack在日志中记录文件行号”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么使用WEBpack在日志中记录文件行号”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。前言在做前

本文小编为大家详细介绍“怎么使用webpack日志中记录文件行号”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么使用WEBpack在日志中记录文件行号”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

前言

在做前端项目时,会在各个关键节点打印日志,方便后续数据分析和问题排查。当日志越来越多之后,又会遇到通过日志反查代码所在文件和所在行的场景,于是一个很自然的需求就出来了:

在打印日志的时候,自动注入当前文件名、行号、列号。

举个例子,有个 logger 函数,我们在 index.js 的业务代码某一行添加打印逻辑:

const { logLine } = require('./utils')function getJuejinArticles() {  const author = 'keliq'  const level = 'LV.5'  // ... 业务代码省略,获取文章列表  logLine(author, level)  // ...}getJuejinArticles()

正常情况下会输出:

keliq LV.5

但是希望能够输出带文件名和行号,即:

[index.js:7:3] keliq LV.5

表明当前这次打印输出来源于 index.js 文件中的第 7 行第 3 列代码,也就是 logLine 函数所在的具体位置。那如何实现这个需求呢?我的脑海中浮现了两个思路:

通过提取 Error 错误栈

因为 error 错误栈里面天然带有此类信息,可以人工制造了一个 Error,然后捕获它:

exports.logLine = (...args) => {  try {    throw new Error()  } catch (e) {    console.log(e.stack)  }}

仔细观察打印的结果:

Error
    at logLine (/test/src/utils.js:3:11)
    at getJuejinArticles (/test/src/index.js:7:3)
    at Object.<anonymous> (/test/src/index.js:11:1)
    at Module._compile (node:internal/modules/cjs/loader:1105:14)
    at Object.Module._extensions..js (node:internal/modules/cjs/loader:1159:10)
    at Module.load (node:internal/modules/cjs/loader:981:32)
    at Function.Module._load (node:internal/modules/cjs/loader:822:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:77:12)
    at node:internal/main/run_main_module:17:47

第三行的内容不正是我们想要的结果吗?只需要把这一行的字符串进行格式化一下,提取出 index.js:7:3 即可:

at getJuejinArticles (/test/src/index.js:7:3)

由于代码结构是这样的:

.
└── src
    ├── index.js
    └── utils.js

只需要改成下面的代码即可:

exports.logLine = (...args) => {  try {    throw new Error()  } catch (e) {    const lines = e.stack.split('\n')    const fileLine = lines[2].split('/src/').pop().slice(0, -1)    console.log(`[${fileLine}]`, ...args)  }}

命令行试一试:

$ test node src/index.js [index.js:7:3] keliq LV.5

问题似乎完美解决,然而还是想的太简单了,上述场景仅限于 node.js 环境,而在 web 环境,所有的产物都会被 webpack 打到一个或多个 js 文件里面,而且做了压缩混淆处理,由于 error 是在运行时被捕获到的 ,所以我没根本无法拿到开发状态下的文件名、行号和列号,如下图所示:

怎么使用webpack在日志中记录文件行号

通过 webpack 预处理

那怎么办呢?解铃还须系铃人,既然 webpack 对代码进行了加工处理,那就只能在预处理最开始的阶段介入进来,写一个自定义的 loader 来解析源码文件,拿到文件名、行号和列号。说干就干,创建一个 inject-line.loader.js,写下模板代码:

module.exports = function (content) {  content = content.toString('utf-8')  if (this.cacheable) this.cacheable()  console.log(this.resourcePath) // 打印文件路径  console.log(content) // 打印文件内容  return content}module.exports.raw = true

然后在 webpack.config.js 中做配置:

module.exports = {  entry: './src/index.js',  output: {    filename: 'index.js',  },  module: {    rules: [      {        test: /.js$/,        exclude: [/node_modules/],        use: [          {            loader: require.resolve('./loaders/inject-line.loader'),          },        ],      },    ],  },}

一切准备就绪,先运行一下看看输出:

怎么使用webpack在日志中记录文件行号

可以看到,index.js 和 utils.js 被自定义的 inject-line.loader.js 给加载到了,通过 this.resourcePath 能够拿到文件名称,行号和列号的话只能通过分析 content 字符串进行提取了,处理的代码如下:

// 拿到文件路径const fileName = this.resourcePath.split('/src/').pop()// 文本内容按行处理后再拼接起来content = content  .split('\n')  .map((line, row) => {    const re = /logLine((.*?))/g    let result    let newLine = ''    let cursor = 0    while ((result = re.exec(line))) {      const col = result.index      newLine += line.slice(cursor, result.index) + `logLine('${fileName}:${row + 1}:${col + 1}', ` + result[1] + ')'      cursor += col + result[0].length    }    newLine += line.slice(cursor)    return newLine  })  .join('\n')

这里面的逻辑,如果光看代码的话可能会云里雾里,其实思路很简单,就是下面这样的:

怎么使用webpack在日志中记录文件行号

这样的话,即使代码经过各种压缩转换,也不会改变开发状态下代码所在的文件名、行与列的位置了。打开 webpack 打包后的文件看一下:

怎么使用webpack在日志中记录文件行号

到这里,功能就已经开发完了,不过还有一个小小的缺陷就是 logLine 函数名是写死的,能不能让用户自己定义这个函数名呢?当然可以,在 webpack 配置文件中,支持利用 options 属性传递 config 配置参数:

module.exports = {  entry: './src/index.js',  output: {    filename: 'index.js',  },  module: {    rules: [      {        test: /.js$/,        exclude: [/node_modules/],        use: [          {            loader: require.resolve('./loaders/inject-line.loader'),            options: {              config: {                name: 'customLogName',              },            },          },        ],      },    ],  },}

然后在 inject-line.loader.js 代码中通过 this.query.config 拿到该配置即可,不过正则表达式也要根据这个配置动态创建,字符串替换的时候也要换成该配置变量,最终代码如下:

module.exports = function (content) {  content = content.toString('utf-8')  if (this.cacheable) this.cacheable()  const { name = 'logLine' } = this.query.config || {}  const fileName = this.resourcePath.split('/src/').pop()  content = content    .split('\n')    .map((line, row) => {      const re = new RegExp(`${name}\((.*?)\)`, 'g')      let result      let newLine = ''      let cursor = 0      while ((result = re.exec(line))) {        const col = result.index        newLine += line.slice(cursor, result.index) + `${name}('${fileName}:${row + 1}:${col + 1}', ` + result[1] + ')'        cursor += col + result[0].length      }      newLine += line.slice(cursor)      return newLine    })    .join('\n')  return content}module.exports.raw = true

读到这里,这篇“怎么使用webpack在日志中记录文件行号”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网精选频道。

--结束END--

本文标题: 怎么使用webpack在日志中记录文件行号

本文链接: https://www.lsjlt.com/news/345963.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么使用webpack在日志中记录文件行号
    本文小编为大家详细介绍“怎么使用webpack在日志中记录文件行号”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么使用webpack在日志中记录文件行号”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。前言在做前...
    99+
    2023-07-04
  • C#怎么使用Log4.net记录日志文件
    这篇文章主要讲解了“C#怎么使用Log4.net记录日志文件”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#怎么使用Log4.net记录日志文件”吧!一、简介1.1 Log4.net优点几...
    99+
    2023-06-30
  • 在springboot中怎么使用AOP进行全局日志记录
    小编给大家分享一下在springboot中怎么使用AOP进行全局日志记录,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!1、 spring AOP 是什么?spring 的两大核心就是 IOC 和 AOP,AOP 是 spr...
    99+
    2023-06-21
  • PHP编程技巧:如何在日志记录中使用文件?
    日志记录是在软件开发中非常重要的一个环节。它可以帮助我们追踪程序的运行情况,排除问题,更好地了解程序的运行状况。在PHP中,我们通常使用文件来记录日志。本文将介绍如何在日志记录中使用文件的PHP编程技巧。 一、创建日志文件 在使用文件记录...
    99+
    2023-06-18
    日志 编程算法 文件
  • 怎么在python中利用 loguru记录日志
    本篇文章为大家展示了怎么在python中利用 loguru记录日志,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。python有哪些常用库python常用的库:1.requesuts;2.scrapy...
    99+
    2023-06-14
  • thinkphp6如何使用中间件记录行为日志
    目录前言一、定义中间件二、使用日志通道暂存行为日志1.修改log配置文件2.注册全局中间件3.测试能否成功生成日志三、使用定时任务将日志内容定时写入数据库1.新建一个api方法2.新...
    99+
    2023-03-24
    thinkphp6中间件 中间件记录行为日志 thinkphp6行为日志
  • Go日志:如何在Spring项目中使用Git进行日志记录?
    日志记录是任何应用程序中必不可少的一部分,因为它可以帮助开发者定位并解决问题。在Go语言中,我们可以使用标准库中的log包来记录日志。但是,如果我们在一个Spring项目中使用Go语言进行开发,我们可能需要将日志记录到Git中,这样可以更...
    99+
    2023-08-05
    日志 spring git
  • 在springboot中使用AOP进行全局日志记录
    目录前言1、 spring AOP 是什么?2、spring AOP 能做什么?3、spring AOP 我能用 AOP 解决什么问题?一、引入依赖,增加自定义注解1、引入 mave...
    99+
    2022-11-12
  • laravel怎么使用中间件记录用户请求日志
    这篇文章主要讲解了“laravel怎么使用中间件记录用户请求日志”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“laravel怎么使用中间件记录用户请求日志”吧!一、创建中间件可以使用命令创建...
    99+
    2023-06-30
  • 如何在 Windows 中使用 ASP 日志记录 JavaScript 事件?
    ASP 日志记录是一个非常强大的功能,能够帮助您快速、准确地记录 JavaScript 事件。在 Windows 系统中,使用 ASP 日志记录 JavaScript 事件非常简单,只需要按照以下步骤操作即可。 步骤一:创建 ASP 文件 ...
    99+
    2023-09-22
    日志 javascript windows
  • 如何使用logzero在Python中进行简单日志记录
    这篇文章主要介绍如何使用logzero在Python中进行简单日志记录,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!logzero 库使日志记录就像打印语句一样容易,是简单性的杰出代表。我不确定 logzero 的名...
    99+
    2023-06-16
  • 想要在 Laravel 中使用 ASP IDE 记录的日志,该怎么做?
    Laravel 是一个流行的 PHP 框架,而 ASP IDE 是一个功能强大的集成开发环境(IDE),用于开发 ASP.NET 应用程序。在 Laravel 应用程序中记录日志是一个非常重要的任务,它可以帮助我们诊断应用程序中的问题并找到...
    99+
    2023-10-14
    ide 日志 laravel
  • 怎样使用Nodejs创建访问日志记录的中间件
    怎样使用Nodejs创建访问日志记录的中间件,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。中间件-访问日志目标利用中间件技术,写一个用来记录访...
    99+
    2022-10-19
  • 运行在Docker里的SpringBoot应用是如何查看记录在文件系统的日志
    运行在Docker里的SpringBoot应用是如何查看记录在文件系统的日志,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。我有一个SpringBoot应用,将其...
    99+
    2023-06-04
  • 怎么在phpmyadmin中使用日志文件写入数据
    今天就跟大家聊聊有关怎么在phpmyadmin中使用日志文件写入数据,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。前提:root权限,已经进入了ph...
    99+
    2022-10-18
  • MySQL中怎么使用更新日志文件
    这篇文章将为大家详细讲解有关MySQL中怎么使用更新日志文件,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。启用日志当以--log-update=file_n...
    99+
    2022-10-18
  • 如何在ASP应用程序中使用NumPy进行日志记录和同步?
    ASP应用程序是一种常用的Web应用程序框架,它为开发人员提供了许多强大的功能和工具,使得开发Web应用变得更加容易和高效。在这篇文章中,我们将介绍如何在ASP应用程序中使用NumPy进行日志记录和同步,以提高Web应用的稳定性和可靠性。 ...
    99+
    2023-09-19
    numy 同步 日志
  • 怎么在Linux中使用cronolog切割服务器日志文件
    这篇文章给大家介绍怎么在Linux中使用cronolog切割服务器日志文件,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。下载(最新版本)代码如下:#  wget http://cronolog.org/dow...
    99+
    2023-06-12
  • 如何在 PHP 容器中使用关键字进行高效的日志记录?
    PHP 是一种被广泛使用的脚本语言,它的应用范围非常广泛,从网站开发到大规模的企业应用程序。在这个过程中,日志记录是至关重要的,因为它可以帮助我们在应用程序中找到问题并诊断它们。在本文中,我们将讨论如何在 PHP 容器中使用关键字进行高效的...
    99+
    2023-10-23
    容器 关键字 日志
  • 为什么要在Java项目中使用Numy作为日志记录工具?
    在Java项目中使用Numy作为日志记录工具有很多好处。Numy是一种基于日志的分析工具,可以帮助开发人员更好地监控和分析应用程序的行为和性能。 首先,Numy可以帮助开发人员更好地了解应用程序的运行情况。通过记录应用程序的日志信息,Num...
    99+
    2023-10-07
    日志 npm numy
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作