Axiom membuka kemampuan observasi pada skala apa pun.
Untuk informasi lebih lanjut, lihat dokumentasi resmi.
Perpustakaan ini memungkinkan Anda untuk mengirim vital web serta log terstruktur dari aplikasi berikutnya.js Anda ke Axioma.
Menggunakan router halaman? Gunakan versi
0.*yang terus menerima tambalan keamanan. Inilah readme untuk0.x
npm install --save next-axiom untuk menginstal versi terbaru AXIOM.NEXT_PUBLIC_AXIOM_DATASET adalah nama dataset Axiom di mana Anda ingin mengirim data.NEXT_PUBLIC_AXIOM_TOKEN adalah token API Axiom yang telah Anda hasilkan.next.config.ts , bungkus konfigurasi selanjutnya.js Anda di withAxiom : const { withAxiom } = require ( 'next-axiom' ) ;
module . exports = withAxiom ( {
// Your existing configuration.
} ) ; Untuk menangkap permintaan lalu lintas, buat file middleware.ts di folder root aplikasi selanjutnya.js Anda:
import { Logger } from 'next-axiom'
import { NextResponse } from 'next/server'
import type { NextFetchEvent , NextRequest } from 'next/server'
export async function middleware ( request : NextRequest , event : NextFetchEvent ) {
const logger = new Logger ( { source : 'middleware' } ) ; // traffic, request
logger . middleware ( request )
event . waitUntil ( logger . flush ( ) )
return NextResponse . next ( )
// For more information, see Matching Paths below
export const config = {
} logger.middleware menerima objek konfigurasi sebagai argumen kedua. Objek ini dapat berisi properti berikut:
logRequestDetails : menerima boolean atau serangkaian kunci. Jika Anda lulus true , itu akan menambahkan semua detail permintaan ke log (metode, url, header, dll.). Jika Anda melewati serangkaian string, itu hanya akan menambahkan kunci yang ditentukan. Lihat Permintaan dan NexTrequest untuk dokumentasi pada tombol yang tersedia. Jika logRequestDetails diaktifkan, fungsi akan mengembalikan janji yang perlu ditunggu. export async function middleware ( request : NextRequest , event : NextFetchEvent ) {
const logger = new Logger ( { source : "middleware" } ) ;
await logger . middleware ( request , { logRequestDetails : [ "body" , "nextUrl" ] } ) ;
event . waitUntil ( logger . flush ( ) ) ;
return NextResponse . next ( ) ;
} Untuk mengirim vital web ke Axioma, tambahkan komponen AxiomWebVitals dari AXIOM NEXTAN ke file app/layout.tsx :
import { AxiomWebVitals } from 'next-axiom' ;
export default function RootLayout ( ) {
return (
< html >
...
< AxiomWebVitals / >
< div > ... < / div >
< / html >
) ;
}Vital web hanya dikirim dari penyebaran produksi.
Kirim log ke aksioma dari berbagai bagian aplikasi Anda. Setiap panggilan fungsi log mengambil pesan dan objek fields opsional.
log . debug ( 'Login attempt' , { user : 'j_doe' , status : 'success' } ) ; // Results in {"message": "Login attempt", "fields": {"user": "j_doe", "status": "success"}}
log . info ( 'Payment completed' , { userID : '123' , amount : '25USD' } ) ;
log . warn ( 'API rate limit exceeded' , { endpoint : '/users/1' , rateLimitRemaining : 0 } ) ;
log . error ( 'System Error' , { code : '500' , message : 'Internal server error' } ) ; Bungkus penangan rute Anda di withAxiom untuk menambahkan logger ke permintaan Anda dan pengecualian log secara otomatis:
import { withAxiom , AxiomRequest } from 'next-axiom' ;
export const GET = withAxiom ( ( req : AxiomRequest ) => {
req . log . info ( 'Login function called' ) ;
// You can create intermediate loggers
const log = req . log . with ( { scope : 'user' } ) ;
log . info ( 'User logged in' , { userId : 42 } ) ;
return NextResponse . json ( { hello : 'world' } ) ;
} ) ;Penangan rute menerima objek konfigurasi sebagai argumen kedua. Objek ini dapat berisi properti berikut:
logRequestDetails : menerima boolean atau serangkaian kunci. Jika Anda lulus true , itu akan menambahkan semua detail permintaan ke log (metode, url, header, dll.). Jika Anda melewati serangkaian string, itu hanya akan menambahkan kunci yang ditentukan. Lihat Permintaan dan NexTrequest untuk dokumentasi pada tombol yang tersedia.
NotFoundLogLevel : angkanya level log untuk kesalahan not_found. Default untuk warn .
RedirectLogLevel : angkanya level log untuk kesalahan next_redirect. Default ke info .
Contoh konfigurasi:
export const GET = withAxiom (
async ( ) => {
return new Response ( "Hello World!" ) ;
} ,
{
logRequestDetails : [ 'body' , 'nextUrl' ] , // { logRequestDetails: true } is also valid
NotFoundLogLevel : 'error' ,
RedirectLogLevel : 'debug' ,
}
) ; Untuk mengirim log dari komponen klien, tambahkan useLogger dari axiom berikutnya ke komponen Anda:
'use client' ;
import { useLogger } from 'next-axiom' ;
export default function ClientComponent ( ) {
const log = useLogger ( ) ;
log . debug ( 'User logged in' , { userId : 42 } ) ;
return < h1 > Logged in < / h1 > ;
} Untuk mengirim log dari komponen server, tambahkan Logger dari axiom berikutnya ke komponen Anda, dan hubungi flush sebelum kembali:
import { Logger } from 'next-axiom' ;
export default async function ServerComponent ( ) {
const log = new Logger ( ) ;
log . info ( 'User logged in' , { userId : 42 } ) ;
// ...
await log . flush ( ) ;
return < h1 > Logged in < / h1 > ;
}Level log mendefinisikan tingkat log terendah yang dikirim ke aksioma. Pilih salah satu level berikut (dari terendah ke tertinggi):
debug adalah pengaturan default. Ini berarti Anda mengirim semua log ke aksioma.infowarnerror berarti Anda hanya mengirim log tingkat tertinggi ke aksioma.off berarti Anda tidak mengirim log ke aksioma.Misalnya, untuk mengirim semua log kecuali untuk log debug ke aksioma:
export NEXT_PUBLIC_AXIOM_LOG_LEVEL=infoUntuk menangkap kesalahan perutean, gunakan mekanisme penanganan kesalahan Next.js:
app .error.tsx .useLogger dari AXIOM berikutnya untuk mengirim kesalahan ke aksioma. Misalnya: "use client" ;
import { useLogger , LogLevel } from "next-axiom" ;
import { usePathname } from "next/navigation" ;
export default function ErrorPage ( {
error ,
} : {
error : Error & { digest ?: string } ;
} ) {
const pathname = usePathname ( )
const log = useLogger ( { source : "error.tsx" } ) ;
let status = error . message == 'Invalid URL' ? 404 : 500 ;
log . logHttpRequest (
LogLevel . error ,
error . message ,
{
host : window . location . href ,
path : pathname ,
statusCode : status ,
} ,
{
error : error . name ,
cause : error . cause ,
stack : error . stack ,
digest : error . digest ,
} ,
) ;
return (
< div className = "p-8" >
Ops ! An Error has occurred : { " " }
< p className = "text-red-400 px-8 py-2 text-lg" > `{error.message}` < / p>
< div className = "w-1/3 mt-8" >
< NavTable / >
< / div >
< / div >
) ;
} AXIOM Berikutnya beralih untuk mendukung router aplikasi yang dimulai dengan versi 1.0. Jika Anda memutakhirkan aplikasi router halaman dengan AXIOM V0.X berikutnya ke router aplikasi, Anda perlu membuat perubahan berikut:
NEXT_PUBLIC_ , misalnya: NEXT_PUBLIC_AXIOM_TOKENuseLogger di komponen klien alih -alih prop logLogger dan menyiram log sebelum komponen kembali.reportWebVitals() dan sebaliknya tambahkan komponen AxiomWebVitals ke tata letak Anda. Integrasi Axiom Vercel mengatur variabel lingkungan yang disebut NEXT_PUBLIC_AXIOM_INGEST_ENDPOINT , yang secara default hanya diaktifkan untuk lingkungan produksi. Untuk mengirim log dari penyebaran pratinjau, buka pengaturan situs Anda di Vercel dan aktifkan penyebaran pratinjau untuk variabel lingkungan tersebut.
Anda dapat menggunakan log.with untuk membuat logger menengah, misalnya:
const logger = userLogger ( ) . with ( { userId : 42 } ) ;
logger . info ( 'Hi' ) ; // will ingest { ..., "message": "Hi", "fields" { "userId": 42 }} Didistribusikan di bawah lisensi MIT.