Merhaba arkadaşlar, bugün sizlere Node.js projelerinde can simidi görevi gören bir konudan bahsedeceğim: düzgün loglama! Bir projede console.log'ları sağa sola saçarak debug etmeye çalıştığım ve canlı ortamda bir hatayı bulmak için saatlerce log dosyalarında kaybolduğum günleri düşününce, hala ürperiyorum. İşte o günlerden sonra Winston ile profesyonel, merkezi ve yapılandırılabilir bir log sistemi kurmaya karar verdim. Sizi de bu kaostan kurtaracak yöntemimi anlatayım.
Neden Sadece console.log Yetmez?
console.log hızlı ve basit, evet. Ama gerçek bir uygulamada log'ların seviyelere (info, error, warn) ayrılması, farklı çıktılara (dosya, veritabanı, konsol) yazılması, formatlanması ve dönen bir serviste takip edilebilmesi gerekir. Winston ile tüm bu ihtiyaçları tek bir yapılandırma dosyasında halledebiliyoruz. İlk kurduğumda "Neden daha önce yapmadım?" dedirtti.
Winston Kurulumu ve Temel Yapılandırma
İlk adım, projemize winston'ı eklemek. Ardından, loglayıcımızı (logger) oluşturacağız. Ben genelde logger.js gibi bir dosya oluşturup tüm uygulama boyunca onu kullanmayı tercih ediyorum.
Bu yapılandırma ile artık logger.error('Database bağlantı hatası!', error) gibi bir kullanımla, hem konsolu renklendirip hem de ilgili dosyalara düzgünce yazdırabiliriz.
Gelişmiş Senaryolar ve En İyi Uygulamalar
Winston'ın gücü, transports (taşıyıcılar) ile geliyor. Yukarıda dosya ve konsol kullandık. Peki ya log'ları MongoDB'ye, Elasticsearch'e ya da bir Slack kanalına göndermek isterseniz? İşte o zaman hazır transport paketlerini (örn: winston-mongodb) kullanabilir veya kendi transport'unuzu yazabilirsiniz.
Ayrıca, farklı ortamlar (development, production) için farklı log seviyeleri belirlemek çok faydalı. Örneğin, development'ta 'debug' seviyesini kullanırken, production'da sadece 'info' ve üstünü loglamak performans ve güvenlik açısından önemli.
Sonuç ve Tecrübelerim
Winston'ı projelerime entegre ettikten sonra debug süreçlerim inanılmaz hızlandı. Özellikle canlıda bir sorun olduğunda, error.log dosyasına bakarak hatanın tam yerini ve stack trace'ini görmek hayat kurtarıcı oldu. Ayrıca, log dosyalarının belirli bir boyutu aşınca otomatik olarak eski dosyaları sıkıştırıp yenisini açması (maxsize, maxFiles) sistem yönetimini de kolaylaştırıyor.
Siz Node.js projelerinizde loglama için hangi kütüphaneleri veya yöntemleri kullanıyorsunuz? Winston dışında deneyip beğendiğiniz alternatifler var mı? Ya da Winston ile ilgili karşılaştığınız ilginç sorunlar? Yorumlarda deneyimlerinizi paylaşın, beraber öğrenelim!
console.log hızlı ve basit, evet. Ama gerçek bir uygulamada log'ların seviyelere (info, error, warn) ayrılması, farklı çıktılara (dosya, veritabanı, konsol) yazılması, formatlanması ve dönen bir serviste takip edilebilmesi gerekir. Winston ile tüm bu ihtiyaçları tek bir yapılandırma dosyasında halledebiliyoruz. İlk kurduğumda "Neden daha önce yapmadım?" dedirtti.
İlk adım, projemize winston'ı eklemek. Ardından, loglayıcımızı (logger) oluşturacağız. Ben genelde logger.js gibi bir dosya oluşturup tüm uygulama boyunca onu kullanmayı tercih ediyorum.
JavaScript:
// logger.js
const winston = require('winston');
// Log formatını tanımlayalım
const logFormat = winston.format.combine(
winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
winston.format.errors({ stack: true }), // Hata stack'ini de logla
winston.format.printf(({ timestamp, level, message, stack }) => {
return stack
? `${timestamp} [${level.toUpperCase()}]: ${message} - ${stack}`
: `${timestamp} [${level.toUpperCase()}]: ${message}`;
})
);
// Logger örneğimizi oluşturalım
const logger = winston.createLogger({
level: 'info', // Varsayılan log seviyesi
format: logFormat,
transports: [
// 1) Tüm log'ları konsola yaz
new winston.transports.Console({
format: winston.format.combine(
winston.format.colorize(), // Seviyelere göre renklendir
logFormat
)
}),
// 2) Hata seviyesindeki log'ları ayrı bir dosyaya yaz
new winston.transports.File({
filename: 'logs/error.log',
level: 'error',
maxsize: 5242880, // 5MB
maxFiles: 5
}),
// 3) Tüm log'ları ayrı bir dosyada topla
new winston.transports.File({
filename: 'logs/combined.log',
maxsize: 5242880,
maxFiles: 10
})
]
});
module.exports = logger;
Bu yapılandırma ile artık logger.error('Database bağlantı hatası!', error) gibi bir kullanımla, hem konsolu renklendirip hem de ilgili dosyalara düzgünce yazdırabiliriz.
Winston'ın gücü, transports (taşıyıcılar) ile geliyor. Yukarıda dosya ve konsol kullandık. Peki ya log'ları MongoDB'ye, Elasticsearch'e ya da bir Slack kanalına göndermek isterseniz? İşte o zaman hazır transport paketlerini (örn: winston-mongodb) kullanabilir veya kendi transport'unuzu yazabilirsiniz.
Ayrıca, farklı ortamlar (development, production) için farklı log seviyeleri belirlemek çok faydalı. Örneğin, development'ta 'debug' seviyesini kullanırken, production'da sadece 'info' ve üstünü loglamak performans ve güvenlik açısından önemli.
JavaScript:
// Ortama göre log seviyesi belirleme
const logLevel = process.env.NODE_ENV === 'production' ? 'info' : 'debug';
const envAwareLogger = winston.createLogger({
level: logLevel,
// ... diğer yapılandırmalar
});
// Uygulamanın her yerinde kolayca kullanım
const logger = require('./logger');
logger.info('Sunucu 3000 portunda başlatıldı.');
logger.warn('Cache doluluk oranı %90\'a ulaştı.');
logger.error('İstek işlenirken beklenmedik hata!', new Error('Connection refused'));
Winston'ı projelerime entegre ettikten sonra debug süreçlerim inanılmaz hızlandı. Özellikle canlıda bir sorun olduğunda, error.log dosyasına bakarak hatanın tam yerini ve stack trace'ini görmek hayat kurtarıcı oldu. Ayrıca, log dosyalarının belirli bir boyutu aşınca otomatik olarak eski dosyaları sıkıştırıp yenisini açması (maxsize, maxFiles) sistem yönetimini de kolaylaştırıyor.
Siz Node.js projelerinizde loglama için hangi kütüphaneleri veya yöntemleri kullanıyorsunuz? Winston dışında deneyip beğendiğiniz alternatifler var mı? Ya da Winston ile ilgili karşılaştığınız ilginç sorunlar? Yorumlarda deneyimlerinizi paylaşın, beraber öğrenelim!