Ajar anda langkah demi langkah cara menulis log dalam perkhidmatan Node.js

青灯夜游
Lepaskan: 2021-12-28 10:49:52
ke hadapan
2745 orang telah melayarinya

Bagaimana untuk menulis log dalam perkhidmatan Node? Artikel berikut akan memberi anda pemahaman praktikal tentang cara menulis log dalam perkhidmatan Node.js saya harap ia akan membantu anda.

Ajar anda langkah demi langkah cara menulis log dalam perkhidmatan Node.js

Apabila menggunakan Node untuk menulis pelayan, perkara yang paling menyusahkan ialah menyelesaikan masalah kedudukan, kerana tidak seperti penyemak imbas Chrome, kami mempunyai gesaan ralat langsung dalam dev tool, atau kami boleh terus menyahpepijat titik putus.

Kita sering menghadapi masalah kenapa test persekitaran tidak baik walaupun saya berada dalam persekitaran live. Jika tiada log, tiada petunjuk tentang masalah ini.

Jadi dalam artikel ini, mari kita bincangkan tentang cara menulis log dalam perkhidmatan Node.

Cepat buat projek koa

Mula-mula pastikan anda telah memasangnya secara global koa2:

npm i koa2 -g
Salin selepas log masuk

Kemudian laksanakan:

koa2 -e node-log # 新建一个项目
cd node-log
npm i # 安装依赖
npm run start # 启动
Salin selepas log masuk

Perkhidmatan asas telah disediakan. Lawati http://localhost:3000/ dan anda akan melihat halaman berikut:

Ajar anda langkah demi langkah cara menulis log dalam perkhidmatan Node.js

Di atas ialah cara cepat untuk membina perkhidmatan koa. Projek ini mempunyai perpustakaan pengelogan terbina dalam——koa-logger. Mari kita lihat dahulu apa yang dilakukannya.

koa-logger

Pustaka ini agak mudah dan merekodkan maklumat asas permintaan, seperti kaedah permintaan, URL, masa, dsb. Apabila digunakan sebagai middleware, ambil perhatian: Adalah disyorkan untuk meletakkannya sebelum semua middleware Ini berkaitan dengan model onion koa. Jika ia bukan yang pertama, masa yang dikira akan menjadi tidak tepat.

var logger = require('koa-logger');
app.use(logger());
Salin selepas log masuk

Apabila kami mengakses sumber respons, log yang sepadan akan dikeluarkan pada konsol seperti berikut:

  <-- GET /
GET / - 14
  --> GET / 200 19ms 234b
  <-- GET /stylesheets/style.css
GET /stylesheets/style.css - 1
  --> GET /stylesheets/style.css 200 3ms 111b
  <-- GET /favicon.ico
GET /favicon.ico - 1
  --> GET /favicon.ico 404 1ms -
Salin selepas log masuk

Secara lalai, log terus melalui console Output ke konsol, jika kita perlu melakukan operasi tersuai pada log, seperti menulis ke fail log, dsb. Ia boleh dilakukan dengan cara yang sama, sebagai contoh, saya merekodkan masa:

app.use(logger((str) => {
  console.log(new Date() + str)
  // redirect koa logger to other output pipe
  // default is process.stdout(by console.log function)
}))
Salin selepas log masuk

Keputusan:

Mon Oct 11 2021 19:28:41 GMT+0800 (China Standard Time)  <-- GET /
GET / - 10ms
Mon Oct 11 2021 19:28:41 GMT+0800 (China Standard Time)  --> GET / 200 20ms 226b
Mon Oct 11 2021 19:28:41 GMT+0800 (China Standard Time)  <-- GET /stylesheets/style.css
Mon Oct 11 2021 19:28:41 GMT+0800 (China Standard Time)  --> GET /stylesheets/style.css 200 4ms 111b
Salin selepas log masuk

koa-log4js

koa-logger Kuantiti yang agak ringan, dan juga mendedahkan antara muka yang agak fleksibel. Tetapi untuk kegunaan perniagaan sebenar, saya secara peribadi mengesyorkan menggunakan koa-log4js. Sebab utama adalah seperti berikut:

  • koa-logger nampaknya hanya menyokong penggunaan perisian tengah, tetapi tidak menyokong fungsi melaporkan log tertentu.
  • Terdapat sedikit fungsi terbina dalam. Contohnya, pengelasan dan penempatan log, dsb.

koa-log4js membalut log4js untuk menyokong Koa perisian tengah log. Konfigurasinya konsisten dengan log4js. Jadi jika anda menggunakan log4js, penggunaan haruslah konsisten.

Gunakan

untuk memasang:

npm i --save koa-log4
Salin selepas log masuk

Mari lihat penggunaan dahulu, buat folder baharu log dalam direktori akar. Dan buat folder baharu utils dan buat fail baharu logger.js di dalamnya. Kodnya adalah seperti berikut:

