DEV Community

Abdulkadir Erbas
Abdulkadir Erbas

Posted on • Updated on

Node.js'te Pino ile Performanslı Loglama: Nedir ve Nasıl Kullanılır?

Pino, Node.js için yüksek performanslı ve etkili bir loglama kütüphanesidir. Aşağıda, Pino'nun diğer benzer loglama kütüphaneleriyle yapılan karşılaştırmalı performans testlerinin sonuçlarını bulabilirsiniz.

Benchmarks

- pino.info('hello world'):

> BASIC benchmark averages
> 1. Bunyan average: 377.434ms
> 2. Winston average: 270.249ms
> 3. Bole average: 172.690ms
> 4. Debug average: 220.527ms
> 5. LogLevel average: 222.802ms
> 6. Pino average: 114.801ms
> 7. PinoMinLength average: 70.968ms
> 8. PinoNodeStream average: 159.192ms



- pino.info({'hello': 'world'}):

> OBJECT benchmark averages
> 1. BunyanObj average: 410.379ms
> 2. WinstonObj average: 273.120ms
> 3. BoleObj average: 185.069ms
> 4. LogLevelObject average: 433.425ms
> 5. PinoObj average: 119.315ms
> 6. PinoMinLengthObj average: 76.968ms
> 7. PinoNodeStreamObj average: 164.268ms



- pino.info(aBigDeeplyNestedObject):

> DEEP-OBJECT benchmark averages
> 1. BunyanDeepObj average: 1.839ms
> 2. WinstonDeepObj average: 5.604ms
> 3. BoleDeepObj average: 3.422ms
> 4. LogLevelDeepObj average: 11.716ms
> 5. PinoDeepObj average: 2.256ms
> 6. PinoMinLengthDeepObj average: 2.240ms
> 7. PinoNodeStreamDeepObj average: 2.595ms
Enter fullscreen mode Exit fullscreen mode

Pino'nun yüksek performansı, esnekliği ve yapılandırılmış loglama yetenekleri, Node.js uygulamaları için onu güçlü ve etkili bir loglama aracı yapar. Hem düşük gecikme süreleri hem de yüksek hacimli verilerin işlenmesi konusundaki yetenekleri, onu modern uygulama geliştirme için ideal bir seçenek haline getirir.

Aşağıdaki görselde Pino'nun 24.08.2023 - 24.08.2024 tarihleri arasındaki haftalık indirme sayısı ve grafiği yer almaktadır.

pino weekly download chart

Görüldüğü gibi Pino'nun popülaritesi giderek artmaktadır.

Eğer performans sizin için de önemliyse, Pino'yu projemizde nasıl kullanabileceğimize bir göz atalım.

1. Pino'yu Kurma

Öncelikle, Pino kütüphanesini projenize eklemeniz gerekiyor. Terminal veya komut satırına aşağıdaki komutu girerek Pino'yu yükleyebilirsiniz:

npm install pino

Pino'yu yükledikten sonra, package.json dosyanızın dependencies kısmında pino kütüphanesinin yer aldığını görebilirsiniz. Bu, Pino'nun projenize başarıyla eklendiğini ve kullanılmaya hazır olduğunu gösterir.

pageage.json

  "dependencies": {
    "express": "^4.19.2",
    "pino": "^9.3.2",
  },

Pinoyu kullanmadan önce kısa bir bilgi vermem gerekiyor.
package.json dosyasındaki "type" alanı, Node.js projenizin modül sistemini belirtir. Kütüphaneleri bu modül sistemine göre import ederiz.

Örneğin:

// "type": "module" ise
// Bu şekilde modülümüzü import ederiz.
import myModule from './myModule.js';

// "type": "commonjs" ise 
// Bu şekilde modülümüzü import ederiz.
const myModule = require('./myModule');

pageage.json dosyanızda "type": değişkenini bulamadıysanız endişelenmeyin. Varsayılan olarak "commonjs" kullanılır. Tabii siz bunu dilerseniz değiştirebilirsiniz.

2. Temel Pino Kullanımı

import express from "express";
import pino from "pino";

const app = express();

// Pino logger'ını oluştur
const logger = pino();

// Basit bir log mesajı yaz
logger.info('Pino ile loglama baslandi!');

