Berbagi teknologi

Elasticsearch: Pencatatan ECS Node.js - Winston

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Ini merupakan lanjutan dari artikel sebelumnya"Elasticsearch: Pencatatan ECS Node.js - Pino” kelanjutan dari. Kami melanjutkan artikel sebelumnya untuk membahas tentang penggunaan paket Winston untuk menargetkan Bahasa pemrograman Node.js Aplikasi ini menghasilkan ECS untuk mencocokkan hari itu.Paket Node.js ini adalahpenebang winstonFormatter disediakan, dengan Pencatatan log Elastic Common Schema (ECS). kompatibel.menggabungkanKetukan file Pengirim, Anda dapat memantau semua log dari satu tempat di Elastic Stack. Mendukung versi winston 3.x >=3.3.3.

mempersiapkan

Install

  1. npm install @elastic/ecs-winston-format
  2. npm install winston

Konfigurasi

winston-logging.js

  1. const winston = require('winston');
  2. const { ecsFormat } = require('@elastic/ecs-winston-format');
  3. const logger = winston.createLogger({
  4. format: ecsFormat(/* options */), // 1
  5. transports: [
  6. new winston.transports.Console()
  7. ]
  8. });
  9. logger.info('hi');
  10. logger.error('oops there is a problem', { err: new Error('boom') });
  • Berikan formatter ECS ke winston.

Hasil dari menjalankan kode di atas adalah:

Konfigurasikan Filebeat

Filebeat 7.16+

filebeat.yml

  1. filebeat.inputs:
  2. - type: filestream # 1
  3. paths: /path/to/logs.json
  4. parsers:
  5. - ndjson:
  6. overwrite_keys: true # 2
  7. add_error_key: true # 3
  8. expand_keys: true # 4
  9. processors: // 5
  10. - add_host_metadata: ~
  11. - add_cloud_metadata: ~
  12. - add_docker_metadata: ~
  13. - add_kubernetes_metadata: ~
  1. Gunakan input filestream untuk membaca baris dari file log aktivitas.
  2. Jika terjadi konflik, nilai objek JSON yang didekodekan akan menimpa bidang yang biasanya ditambahkan Filebeat (jenis, sumber, offset, dll.).
  3. Jika terjadi kesalahan unmarshalling JSON, Filebeat akan menambahkan kunci "error.message" dan "error.type: json".
  4. Filebeat akan secara rekursif menghapus kunci titik dari JSON yang didekodekan dan mengembangkannya menjadi struktur objek hierarki.
  5. Prosesor menyempurnakan data Anda.Melihatprosesor untuk mempelajari lebih lanjut.

Ketukan file < 7.16

filebeat.yml

  1. filebeat.inputs:
  2. - type: log
  3. paths: /path/to/logs.json
  4. json.keys_under_root: true
  5. json.overwrite_keys: true
  6. json.add_error_key: true
  7. json.expand_keys: true
  8. processors:
  9. - add_host_metadata: ~
  10. - add_cloud_metadata: ~
  11. - add_docker_metadata: ~
  12. - add_kubernetes_metadata: ~

Untuk informasi lebih lanjut, lihat Referensi filebeat

Cara Penggunaan

winston-logging.js

  1. const winston = require('winston');
  2. const { ecsFormat } = require('@elastic/ecs-winston-format');
  3. const logger = winston.createLogger({
  4. level: 'info',
  5. format: ecsFormat(/* options */), // 1
  6. transports: [
  7. new winston.transports.Console()
  8. ]
  9. });
  10. logger.info('hi');
  11. logger.error('oops there is a problem', { foo: 'bar' });
  1. Lihat opsi yang tersedia di bawah.
node winston-logging.js | jq .

Jalankan skrip ini (tersedia diDi Sinidiperoleh) akan menghasilkan keluaran log yang mirip dengan di atas.

Pemformat bertanggung jawab untuk membuat serial data ke dalam JSON, jadi Anda tidak perlu menambahkannya Bahasa Indonesia: Bahasa Indonesia: json Pemformat.Selain itu, pemformat secara otomatis membuat stempel waktu, jadi Anda tidak perlu menambahkannyacap waktu Pemformat.

Kesalahan pencatatan

Secara default, pemformat mengonversi metafield err dari instance Error menjadi Bidang ECSError .Misalnyacontoh

