LogTape, pustaka pengelogan berstruktur kebergantungan sifar untuk JavaScript dan TypeScript, telah mengeluarkan v0.6.0. Apa yang telah berubah?
Salah satu ciri LogTape ialah warisan sinki melalui kategori hierarki. Contohnya, jika anda menyediakan dua pembalak seperti ini:
import { configure, getConsoleSink, getFileSink } from "@logtape/logtape"; await configure({ sinks: { console: getConsoleSink(), file: getFileSink("app.log"), }, loggers: [ { category: ["app"], level: "debug", sinks: ["file"] }, { category: ["app", "module"], level: "debug", sinks: ["console"] }, ], });
Log yang ditulis pada logger ["app"] hanya akan disimpan pada fail app.log, tetapi log yang ditulis pada logger ["app", "module"] akan disimpan pada kedua-duanya fail app.log dan output ke konsol. Ini kerana logger ["app", "modul"] mewarisi sinki daripada kategori induknya ["app"].
Namun, kadangkala anda mungkin tidak mahu kelakuan ini. Bermula dari LogTape 0.6.0, anda kini boleh override sinki pembalak induk. Contohnya, jika anda mendayakan pilihan parentSinks: "override" untuk pencatat anak seperti ini:
await configure({ sinks: { /* omitted; same as above */ }, loggers: [ { category: ["app"], level: "debug", sinks: ["file"] }, { category: ["app", "module"], level: "debug", sinks: ["console"], parentSinks: "override" }, ], });
Log yang ditulis pada logger ["app"] hanya akan disimpan pada fail app.log dan log yang ditulis pada logger ["app", "module"] hanya akan dikeluarkan kepada konsol itu. Ini kerana pembalak kanak-kanak ["app", "modul"] telah mengatasi sinki pembalak ["app"].
Sudah tentu, nilai lalai ialah parentSinks: "warisan", jadi jika anda tidak menentukan pilihan, ia akan berfungsi seperti sebelumnya.
Jika anda ingin tahu tentang latar belakang penambahan ciri ini, sila rujuk isu GitHub #15.
Dalam versi sebelumnya, jika anda log seperti ini:
logger.info("Hello, { name }!", { name: "Alice" });
Bertentangan dengan jangkaan, log Hello, tidak ditentukan! akan diwujudkan. Ini kerana pemegang tempat { nama } termasuk aksara ruang, jadi ia mencari sifat " nama " dan bukannya "nama". Dalam erti kata lain, anda perlu sama ada mengalih keluar ruang daripada pemegang tempat seperti ini:
logger.info("Hello, {name}!", { name: "Alice" });
Atau tambahkan ruang yang sama pada nama harta sebenar seperti ini:
logger.info("Hello, { name }!", { " name ": "Alice" });
Walaupun ini bukan pepijat semata-mata, ia adalah tingkah laku yang terdedah kepada kesilapan bergantung pada tabiat pengekodan.
Namun, bermula dari LogTape 0.6.0, walaupun terdapat ruang pada permulaan dan akhir pemegang tempat, ia akan mencari nama hartanah tanpa ruang. Contohnya, jika anda log seperti ini:
logger.info("Hello, { name }!", { name: "Alice" });
Seperti yang dijangkakan, log Hello, Alice! akan dibuat.
Namun, jika terdapat sifat yang betul-betul sepadan termasuk watak ruang, itu akan diutamakan. Contohnya, jika anda log seperti ini:
logger.info("Hello, { name }!", { name: "Alice", " name ": "Bob" });
Helo, Bob! akan dilog dan bukannya Hello, Alice!.
Jika anda ingin tahu tentang latar belakang penambahan ciri ini, sila rujuk isu GitHub #16.
LogRecord ialah jenis data yang mewakili log sebelum ia dikeluarkan dan diformatkan oleh LogTape.
Walaupun sifat LogRecord.message sudah wujud, sifat ini mengandungi hasil selepas pemegang tempat dalam templat mesej telah digantikan dengan nilai harta sebenar. Ini adalah mencukupi dalam kebanyakan kes, tetapi apabila destinasi keluaran log (sink) ialah sistem pembalakan lain, anda mungkin mahu mengeluarkan templat mesej asal dan nilai sifat secara berasingan, membenarkan sistem pengelogan penerima menggantikan ruang letak dalam templat mesej dengan harta nilai secara langsung.
LogRecord.rawMessage yang ditambahkan dalam LogTape 0.6.0 ialah sifat untuk tujuan ini, yang mengandungi keadaan asal templat mesej dengan pemegang tempat tidak diganti. Contohnya, jika anda log seperti ini:
logger.info("Hello, {name}!", { name: "Alice" });
Walaupun LogRecord.message akan mengandungi nilai ["Hello, ", "Alice", "!"], LogRecord.rawMessage akan mengandungi nilai "Hello, {name}!".
Jika anda ingin tahu tentang latar belakang penambahan ciri ini, sila rujuk isu GitHub #17.
Pemformat teks ialah antara muka yang menentukan cara setiap log akan diformatkan menjadi teks dalam sinki strim, sinki fail, dsb. Takrif jenis sebenar agak mudah:
export type TextFormatter = (record: LogRecord) => string;
Walau bagaimanapun, ia boleh menyusahkan untuk menentukan pemformat teks secara langsung setiap kali, jadi LogTape mempunyai terbina dalam defaultTextFormatter dan ansiColorFormatter yang boleh anda gunakan. Sehingga kini, kerana tiada konfigurasi tambahan boleh dilakukan, anda terpaksa menerima format yang telah ditetapkan sebagaimana adanya. Sebagai contoh, jika anda tidak menyukai tahap log seperti "amaran" dikeluarkan sebagai singkatan tiga huruf seperti WRN, anda perlu melaksanakan TextFormatter dari awal.
Walau bagaimanapun, bermula daripada LogTape 0.6.0, anda boleh menyesuaikan pelbagai tetapan pemformatan mengikut keinginan anda melalui fungsi getDefaultTextFormatter() dan getAnsiColorFormatter() tanpa perlu melaksanakan TextFormatter dari awal.
For example, if you want to represent log levels like "warning" as a single uppercase letter W, you can configure it like this:
const myFormatter = getDefaultTextFormatter({ level: "L" });
Or if you want to omit the date and timezone from the timestamp and only show the time, you can configure it like this:
const myFormatter = getDefaultTextFormatter({ timestamp: "time" });
For descriptions of more formatting options, please refer to the related documentation.
If you're curious about the background of this feature addition, please refer to GitHub issue #13.
LogTape 0.6.0 is already available on JSR and npm, so get it now!
deno add @logtape/logtape@0.6.0 # Deno npm add @logtape/logtape@0.6.0 # npm pnpm add @logtape/logtape@0.6.0 # pnpm yarn add @logtape/logtape@0.6.0 # Yarn bun add @logtape/logtape@0.6.0 # Bun
Happy logging!
Atas ialah kandungan terperinci LogTape .eleased: Apa yang baharu?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!