app.get('/anasayfa', function (req, res) {
    logger.info('Anasayfa goruntulendi!');

    res.send("Anasayfa");
});

app.listen(3000, () => {
    console.log("Server running on port 3000");
});

Yukarıdaki kodu çalıştırırsanız. Console çıktısı aşağıdaki gibi olur.

{"level":30,"time":1724330396288,"pid":16412,"hostname":"DESKTOP-GVHRPI2","msg":"Pino ile loglama baslandi!"}

Bu JSON formatındaki log verisi şu bilgileri içerir:

- level: Log seviyesini (önem derecesini) belirtir.
- time: Log mesajının zaman damgasını (milisaniye cinsinden) gösterir.
- pid: Logun oluşturulduğu süreç kimliğini (process ID) belirtir.
- hostname: Logun oluşturulduğu bilgisayarın ağ üzerindeki adını gösterir.
- msg: Log mesajının içeriğini içerir.

"level" kısmına 30 değeri verilmesinin sebebi, logun info seviyesinde olduğunu belirtmesidir. Pino gibi loglama kütüphanelerinde, her log seviyesi belirli bir sayısal değeri temsil eder ve bu değerler log seviyelerinin önem derecesini belirler.

Aşağıda pinodaki log türleri ve seviyeleri yer almaktadır.

logger.trace('message') -> Level 10
logger.debug('message') -> Level 20
logger.info('message') -> Level 30
logger.warn('message') -> Level 40
logger.error('message') -> Level 50
logger.fatal('message') -> Level 60

Pino'da log seviyesi varsayılan olarak info olarak ayarlanır. Bu, info seviyesinin altındaki logların (örneğin, debug veya trace seviyeleri) konsola yazdırılmayacağı anlamına gelir.

3. Log Seviyesini Ayarlama

import pino from "pino";
const logger = pino({
    level: 'trace' // Log seviyesini 'trace' olarak ayarlıyoruz
});

Böylelikle her seviyedeki loglar consolda gösterilir.

4. Log Formatını Özelleştirme

Pino, logların formatını özelleştirmenize olanak tanır.
Örneğin loglarımızı daha okunabilir hale getirmek için pino-pretty kütüphanesini kullanabiliriz.

pino-pretty kurulumu:
npm install pino-pretty

pino-pretty eklentisini kullanmak için pageage.json dosya içeriğini aşağıdaki gibi değiştirmeniz gerekmektedir.

pageage.json

  "scripts": {
    "start": "node app.js | pino-pretty",
  },

app.js dosyamız

import express from "express";
import pino from "pino";

const app = express();
const logger = pino({
    level: 'trace',
});

// pino-pretty
logger.trace('pino-pretty ile trace gorunumu!');
logger.debug('pino-pretty ile debug gorunumu!');
logger.info('pino-pretty ile info gorunumu!');
logger.warn('pino-pretty ile warn gorunumu!');
logger.error('pino-pretty ile error gorunumu!');
logger.fatal('pino-pretty ile fatal gorunumu!');

app.get('/anasayfa', function (req, res) {    
    res.send("Anasayfa");
});

app.listen(3000, () => {
    console.log("Server running on port 3000");
});

npm start komutu ile projemizi başlattıktan sonra terminal aşağıdaki gibi görünecektir.

pretty-pino view

5. Logları Dosyaya Yazma

import express from "express";
import pino from "pino";
import fs from "fs";

const app = express();
// logların yazılacağı dosyayı belirtiniz. Dosya yok ise hata verecektir.
// flags:'a' dosyayı ekleme modunda açmamızı sağlar. a harfi append kelimesinden gelir.
const logStream = fs.createWriteStream('./src/logs/app.log', { flags: 'a' });

const logger = pino({
    level: 'trace'
}, logStream);

logger.info('Bu mesaj bir dosyaya yazılır');

app.get('/anasayfa', function (req, res) {    
    res.send("Anasayfa");
});

app.listen(3000, () => {
    console.log("Server running on port 3000");
});

6. Log hatalarını ele alma

Loglarla ilgili hata olması durumunda hata sebebini konsola yazdırır.

const logStream = fs.createWriteStream('./logs/app.log', { flags: 'a' });

logStream.on('error', (err) => {
    console.error('Log dosyasına yazma hatası:', err);
});

const logger = pino({
    level: 'trace'
}, logStream);

Top comments (0)