Seorang logger untuk apa saja.
Lihat Panduan Peningkatan untuk informasi lebih lanjut. Laporan bug dan PR diterima!
[email protected]
? Harap dicatat bahwa dokumentasi di bawah ini ditujukan untuk winston@3
. Baca dokumentasi [email protected]
.
winston
dirancang untuk menjadi perpustakaan logging yang sederhana dan universal dengan dukungan untuk banyak transportasi. Transportasi pada dasarnya adalah perangkat penyimpanan untuk log Anda. Setiap logger winston
dapat memiliki beberapa transportasi (lihat: Transportasi) yang dikonfigurasi pada tingkat yang berbeda (lihat: Tingkat logging). Misalnya, seseorang mungkin ingin log kesalahan disimpan di lokasi terpencil yang persisten (seperti database), namun semua log dikeluarkan ke konsol atau file lokal.
winston
bertujuan untuk memisahkan bagian-bagian dari proses logging agar lebih fleksibel dan dapat diperluas. Perhatian diberikan untuk mendukung fleksibilitas dalam pemformatan log (lihat: Format) & level (lihat: Menggunakan tingkat logging khusus), dan memastikan API tersebut dipisahkan dari penerapan logging transportasi (yaitu bagaimana log disimpan/diindeks, lihat: Menambahkan Kustom Transports) ke API yang mereka ekspos ke pemrogram.
TL;DR? Lihat contoh mulai cepat di ./examples/
. Ada sejumlah contoh lain di ./examples/*.js
. Tidak melihat contoh yang menurut Anda seharusnya ada di sana? Kirim permintaan tarik untuk menambahkannya!
Cara yang disarankan untuk menggunakan winston
adalah dengan membuat logger Anda sendiri. Cara paling sederhana untuk melakukan ini adalah menggunakan winston.createLogger
:
const winston = memerlukan('winston');const logger = winston.createLogger({ level: 'info', format: winston.format.json(), defaultMeta: { layanan: 'layanan-pengguna' }, transportasi: [ / / // - Tulis semua log dengan tingkat kepentingan `error` atau lebih tinggi ke `error.log` // (yaitu, error, fatal, tetapi bukan level lainnya) // new winston.transports.File({ nama file: 'error.log', level: 'error' }), // // - Tulis semua log dengan tingkat kepentingan `info` atau lebih tinggi ke `combined.log` // (yaitu, fatal, error, warning, dan info , tapi bukan jejak) // new winston.transports.File({ nama file: 'combined.log' }), ],});//// Jika kita tidak sedang berproduksi, masuklah ke `konsol` dengan format:// `${info.level}: ${info.message} JSON.stringify({ ...rest }) `//if (process.env.NODE_ENV !== 'production') { logger.add(winston baru. transports.Console({ format: winston.format.simple(), }));}
Anda juga dapat login langsung melalui logger default yang diekspos oleh require('winston')
, tetapi ini hanya dimaksudkan sebagai logger bersama yang mudah digunakan di seluruh aplikasi Anda jika Anda mau. Perhatikan bahwa logger default tidak memiliki transport apa pun secara default. Anda perlu menambahkan transportasi sendiri, dan membiarkan logger default tanpa transportasi apa pun dapat menyebabkan masalah penggunaan memori yang tinggi.
Motivasi
Mulai Cepat
Penggunaan
Daftar isi
Pencatatan
Membuat logger Anda
Aliran, objectMode
, dan objek info
Format
Menggabungkan format
Interpolasi string
Memfilter info
Objek
Membuat format khusus
Tingkat pencatatan
Menggunakan level logging
Menggunakan tingkat logging khusus
Transportasi
Beberapa transportasi dari jenis yang sama
Menambahkan Angkutan Khusus
Pilihan Transportasi Umum
Pengecualian
Menangani Pengecualian yang Tidak Tertangkap dengan winston
Untuk Keluar atau Tidak Keluar
Penolakan
Menangani Penolakan Janji yang Tidak Tertangkap dengan winston
Pembuatan profil
Log Streaming
Mengkueri Log
Bacaan Lebih Lanjut
Menggunakan logger default
Menunggu log untuk ditulis di winston
Bekerja dengan banyak Logger di winston
Merutekan pesan pengangkutan Konsol ke konsol alih-alih stdout dan stderr
Instalasi
Jalankan Tes
Tingkat logging di winston
sesuai dengan urutan tingkat keparahan yang ditentukan oleh RFC5424: tingkat keparahan semua tingkat diasumsikan naik secara numerik dari yang paling penting hingga yang paling tidak penting.
const level = { kesalahan: 0, peringatan: 1, info: 2, http: 3, verbose: 4, debug: 5, konyol: 6};
Anda memulai dengan membuat logger menggunakan winston.createLogger
:
const logger = winston.createLogger({ transport: [ new winston.transports.Console(), new winston.transports.File({ nama file: 'combined.log' }) ]});
Seorang logger menerima parameter berikut:
Nama | Bawaan | Keterangan |
---|---|---|
level | 'info' | Catat hanya jika info.level kurang dari atau sama dengan level ini |
levels | winston.config.npm.levels | Tingkat (dan warna) mewakili prioritas log |
format | winston.format.json | Memformat pesan info (lihat: Format) |
transports | [] (Tidak ada transportasi) | Kumpulan target pencatatan untuk pesan info |
exitOnError | true | Jika salah, pengecualian yang ditangani tidak akan menyebabkan process.exit |
silent | false | Jika benar, semua log akan disembunyikan |
Level yang diberikan ke createLogger
akan ditentukan sebagai metode kenyamanan pada logger
yang dikembalikan.
//// Logging//logger.log({ level: 'info', pesan: 'Halo file log yang didistribusikan!'});logger.info('Halo lagi log yang didistribusikan');
Anda dapat menambah atau menghapus transportasi dari logger
setelah diberikan kepada Anda dari winston.createLogger
:
const files = new winston.transports.File({ nama file: 'combined.log' });const console = new winston.transports.Console();logger .clear() // Hapus semua transport .add(console) // Tambahkan transport konsol .add(files) // Tambahkan file transport .remove(console); // Hapus transportasi konsol
Anda juga dapat mengkonfigurasi ulang instance winston.Logger
secara grosir menggunakan metode configure
:
const logger = winston.createLogger({ level: 'info', transport: [ new winston.transports.Console(), new winston.transports.File({ nama file: 'combined.log' }) ]});/// / Mengganti transportasi sebelumnya dengan yang ada di // konfigurasi baru grosir.//const DailyRotateFile = require('winston-daily-rotate-file');logger.configure({ level: 'verbose', mengangkut: [ new DailyRotateFile(opts) ]});
Anda dapat membuat logger turunan dari logger yang ada untuk meneruskan penggantian metadata:
const logger = winston.createLogger({ transportasi: [ winston.transports.Console() baru, ]});const childLogger = logger.child({ requestId: '451' });
.child
kemungkinan besar akan disadap jika Anda juga memperluas kelasLogger
, karena beberapa detail implementasi yang membuat kata kuncithis
mengarah ke hal-hal yang tidak terduga. Gunakan dengan hati-hati.
objectMode
, dan objek info
Di winston
, instance Logger
dan Transport
diperlakukan sebagai aliran objectMode
yang menerima objek info
.
Parameter info
yang disediakan untuk format tertentu mewakili satu pesan log. Objek itu sendiri bisa berubah. Setiap info
setidaknya harus memiliki properti level
dan message
:
const info = { level: 'info', // Level pesan logging pesan: 'Hei! Catat sesuatu?' // Pesan deskriptif sedang dicatat.};
Properti selain level dan pesan dianggap sebagai " meta
". yaitu:
const { level, pesan, ...meta } = info;
Beberapa format di logform
itu sendiri menambahkan properti tambahan:
Milik | Format ditambahkan oleh | Keterangan |
---|---|---|
splat | splat() | Percikan interpolasi string untuk pesan bergaya %d %s . |
timestamp | timestamp() | stempel waktu pesan diterima. |
label | label() | Label khusus yang dikaitkan dengan setiap pesan. |
ms | ms() | Jumlah milidetik sejak pesan log sebelumnya. |
Sebagai konsumen, Anda dapat menambahkan properti apa pun yang Anda inginkan – keadaan internal dikelola oleh properti Symbol
:
Symbol.for('level')
(READ-ONLY) : sama dengan properti level
. Diperlakukan sebagai tidak dapat diubah oleh semua kode.
Symbol.for('message'):
pesan string lengkap yang disetel berdasarkan "format penyelesaian":
json
logstash
printf
prettyPrint
simple
Symbol.for('splat')
: argumen interpolasi string tambahan. Digunakan secara eksklusif dengan format splat()
.
Simbol-simbol ini disimpan dalam paket lain: triple-beam
sehingga semua konsumen logform
dapat memiliki referensi Simbol yang sama. yaitu:
const { LEVEL, PESAN, SPLAT } = memerlukan('triple-beam');console.log(LEVEL === Simbol.untuk('level'));// trueconsole.log(PESAN === Simbol.untuk( 'pesan'));// trueconsole.log(SPLAT === Simbol.untuk('splat'));// benar
CATATAN: properti
{ message }
apa pun dalam objekmeta
yang disediakan akan secara otomatis digabungkan kemsg
apa pun yang sudah disediakan: Misalnya di bawah ini akan menggabungkan 'dunia' menjadi 'halo':logger.log('kesalahan', 'halo', { pesan: 'dunia' });logger.info('halo', { pesan: 'dunia' });
Format dalam winston
dapat diakses dari winston.format
. Mereka diimplementasikan dalam logform
, modul terpisah dari winston
. Hal ini memungkinkan fleksibilitas saat menulis transport Anda sendiri jika Anda ingin menyertakan format default dengan transport Anda.
Dalam versi modern dari templat node
, string sangat berperforma tinggi dan merupakan cara yang direkomendasikan untuk melakukan sebagian besar pemformatan pengguna akhir. Jika Anda ingin memformat log Anda sesuai pesanan, winston.format.printf
cocok untuk Anda:
const { createLogger, format, transports } = require('winston');const { gabungkan, stempel waktu, label, printf } = format;const myFormat = printf(({ level, pesan, label, stempel waktu }) => { return ` ${timestamp} [${label}] ${level}: ${message}`;});const logger = createLogger({ format: menggabungkan( label({ label: 'kanan meong!' }), stempel waktu(), myFormat ), transportasi: [transports baru.Console()]});
Untuk melihat format bawaan apa yang tersedia dan mempelajari lebih lanjut cara membuat format logging kustom Anda sendiri, lihat logform
.
Sejumlah format apa pun dapat digabungkan menjadi satu format menggunakan format.combine
. Karena format.combine
tidak memerlukan opts
, demi kenyamanan ia mengembalikan contoh format gabungan yang telah dibuat sebelumnya.
const { createLogger, format, transports } = require('winston');const { gabungkan, stempel waktu, label, PrettyPrint } = format;const logger = createLogger({ format: gabungkan( label({ label: 'benar meong!' } ), stempel waktu(), PrettyPrint() ), mengangkut: [new transports.Console()]})logger.log({ level: 'info', pesan: 'Jam berapa pengujiannya at?'});// Outputs:// { level: 'info',// pesan: 'Ujiannya jam berapa?',// label: 'right meow!',// stempel waktu: '2017- 09-30T03:57:26.875Z' }
Metode log
menyediakan interpolasi string menggunakan util.format. Itu harus diaktifkan menggunakan format.splat()
.
Di bawah ini adalah contoh yang mendefinisikan format dengan interpolasi string pesan menggunakan format.splat
dan kemudian membuat serial seluruh pesan info
menggunakan format.simple
.
const { createLogger, format, transports } = require('winston');const logger = createLogger({ format: format.combine( format.splat(), format.simple() ), transports: [new transports.Console() ]});// info: pesan uji string saya {}logger.log('info', 'pesan uji %s', 'string saya');// info: pesan uji 123 {}logger.log('info', 'pesan pengujian %d', 123);// info: pesan pengujian pertama detik {angka: 123}logger.log('info', 'pesan pengujian %s, %s' , 'pertama', 'kedua', { angka: 123 });
info
Objek Jika Anda ingin memfilter Objek info
yang diberikan sepenuhnya saat masuk, cukup kembalikan nilai palsu.
const { createLogger, format, transports } = require('winston');// Abaikan pesan log jika ada { private: true }const abaikanPrivate = format((info, opts) => { if (info.private) { return false; } kembalikan info;});const logger = createLogger({ format: format.combine( abaikanPrivate(), format.json() ), mengangkut: [baru transports.Console()]});// Keluaran: {"level":"error","message":"Kesalahan publik untuk dibagikan"}logger.log({ level: 'error', message: 'Kesalahan publik untuk dibagikan) share'});// Pesan dengan { private: true } tidak akan ditulis ketika login.logger.log({ private: true, level: 'error', message: 'Ini sangat rahasia - sembunyikan.'}) ;
Penggunaan format.combine
akan menghormati pengembalian nilai palsu apa pun dan menghentikan evaluasi format selanjutnya dalam rangkaian. Misalnya:
const { format } = require('winston');const { gabungkan, stempel waktu, label } = format;const willNeverThrow = format.combine( format(info => { return false })(), // Abaikan semua format(info => { melempar Kesalahan baru('Tidak pernah tercapai') })());
Format adalah objek prototipe (contoh kelas) yang mendefinisikan metode tunggal: transform(info, opts)
dan mengembalikan info
yang bermutasi :
info
: objek yang mewakili pesan log.
opts
: pengaturan khusus untuk contoh format saat ini.
Mereka diharapkan mengembalikan salah satu dari dua hal:
Objek info
yang mewakili argumen info
yang dimodifikasi. Referensi objek tidak perlu disimpan jika kekekalan lebih disukai. Semua format bawaan saat ini menganggap info
bisa berubah, tetapi [immutablejs] sedang dipertimbangkan untuk rilis mendatang.
Nilai falsey yang menunjukkan bahwa argumen info
harus diabaikan oleh pemanggil. (Lihat: Memfilter info
Objek) di bawah.
winston.format
dirancang sesederhana mungkin. Untuk menentukan format baru, cukup berikan fungsi transform(info, opts)
untuk mendapatkan Format
baru.
Format
bernama yang dikembalikan dapat digunakan untuk membuat salinan Format
tertentu sebanyak yang diinginkan:
const { format } = require('winston');const volume = format((info, opts) => { if (opts.yell) { info.message = info.message.toUpperCase(); } else if (opts. berbisik) { info.message = info.message.toLowerCase(); } return info;});// `volume` sekarang menjadi fungsi yang mengembalikan instance format.const scream = volume({ shout: true });console.dir(scream.transform({ level: 'info', message: `maaf sudah membuatmu BERTERIAK!`}, scream.options)); // {// level: 'info'// pesan: 'MAAF SUDAH MEMBUAT ANDA BERTERIAK DI KEPALA!'// }// `volume` dapat digunakan berkali-kali untuk membuat format berbeda.const pembisik = volume({ bisikan : true });console.dir(whisper.transform({ level: 'info', pesan: `KENAPA MEREKA MEMBUAT KITA TERIAK BEGITU!`}, Whisper.options));// {// level: 'info' // pesan: 'kenapa mereka membuat kami berteriak-teriak!'// }
Tingkat logging di winston
sesuai dengan urutan tingkat keparahan yang ditentukan oleh RFC5424: tingkat keparahan semua tingkat diasumsikan naik secara numerik dari yang paling penting hingga yang paling tidak penting.
Setiap level
diberi prioritas bilangan bulat tertentu. Semakin tinggi prioritasnya, semakin penting pesan tersebut dianggap, dan semakin rendah prioritas bilangan bulatnya. Misalnya, seperti yang ditentukan dalam RFC5424, level syslog
diprioritaskan dari 0 hingga 7 (tertinggi ke terendah).
{ muncul: 0, peringatan: 1, kritikan: 2, kesalahan: 3, peringatan: 4, pemberitahuan: 5, info: 6, debug: 7}
Demikian pula, tingkat logging npm
diprioritaskan dari 0 hingga 6 (tertinggi ke terendah):
{ kesalahan: 0, peringatan: 1, info: 2, http: 3, verbose: 4, debug: 5, konyol: 6}
Jika Anda tidak secara eksplisit menentukan level yang harus digunakan winston
, level npm
di atas akan digunakan.
Menyetel tingkat pesan logging Anda dapat dilakukan dengan salah satu dari dua cara. Anda dapat meneruskan string yang mewakili tingkat logging ke metode log() atau menggunakan metode tingkat yang ditentukan yang ditentukan pada setiap winston Logger.
//// Semua instance logger//logger.log('konyol', "127.0.0.1 - tidak ada tempat seperti rumah");logger.log('debug', "127.0.0.1 - tidak ada tempat seperti rumah") ;logger.log('verbose', "127.0.0.1 - tidak ada tempat seperti rumah");logger.log('info', "127.0.0.1 - tidak ada tempat seperti rumah");logger.log('warn', "127.0.0.1 - tidak ada tempat seperti rumah");logger.log('error', "127.0.0.1 - tidak ada tempat seperti rumah"); logger.info("127.0.0.1 - tidak ada tempat seperti rumah");logger.warn("127.0.0.1 - tidak ada tempat seperti home");logger.error("127.0.0.1 - tidak ada tempat seperti rumah");//// Default logger//winston.log('info', "127.0.0.1 - tidak ada tempat seperti rumah"); winston.info("127.0.0.1 - tidak ada tempat seperti rumah");
winston
memungkinkan Anda menentukan properti level
pada setiap transportasi yang menentukan tingkat maksimum pesan yang harus dicatat oleh transportasi. Misalnya, dengan menggunakan level syslog
Anda hanya dapat mencatat pesan error
ke konsol dan semua info
dan di bawahnya ke file (yang mencakup pesan error
):
const logger = winston.createLogger({ level: winston.config.syslog.levels, transport: [ winston.transports.Console baru({ level: 'error' }), winston.transports.File baru({ nama file: 'gabungan. log', tingkat: 'info' }) ]});
Anda juga dapat mengubah tingkat log transportasi secara dinamis:
const transports = { konsol: new winston.transports.Console({ level: 'warn' }), file: new winston.transports.File({ nama file: 'combined.log', level: 'error' })};const logger = winston.createLogger({ transports: [ transports.console, transports.file ]});logger.info('Tidak akan login juga transport!');transports.console.level = 'info';transports.file.level = 'info';logger.info('Akan login di kedua transport!');
winston
mendukung level logging yang dapat disesuaikan, defaultnya adalah level logging gaya npm. Level harus ditentukan pada saat membuat logger Anda.
Selain level npm
, syslog
, dan cli
yang telah ditentukan sebelumnya yang tersedia di winston
, Anda juga dapat memilih untuk menentukan level Anda sendiri:
const myCustomLevels = { level: { foo: 0, bar: 1, baz: 2, foobar: 3 }, warna: { foo: 'biru', bar: 'hijau', baz: 'kuning', foobar: 'merah' }};const customLevelLogger = winston.createLogger({ level: myCustomLevels.levels});customLevelLogger.foobar('some pesan tingkat foobar');
Meskipun ada sedikit pengulangan dalam struktur data ini, ini memungkinkan enkapsulasi sederhana jika Anda tidak ingin memiliki warna. Jika Anda ingin memiliki warna, selain meneruskan level ke Logger itu sendiri, Anda harus membuat winston menyadarinya:
winston.addColors(myCustomLevels.colors);
Hal ini memungkinkan logger yang menggunakan colorize
formatter untuk mewarnai dan memberi gaya pada output level kustom dengan tepat.
Selain itu, Anda juga dapat mengubah warna latar belakang dan gaya font. Misalnya,
baz: 'kuning miring', foobar: 'cyanBG merah tebal'
Opsi yang memungkinkan ada di bawah.
Gaya font: bold
, dim
, italic
, underline
, inverse
, hidden
, strikethrough
.
Warna latar depan font: black
, red
, green
, yellow
, blue
, magenta
, cyan
, white
, gray
, grey
.
Warna latar belakang: blackBG
, redBG
, greenBG
, yellowBG
, blueBG
magentaBG
, cyanBG
, whiteBG
Untuk mewarnai tingkat logging standar, tambahkan
winston.format.combine( winston.format.colorize(), winston.format.simple());
di mana winston.format.simple()
adalah formatter lain yang ingin Anda gunakan. Pemformat colorize
harus ada sebelum pemformat mana pun yang menambahkan teks yang ingin Anda warnai.
Untuk mewarnai baris log lengkap dengan formatter json Anda dapat menerapkan yang berikut ini
winston.format.combine( winston.format.json(), winston.format.colorize({ semua: benar }));
Ada beberapa transport inti yang disertakan dalam winston
, yang memanfaatkan jaringan bawaan dan I/O file yang ditawarkan oleh inti Node.js. Selain itu, ada tambahan angkutan yang ditulis oleh anggota masyarakat.
Dimungkinkan untuk menggunakan beberapa transportasi dari jenis yang sama misalnya winston.transports.File
ketika Anda membuat transportasi.
const logger = winston.createLogger({ transportasi: [ winston.transports.File baru({ nama file: 'combined.log', level: 'info' }), winston.transports.File baru({ nama file: 'errors.log' , tingkat: 'kesalahan' }) ]});
Jika nanti Anda ingin menghapus salah satu transportasi ini, Anda dapat melakukannya dengan menggunakan transportasi itu sendiri. misalnya:
const gabunganLogs = logger.transports.find(transport => { return transport.filename === 'combined.log'});logger.remove(combinedLogs);
Menambahkan transportasi khusus itu mudah. Yang perlu Anda lakukan hanyalah menerima opsi apa pun yang Anda perlukan, menerapkan metode log(), dan menggunakannya dengan winston
.
const Transport = require('winston-transport');const util = require('util');//// Mewarisi dari `winston-transport` sehingga Anda dapat memanfaatkan// fungsionalitas dasar dan `.Exceptions.handle ()`.//module.exports = kelas YourCustomTransport extends Transport { konstruktor(opts) { super(opts); // // Gunakan opsi khusus apa pun di sini. misalnya: // - Informasi koneksi untuk database // - Informasi otentikasi untuk API (misalnya loggly, papertrail, // logentries, dll.). // } log(info, panggilan balik) { setImmediate(() => { this.emit('logged', info); }); // Melakukan penulisan ke layanan jarak jauh callback(); }};
Karena setiap transportasi mewarisi dari winston-transport, format khusus dan tingkat log khusus dapat ditetapkan pada setiap transportasi secara terpisah:
const logger = winston.createLogger({ transportasi: [ winston.transports.File baru({ nama file: 'error.log', level: 'error', format: winston.format.json() }), winston.transports baru. Http({ level: 'peringatkan', format: winston.format.json() }), winston.transports.Console baru({ level: 'info', format: winston.format.combine( winston.format.colorize(), winston.format.simple() ) }) ]});
Dengan winston
, dimungkinkan untuk menangkap dan mencatat peristiwa uncaughtException
dari proses Anda. Dengan instance logger Anda sendiri, Anda dapat mengaktifkan perilaku ini saat dibuat atau nanti dalam siklus hidup aplikasi Anda:
const { createLogger, transports } = require('winston');// Aktifkan penanganan pengecualian saat Anda membuat logger.const logger = createLogger({ transports: [ new transports.File({ nama file: 'combined.log' }) ] , pengecualianHandlers: [ new transports.File({ nama file: 'Exceptions.log' }) ]});// Atau aktifkan nanti dengan menambahkan transport atau menggunakan `.Exceptions.handle`const logger = createLogger({ transports: [ new transports.File({ nama file: 'combined.log' }) ]});// Panggil Exceptions.handle dengan transport untuk menangani Exceptionslogger.Exceptions.handle ( transports.File baru({ nama file: 'pengecualian.log' }));
Jika Anda ingin menggunakan fitur ini dengan logger default, cukup panggil .exceptions.handle()
dengan instance transport.
//// Anda dapat menambahkan logger pengecualian terpisah dengan meneruskannya ke `.Exceptions.handle`//winston.Exceptions.handle( new winston.transports.File({ nama file: 'path/to/Exceptions.log' }) );//// Alternatifnya, Anda dapat menyetel `handleExceptions` ke true saat menambahkan transports// ke winston.//winston.add(new winston.transports.File({ nama file: 'path/to/combined.log', handleExceptions: true}));
Secara default, winston akan keluar setelah mencatat uncaughtException. Jika ini bukan perilaku yang Anda inginkan, setel exitOnError = false
const logger = winston.createLogger({ exitOnError: false });//// atau, seperti ini://logger.exitOnError = false;
Saat bekerja dengan instance logger khusus, Anda dapat meneruskan transport terpisah ke properti exceptionHandlers
atau mengatur handleExceptions
pada transportasi apa pun.
const logger = winston.createLogger({ transportasi: [ winston.transports.File baru({ nama file: 'path/to/combined.log' }) ], pengecualianHandlers: [ winston.transports.File baru({ nama file: 'path/ ke/pengecualian.log' }) ]});
const logger = winston.createLogger({ transportasi: [ winston.transports.Console baru({ handleExceptions: true }) ], exitOnError: false});
Opsi exitOnError
juga dapat berfungsi untuk mencegah keluar hanya pada jenis kesalahan tertentu:
function abaikanEpipe(err) { return err.code !== 'EPIPE';}const logger = winston.createLogger({ exitOnError: abaikanEpipe });//// atau, seperti ini://logger.exitOnError = abaikanEpipe;
Dengan winston
, dimungkinkan untuk menangkap dan mencatat kejadian unhandledRejection
dari proses Anda. Dengan instance logger Anda sendiri, Anda dapat mengaktifkan perilaku ini saat dibuat atau nanti dalam siklus hidup aplikasi Anda:
const { createLogger, transports } = require('winston');// Aktifkan penanganan penolakan saat Anda membuat logger.const logger = createLogger({ transports: [ new transports.File({ nama file: 'combined.log' }) ] , rejectHandlers: [ new transports.File({ filename: 'rejections.log' }) ]});// Atau aktifkan nanti dengan menambahkan transport atau menggunakan `.rejections.handle`const logger = createLogger({ transports: [ new transports.File({ nama file: 'combined.log' }) ]});// Panggil rejects.handle dengan transport untuk menangani rejectslogger.rejections.handle ( transports.File baru({ nama file: 'rejections.log' }));
Jika Anda ingin menggunakan fitur ini dengan logger default, cukup panggil .rejections.handle()
dengan instance transport.
//// Anda dapat menambahkan pencatat penolakan terpisah dengan meneruskannya ke `.rejections.handle`//winston.rejections.handle( new winston.transports.File({ nama file: 'path/to/rejections.log' }) );//// Alternatifnya, Anda dapat menyetel `handleRejections` ke true saat menambahkan transports// ke winston.//winston.add(new winston.transports.File({ nama file: 'path/to/combined.log', handleRejections: true}));
Selain mencatat pesan dan metadata, winston
juga memiliki mekanisme pembuatan profil sederhana yang diterapkan untuk semua logger:
//// Mulai profil 'test'//logger.profile('test');setTimeout(function () { // // Hentikan profil 'test'. Logging sekarang akan dilakukan: // '17 Jan 21 :00:00 - info: durasi pengujian=1000 md' // logger.profile('test');}, 1000);
Anda juga dapat memulai pengatur waktu dan menyimpan referensi yang dapat Anda panggil .done()
aktif:
// Mengembalikan objek yang sesuai dengan waktu tertentu. Ketika selesai // dipanggil, pengatur waktu akan selesai dan mencatat durasinya. misalnya: // const profiler = logger.startTimer(); setTimeout(function () { profiler.done({ pesan: 'Mencatat pesan' }); }, 1000);
Semua pesan profil diatur ke tingkat 'info' secara default, dan pesan serta metadata bersifat opsional. Untuk pesan profil individual, Anda dapat mengganti level log default dengan menyediakan properti level
ke objek metadata:
logger.profile('test', { level: 'debug' });
winston
mendukung kueri log dengan opsi seperti Loggly. Lihat API Penelusuran Loggly. Khususnya: File
, Couchdb
, Redis
, Loggly
, Nssocket
, dan Http
.
opsi const = { dari: Tanggal baru() - (24 * 60 * 60 * 1000), hingga: Tanggal baru(), batas: 10, mulai: 0, pesanan: 'desc', bidang: ['pesan']} ;//// Temukan item yang dicatat antara hari ini dan kemarin.//logger.query(options, function (err, results) { if (err) { /* TODO: handle me */ throw err; } console.log(hasil);});
Streaming memungkinkan Anda melakukan streaming kembali log dari transportasi pilihan Anda.
//// Mulai dari akhir.//winston.stream({ mulai: -1 }).on('log', function(log) { console.log(log);});
Logger default dapat diakses melalui modul winston
secara langsung. Metode apa pun yang dapat Anda panggil pada instance logger tersedia di logger default:
const winston = require('winston');winston.log('info', 'Halo file log yang didistribusikan!');winston.info('Halo lagi log yang didistribusikan');winston.level = 'debug';winston.log ('debug', 'Sekarang pesan debug saya ditulis ke konsol!');
Secara default, tidak ada transport yang disetel pada logger default. Anda harus menambah atau menghapus transportasi melalui metode add()
dan remove()
:
const files = new winston.transports.File({ nama file: 'combined.log' });const console = new winston.transports.Console();winston.add(console);winston.add(files);winston.remove (menghibur);
Atau lakukan dengan satu panggilan ke konfigurasi():
winston.configure({ transportasi: [ winston.transports.File baru({ nama file: 'somefile.log' }) ]});
Untuk dokumentasi lebih lanjut tentang bekerja dengan masing-masing transportasi yang didukung oleh winston
lihat dokumen winston
Transports.
winston
Seringkali berguna untuk menunggu log Anda ditulis sebelum keluar dari proses. Setiap instance dari winston.Logger
juga merupakan [aliran Node.js]. Peristiwa finish
akan dimunculkan ketika semua log telah dipindahkan ke semua transportasi setelah aliran diakhiri.
const transport = new winston.transports.Console();const logger = winston.createLogger({ transports: [transport]});logger.on('finish', function (info) { // Semua pesan log `info` memiliki sekarang sudah login});logger.info('CHILL WINSTON!', { serius: benar });logger.end();
Perlu juga disebutkan bahwa logger juga mengeluarkan peristiwa 'kesalahan' jika terjadi kesalahan di dalam logger itu sendiri yang harus Anda tangani atau sembunyikan jika Anda tidak ingin pengecualian tidak tertangani:
//// Menangani error yang berasal dari logger itu sendiri//logger.on('error', function (err) { /* Do Something */ });
Seringkali dalam aplikasi yang lebih besar dan lebih kompleks, diperlukan beberapa instance logger dengan pengaturan berbeda. Setiap logger bertanggung jawab atas area fitur (atau kategori) yang berbeda. Hal ini diekspos di winston
dalam dua cara: melalui winston.loggers
dan instance dari winston.Container
. Faktanya, winston.loggers
hanyalah contoh winston.Container
yang telah ditentukan sebelumnya:
const winston = require('winston');const { format } = winston;const {gabungkan, label, json } = format;//// Konfigurasikan logger untuk `category1`//winston.loggers.add('category1' , { format: menggabungkan( label({ label: 'kategori satu' }), json() ), mengangkut: [ winston.transports.Console baru({ level: 'konyol' }), new winston.transports.File({ nama file: 'somefile.log' }) ]});//// Konfigurasikan logger untuk `category2`//winston.loggers.add('category2', { format: menggabungkan( label({ label: 'kategori dua' }), json() ), mengangkut: [ new winston.transports.Http({ host: 'localhost', pelabuhan:8080 }) ]});
Sekarang logger Anda sudah siap, Anda dapat meminta winston di file apa pun di aplikasi Anda dan mengakses logger yang sudah dikonfigurasikan sebelumnya:
const winston = require('winston');//// Ambil logger Anda yang telah dikonfigurasi sebelumnya//const kategori1 = winston.loggers.get('category1');const kategori2 = winston.loggers.get('category2');category1. info('masuk ke transportasi file dan konsol');category2.info('masuk ke transportasi http');
Jika Anda lebih suka mengelola Container
sendiri, Anda cukup membuat contoh:
const winston = memerlukan('winston');const { format } = winston;const { gabungkan, label, json } = format;const container = new winston.Container();container.add('category1', { format: gabungkan ( label({ label: 'kategori satu' }), json() ), mengangkut: [ new winston.transports.Console({ level: 'konyol' }), baru winston.transports.File({ nama file: 'somefile.log' }) ]});const kategori1 = container.get('category1');category1.info('masuk ke transportasi file dan konsol');
Secara default, transport winston.transports.Console
mengirimkan pesan ke stdout
dan stderr
. Ini baik-baik saja di sebagian besar situasi; namun, ada beberapa kasus di mana hal ini tidak diinginkan, termasuk:
Melakukan debug menggunakan VSCode dan melampirkan, alih-alih meluncurkan, proses Node.js
Menulis pesan format JSON di AWS Lambda
Logging selama pengujian Jest dengan opsi --silent
Untuk membuat log transportasi menggunakan console.log()
, console.warn()
dan console.error()
sebagai gantinya, setel opsi forceConsole
ke true
:
const logger = winston.createLogger({ level: 'info', transport: [winston.transports.Console baru({ forceConsole: true })]});
npm instal winston
benang tambahkan winston
Semua tes winston ditulis dengan mocha
, nyc
, dan assume
. Mereka dapat dijalankan dengan npm
.
tes npm