const path = require(&#39;path&#39;);
const log4js = require(&#39;koa-log4&#39;);
const RUNTIME_PATH = path.resolve(__dirname, &#39;../&#39;);
const LOG_PATH = path.join(RUNTIME_PATH, &#39;log&#39;);

log4js.configure({
  // 日志的输出
  appenders: {
    access: {
      type: &#39;dateFile&#39;,
      pattern: &#39;-yyyy-MM-dd.log&#39;, //生成文件的规则
      alwaysIncludePattern: true, // 文件名始终以日期区分
      encoding: &#39;utf-8&#39;,
      filename: path.join(LOG_PATH, &#39;access.log&#39;) //生成文件名
    },
    application: {
      type: &#39;dateFile&#39;,
      pattern: &#39;-yyyy-MM-dd.log&#39;,
      alwaysIncludePattern: true,
      encoding: &#39;utf-8&#39;,
      filename: path.join(LOG_PATH, &#39;application.log&#39;)
    },
    out: {
      type: &#39;console&#39;
    }
  },
  categories: {
    default: { appenders: [ &#39;out&#39; ], level: &#39;info&#39; },
    access: { appenders: [ &#39;access&#39; ], level: &#39;info&#39; },
    application: { appenders: [ &#39;application&#39; ], level: &#39;all&#39;}
  }
});

// getLogger 传参指定的是类型
exports.accessLogger = () => log4js.koaLogger(log4js.getLogger(&#39;access&#39;)); // 记录所有访问级别的日志
exports.logger = log4js.getLogger(&#39;application&#39;);
Salin selepas log masuk

Penjelasan ringkas, configure ialah konfigurasi log4js-node (akan diterangkan secara terperinci kemudian), dan parameter dihantar sebagai jenis log melalui getLogger fungsi, sebagai contoh, access ialah log tahap akses.

Kemudian tambahkan app.js:

const { accessLogger, logger } = require(&#39;./utils/logger&#39;);
app.use(accessLogger())
Salin selepas log masuk

dan routes/index.js tambah:

+ const { logger } = require(&#39;../utils/logger&#39;)

router.get(&#39;/&#39;, async (ctx, next) => {
+  logger.info(&#39;我是首页&#39;);
  await ctx.render(&#39;index&#39;, {
    title: &#39;Hello Koa 2!&#39;
  })
})
Salin selepas log masuk

Muat semula, anda boleh melihat folder log Output dua fail :

Ajar anda langkah demi langkah cara menulis log dalam perkhidmatan Node.js

dan rekod masing-masing:

[2021-10-12T10:43:33.914] [INFO] access - ::1 - - "GET / HTTP/1.1" 200 226 "" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36"
[2021-10-12T10:43:34.065] [INFO] access - ::1 - - "GET /stylesheets/style.css HTTP/1.1" 200 111 "http://localhost:3000/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36"
Salin selepas log masuk
[2021-10-12T10:43:33.902] [INFO] application - 我是首页
Salin selepas log masuk

Seterusnya, mari kita lihat konfigurasi log4js.

peringkat

Fungsi utama klasifikasi log adalah untuk memaparkan log (warna berbeza) dengan lebih baik dan meletakkan log secara selektif, seperti untuk mengelakkan beberapa debug sensitif balak telah bocor. log4js Terdapat sembilan tahap secara lalai (anda boleh mengubah suainya melalui levels), seperti berikut:

{
  ALL: new Level(Number.MIN_VALUE, "ALL"),
  TRACE: new Level(5000, "TRACE"),
  DEBUG: new Level(10000, "DEBUG"),
  INFO: new Level(20000, "INFO"),
  WARN: new Level(30000, "WARN"),
  ERROR: new Level(40000, "ERROR"),
  FATAL: new Level(50000, "FATAL"),
  MARK: new Level(9007199254740992, "MARK"), // 2^53
  OFF: new Level(Number.MAX_VALUE, "OFF")
}
Salin selepas log masuk

Seperti yang ditunjukkan di bawah:

Ajar anda langkah demi langkah cara menulis log dalam perkhidmatan Node.js

只会输出级别相等或者级别高的日志。比如你配置了 WARN,就不会输出 INFO 的日志。 可以在下面配置的 categories 中配置不同的类型日志的日志级别。

categories

日志类别。必须配置默认日志类别,用于没有命中的情况下的兜底行为。该配置为一个对象,key 值为分类名称。比如上述 demo 中:

{
  default: { appenders: [ &#39;out&#39; ], level: &#39;info&#39; },
  access: { appenders: [ &#39;access&#39; ], level: &#39;info&#39; },
  application: { appenders: [ &#39;application&#39; ], level: &#39;all&#39;}
}
Salin selepas log masuk

其中每个类别都有两个配置 appenders 是一个字符串数组,是输出配置(后文中会详解),可以指定多个,至少要有一个。level 是上文日志级别。

appenders

解决了日志分级和分类,接下来是日志落盘,也就是输出日志的问题。对应的配置是 appenders,该配置的 key 值为自定义的名称(可以给 categories 中的 appenders 使用),属性值为一个对象,配置输出类型。如下所示:

// 日志的输出
appenders: {
  access: {
    type: &#39;dateFile&#39;,
    pattern: &#39;-yyyy-MM-dd.log&#39;, //生成文件的规则
    alwaysIncludePattern: true, // 文件名始终以日期区分
    encoding: &#39;utf-8&#39;,
    filename: path.join(LOG_PATH, &#39;access.log&#39;) //生成文件名
  },
  out: {
    type: &#39;console&#39;
  }
}
Salin selepas log masuk

其中,out 指的是通过 console 输出,这个可以作为我们的一个兜底。accesstypedataFile,指的是输出文件,然后配置文件的命名和输出路径。除了这个类型,详情可以看官网,比如 SMTP 通过邮件发送(这个需要 nodemailer

总结配置

日志分级、日志分类以及日志落盘,配置上的关系如下:

Ajar anda langkah demi langkah cara menulis log dalam perkhidmatan Node.js

总结

日志对于我们服务端排查定位问题非常重要,本文通过 koa-loggerkoa-log4js 讲解了如何上报日志。

koa-logger 比较轻量,记录请求的基本信息,也提供了一定的自定义能力。

koa-log4js 在日志分级、日志分类以及日志落盘上提供了一定的能力,个人认为基本这个更加适用于生产环境。

更多node相关知识,请访问:nodejs 教程!!

Atas ialah kandungan terperinci Ajar anda langkah demi langkah cara menulis log dalam perkhidmatan Node.js. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:juejin.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan