Fastify
Logging
Logging'i etkinleştir
Logging varsayılan olarak devre dışıdır ve bir Fastify örneği oluşturduğunuzda { logger: true }
veya { logger: { level: 'info' } }
geçerek etkinleştirebilirsiniz. Logger devre dışı ise, çalışma zamanında etkinleştirmek mümkün değildir. Bu amaç için abstract-logging kullanıyoruz.
Fastify performansa odaklandığı için, varsayılan log seviyesi etkinleştirildiğinde 'info'
olarak ayarlanmış pino logger'ını kullanır.
Üretim JSON logger'ını etkinleştirme:
const fastify = require('fastify')({
logger: true
})
Yerel geliştirme, üretim ve test ortamı için uygun yapılandırma ile logger'ı etkinleştirmek biraz daha fazla yapılandırma gerektirir:
const envToLogger = {
development: {
transport: {
target: 'pino-pretty',
options: {
translateTime: 'HH:MM:ss Z',
ignore: 'pid,hostname',
},
},
},
production: true,
test: false,
}
const fastify = require('fastify')({
logger: envToLogger[environment] ?? true // haritada eşleşen giriş yoksa varsayılan olarak true olur
})
⚠️
pino-pretty
bir geliştirme bağımlılığı olarak yüklenmelidir, varsayılan olarak performans nedenleriyle dahil edilmez.
Kullanım
Logger'ı rota işlemlerinizde şöyle kullanabilirsiniz:
fastify.get('/', options, function (request, reply) {
request.log.info('Mevcut taleple ilgili bazı bilgiler')
reply.send({ hello: 'world' })
})
Rota işlemcileri dışında yeni loglar tetiklemek için Fastify örneğinden Pino örneğini kullanabilirsiniz:
fastify.log.info('Önemli bir şey oldu!');
☑️ Logger'a bazı seçenekler vermek isterseniz, bunları Fastify'a iletin. Tüm mevcut seçenekleri Pino belgeleri içinde bulabilirsiniz. Bir dosya hedefi belirtmek isterseniz:
const fastify = require('fastify')({
logger: {
level: 'info',
file: '/path/to/file' // pino.destination() kullanacak
}
})
fastify.get('/', options, function (request, reply) {
request.log.info('Mevcut taleple ilgili bazı bilgiler')
reply.send({ hello: 'world' })
})
const split = require('split2')
const stream = split(JSON.parse)
const fastify = require('fastify')({
logger: {
level: 'info',
stream: stream
}
})
Varsayılan olarak, Fastify her talebe daha kolay izleme için bir ID ekler. Eğer requestIdHeader seçeneği ayarlanmışsa ve ilgili başlık mevcutsa, o zaman değeri kullanılır, aksi takdirde yeni bir artan ID üretilir. Özelleştirme seçenekleri için Fastify Fabrikası requestIdHeader
ve Fastify Fabrikası genReqId
inceleyin.
Varsayılan logger, req
, res
ve err
özelliklerine sahip nesneleri serileştiren bir standart serializer seti ile yapılandırılmıştır. req
tarafından alınan nesne Fastify Request
nesnesidir, res
tarafından alınan nesne ise Fastify Reply
nesnesidir. Bu davranış, özel serializer'lar belirterek özelleştirilebilir.
const fastify = require('fastify')({
logger: {
serializers: {
req (request) {
return { url: request.url }
}
}
}
})
Not: Bazı durumlarda,
res
serializer'ına geçirilenReply
nesnesi tamamen oluşturulamamış olabilir. Özel birres
serializer'ı yazarken,statusCode
dışındareply
üzerindeki herhangi bir özelliğin varlığını kontrol etmek gereklidir; bu özellik her zaman mevcuttur. Örneğin,getHeaders
'ın çağrılmadan önce varlığını kontrol etmek gereklidir:const fastify = require('fastify')({
logger: {
transport: {
target: 'pino-pretty'
},
serializers: {
res (reply) {
return {
statusCode: reply.statusCode,
headers: typeof reply.getHeaders === 'function'
? reply.getHeaders()
: {}
}
},
}
}
});
Not: Talep gövdesi, req
yönteminde serileştirilemez, çünkü talep, alt logger'ı oluşturduğumuzda serileştirilir. Bu zamanlarda gövde henüz ayrıştırılmamıştır.
Not: Serializer'ların asla hata fırlatmadığından emin olun; çünkü bir serializer'dan fırlatılan bir hata, Node işlemine son verebilir. Daha fazla bilgi için Pino belgeleri üzerinden serializer'lara bakın.
Pino dışında herhangi bir logger bu seçeneği göz ardı eder.
Kendi logger örneğinizi de sağlayabilirsiniz. Yapılandırma seçenekleri yerine, örneği loggerInstance
olarak geçin. Sağladığınız logger, Pino arayüzüne uymalıdır; yani aşağıdaki yöntemlere sahip olmalıdır: info
, error
, debug
, fatal
, warn
, trace
, silent
, child
ve bir level
string özelliği.
Örnek:
const log = require('pino')({ level: 'info' })
const fastify = require('fastify')({ loggerInstance: log })
log.info('talep bilgisi yok')
fastify.get('/', function (request, reply) {
request.log.info('talep bilgilerini içerir, ancak `log` ile aynı logger örneği')
reply.send({ hello: 'world' })
})
Log Redaksiyonu
Pino kaydedilen loglardaki belirli özelliklerin değerlerini gizlemek için düşük aşındırmalı log redaksiyonunu destekler. Örneğin, güvenlik kaygıları nedeniyle Authorization
başlığı dışında tüm HTTP başlıklarını loglamak isteyebiliriz:
const fastify = Fastify({
logger: {
stream: stream,
redact: ['req.headers.authorization'],
level: 'info',
serializers: {
req (request) {
return {
method: request.method,
url: request.url,
headers: request.headers,
host: request.host,
remoteAddress: request.ip,
remotePort: request.socket.remotePort
}
}
}
}
})
Daha fazla bilgi için https://getpino.io/#/docs/redaction adresine bakın.