winston-logging.js

  1. const winston = require('winston');
  2. const { ecsFormat } = require('@elastic/ecs-winston-format');
  3. const logger = winston.createLogger({
  4. format: ecsFormat(),
  5. transports: [
  6. new winston.transports.Console()
  7. ]
  8. });
  9. const myErr = new Error('boom');
  10. logger.info('oops', { err: myErr });

Penanganan khusus terhadap metafield err dapat dinonaktifkan melalui opsi convertErr: false :

winston-logging.js

  1. const winston = require('winston');
  2. const { ecsFormat } = require('@elastic/ecs-winston-format');
  3. const logger = winston.createLogger({
  4. format: ecsFormat({convertErr: false} ),
  5. transports: [
  6. new winston.transports.Console()
  7. ]
  8. });
  9. const myErr = new Error('boom');
  10. logger.info('oops', { err: myErr });

Permintaan HTTP dan pencatatan respons

Dengan menggunakan opsi convertReqRes: true, pemformat akan secara otomatis mengonversi inti Node.js ketika diteruskan sebagai metafield req dan res. meminta Dantanggapan obyek.

winston-logging.js

  1. const http = require('http');
  2. const winston = require('winston');
  3. const { ecsFormat } = require('@elastic/ecs-winston-format');
  4. const logger = winston.createLogger({
  5. level: 'info',
  6. format: ecsFormat({ convertReqRes: true }), // 1
  7. transports: [
  8. new winston.transports.Console()
  9. ]
  10. });
  11. const server = http.createServer(handler);
  12. server.listen(3000, () => {
  13. logger.info('listening at http://localhost:3000')
  14. });
  15. function handler (req, res) {
  16. res.setHeader('Foo', 'Bar');
  17. res.end('ok');
  18. logger.info('handled request', { req, res }); // 2
  19. }
  1. Gunakan opsi convertReqRes
  2. Rekam metafield req dan/atau res

Ini akan berguna Bidang HTTP ECS Menghasilkan log yang berisi informasi permintaan dan respons.Misalnyacontoh

Di atas, kita perlu mengakses http://host lokal:3000 Baru setelah itu Anda dapat melihat informasi hari yang ditunjukkan di atas.

Gunakan APM untuk korelasi log

ini ECS pemformat log denganAPM elastis terintegrasi.Jika aplikasi Node Anda menggunakanAgen APM Elastis Node.js, beberapa bidang ditambahkan ke catatan log untuk menghubungkan layanan APM atau melacak dan mencatat data:

  • Pernyataan log (seperti logger.info(...)) dipanggil saat penelusuran suatu rentang akan disertakanbidang pelacakan— trace.id, transaksi.id, span.id.
  • Beberapa bidang pengidentifikasi layanan, ditentukan oleh atau dikonfigurasi pada agen APM, memungkinkan tautan silang antara layanan dan log di Kibana — service.name, service.version, service.environment, service.node.name.
  • event.dataset diaktifkan di aplikasi Elastic ObservabilityDeteksi anomali tingkat log

Misalnya, lari contoh/http-dengan-elastic-apm.js Danikal -i localhost:3000/ Catatan log yang berisi konten berikut dihasilkan:

  1. % node examples/http-with-elastic-apm.js | jq .
  2. ...
  3. "service.name": "http-with-elastic-apm",
  4. "service.version": "1.4.0",
  5. "service.environment": "development",
  6. "event.dataset": "http-with-elastic-apm"
  7. "trace.id": "7fd75f0f33ff49aba85d060b46dcad7e",
  8. "transaction.id": "6c97c7c1b468fa05"
  9. }

ID ini cocok dengan data pelacakan yang dilaporkan oleh agen APM.

Integrasi dengan Elastic APM dapat dinonaktifkan secara eksplisit melalui opsi apmIntegration: false, misalnya:

  1. const logger = winston.createLogger({
  2. format: ecsFormat({ apmIntegration: false }),
  3. // ...
  4. })

Keterbatasan dan Catatan

spesifikasi ecs-logging Disarankan agar tiga bidang pertama dalam catatan log adalah @timestamp, log.level, dan pesan. Dimulai dengan versi 1.5.0, pemformat ini tidak mengikuti rekomendasi ini. Hal ini dimungkinkan tetapi memerlukan pembuatan objek baru di ecsFields untuk setiap catatan log. Mengingat bahwa urutan bidang ecs-logging adalah untuk keterbacaan dan tidak mempengaruhi interoperabilitas, maka diputuskan untuk memprioritaskan kinerja.

mengacu pada

ecsFormat([pilihan])

  • opsi {type-object} mendukung opsi berikut:
    • convertErr {type-boolean} Apakah akan mengubah bidang err pada catatan menjadi bidang kesalahan ECS.nilai bawaan:BENAR.
    • convertReqRes {type-boolean} Apakah akan mencatat bidang permintaan dan respons HTTP req dan res ke bidang HTTP ECS, Agen-Pengguna, dan URL.nilai bawaan:PALSU.
    • apmIntegration {type-boolean} Apakah akan mengaktifkan integrasi agen APM.nilai bawaan:BENAR.
    • serviceName {type-string} nilai "layanan.nama". Jika ditentukan, ganti nilai apa pun dari agen APM aktif.
    • serviceVersion {type-string} nilai "layanan.versi". Jika ditentukan, ganti nilai apa pun dari agen APM aktif.
    • serviceEnvironment {type-string} nilai "layanan.lingkungan". Jika ditentukan, ganti nilai apa pun dari agen APM aktif.
    • serviceNodeName {type-string} nilai "service.node.name". Jika ditentukan, nilai apa pun dari agen APM aktif akan ditimpa.
    • eventDataset {type-string} nilai "event.dataset". Jika ditentukan, nilai default penggunaan ${serviceVersion} akan diganti.

Buat pemformat untuk winston yang mengeluarkan format logging ECS.Ini adalah pengobatanecsFields([pilihan]) DanecsStringify([pilihan]) format tunggal. Dua berikut ini setara:

  1. const { ecsFormat, ecsFields, ecsStringify } = require('@elastic/ecs-winston-format');
  2. const winston = require('winston');
  3. const logger = winston.createLogger({
  4. format: ecsFormat(/* options */),
  5. // ...
  6. });
  7. const logger = winston.createLogger({
  8. format: winston.format.combine(
  9. ecsFields(/* options */),
  10. ecsStringify()
  11. ),
  12. // ...
  13. });

ecsFields([pilihan])

  • opsi {type-object} mendukung opsi berikut:
    • convertErr {type-boolean} Apakah akan mengubah bidang err pada catatan menjadi bidang kesalahan ECS.nilai bawaan:BENAR.
    • convertReqRes {type-boolean} Apakah akan mencatat bidang permintaan dan respons HTTP req dan res ke bidang HTTP ECS, Agen-Pengguna, dan URL.nilai bawaan:PALSU.
    • apmIntegration {type-boolean} Apakah akan mengaktifkan integrasi agen APM.nilai bawaan:BENAR.
    • serviceName {type-string} nilai "layanan.nama". Jika ditentukan, ganti nilai apa pun dari agen APM aktif.
    • serviceVersion {type-string} nilai "layanan.versi". Jika ditentukan, ganti nilai apa pun dari agen APM aktif.
    • serviceEnvironment {type-string} nilai "layanan.lingkungan". Jika ditentukan, ganti nilai apa pun dari agen APM aktif.
    • serviceNodeName {type-string} nilai "service.node.name". Jika ditentukan, nilai apa pun dari agen APM aktif akan ditimpa.
    • eventDataset {type-string} nilai "event.dataset". Jika ditentukan, setelan default penggunaan ${serviceVersion} akan diganti.

Buat pemformat untuk winston yang mengonversi bidang pada objek informasi logging ke format logging ECS.

ecsStringify([pilihan])

Buat pemformat untuk winston untuk merangkai/membuat serial catatan log ke JSON.

Ini mirip dengan logform.json(). Keduanya menggunakan paket safe-stable-stringify untuk menghasilkan JSON. Beberapa perbedaan:

  • Stringifier ini melewatkan serialisasi bidang level karena ini bukan bidang ECS.
  • Winston menyediakan pengganti yang mengubah bigint menjadi string. Alasannya adalah parser JavaScript JSON kehilangan presisi saat mengurai bigint. Keberatannya adalah BigInt mengubah tipe menjadi string, bukan angka. Saat ini, stringifier ini tidak mengonversi BitInt menjadi string.