Node.js'teki global console nesnesi, process.stdout ve process.stderr akışlarına yazan özel bir Console örneğidir. console.log ve console.info standart çıktıya (stdout), console.error ve console.warn standart hataya (stderr) yazar. Bunların yanında console.table ile tablo, console.time ile süre ölçümü, console.group ile girintili çıktı ve console.count ile sayaç gibi yardımcılar vardır. Terminalde renkli çıktı için ek paket gerekmez: node:util modülündeki styleText() fonksiyonu bu işi görür.
Bu yazıda konsol metotlarını örneklerle, biçim belirteçlerini (%s, %d, %j), stdout ile stderr ayrımının pratikteki önemini, dosyaya yazan kendi Console örneğinizi ve util.styleText()'in terminal yeteneklerine göre nasıl davrandığını ele alıyoruz. Tüm çıktılar Node.js v26.13.0 ile alındı.
console.log ve biçim belirteçleri

console.log() argümanlarını util.format()'a verir ve sonucu bir satır sonuyla stdout'a yazar. İlk argüman biçim belirteci içeren bir metinse, belirteçler sıradaki argümanlarla doldurulur. İlk argümanda belirteç yoksa her argüman util.inspect() ile metne çevrilip aralarına boşluk konarak yazılır.
console.log('%s adlı dosya %d KB', 'rapor.pdf', 42.7);
console.log('%i adet', 42.7);
console.log('%j', { ad: 'Ayşe', yas: 30 });
console.log('%s:%s', 'yalnız');
console.log('yüzde %d%%', 18);
console.log('etiket', { a: 1 }, [1, 2]);
// çıktı: rapor.pdf adlı dosya 42.7 KB
// çıktı: 42 adet
// çıktı: {"ad":"Ayşe","yas":30}
// çıktı: yalnız:%s
// çıktı: yüzde 18%
// çıktı: etiket { a: 1 } [ 1, 2 ]| Belirteç | Dönüşüm |
|---|---|
| %s | String(); BigInt, nesne ve -0 hariç (nesneler sınırlı derinlikte inspect edilir) |
| %d | Number(); BigInt ve Symbol hariç |
| %i | parseInt(değer, 10); tam sayı kısmı |
| %f | parseFloat(değer) |
| %j | JSON; döngüsel referansta [Circular] |
| %o | Gizli özellikler ve proxy dahil nesne gösterimi |
| %O | Seçeneksiz util.inspect() gösterimi |
| %c | CSS; Node.js bunu yok sayar |
| %% | Tek yüzde işareti; argüman tüketmez |
Belgede tanımlanan iki uç durum çıktıda da görünüyor: karşılığı olmayan belirteç olduğu gibi kalır (yalnız:%s), belirteçten fazla argüman verilirse fazlası sona boşlukla eklenir. %i ondalık kısmı attı. util.format()'un senkron çalıştığını ve bazı girdilerde olay döngüsünü bloklayabilecek kadar maliyetli olabildiğini de belge özellikle not eder; yoğun bir döngünün içinde büyük nesneleri biçimlendirmekten kaçının.
%o ile %O arasındaki fark küçük bir dizide bile görünür: %o gizli özellikleri de gösterdiği için dizinin length özelliğini ekler. Hata nesnelerinin belirli alanlarını yazdırmak da yaygın bir ihtiyaçtır:
const err = new Error('Bağlantı kurulamadı', { cause: 'zaman aşımı' });
err.code = 'E_BAGLANTI';
console.log('%s', err.message);
console.log('%o', [1]);
console.log('%O', [1]);
console.error(err.code, err.cause);
// çıktı: Bağlantı kurulamadı
// çıktı: [ 1, [length]: 1 ]
// çıktı: [ 1 ]
// çıktı: E_BAGLANTI zaman aşımıBir Error nesnesini doğrudan console.error(err) ile yazdırırsanız, global konsol mesajla birlikte yığın izini de stderr'e yazar; belgedeki örnek bunu gösterir. Log satırlarını kısa tutmak istediğinizde yukarıdaki gibi yalnızca message, code veya cause alanlarını seçmek daha okunaklı sonuç verir. Hata kodlarının anlamları Node.js hata kodları yazısında.
İç içe nesneler ve console.dir
console.log nesneleri varsayılan derinlikle gösterir; daha derindeki düzeyler [Object] olarak kısaltılır. console.dir() ise util.inspect() seçeneklerini doğrudan alır. depth varsayılan olarak 2'dir; null verirseniz sınırsız iner. Belgeye göre console.dir nesne üzerinde tanımlanmış özel inspect() fonksiyonunu da atlar.
console.log({ derin: { b: { c: { d: { e: 1 } } } } });
console.dir({ derin: { b: { c: { d: { e: 1 } } } } }, { depth: null });
// çıktı: { derin: { b: { c: [Object] } } }
// çıktı: {
// çıktı: derin: {
// çıktı: b: { c: { d: { e: 1 } } }
// çıktı: }
// çıktı: }util.inspect()'in diğer seçenekleri (renkler, compact, breakLength ve benzerleri) util.promisify ve inspect yazısında. Nesneleri JSON metnine çevirmek istiyorsanız dil düzeyindeki JSON.stringify yazısına bakın.
stdout ve stderr: neden ikisi var?
Learn rehberinin anlattığı gibi console.log standart çıktıya, console.error ise standart hata akışına yazar. Terminalde ikisi aynı yerde görünür, ama kabuk onları ayrı ayrı yönlendirebilir. Bu ayrım, programınızın asıl verisini (örneğin bir JSON çıktısını) bir dosyaya ya da başka bir komuta aktarırken, hata ve uyarı mesajlarının o veriye karışmamasını sağlar.
// akis.mjs
console.log('normal çıktı');
console.info('bilgi');
console.warn('uyarı');
console.error('hata');node akis.mjs 2>/dev/null
# çıktı: normal çıktı
# çıktı: bilgi
node akis.mjs 2>&1 >/dev/null
# çıktı: uyarı
# çıktı: hataİlk komut stderr'i attı ve yalnızca log ile info kaldı; ikinci komut tersini yaptı. Belgeye göre console.info ve console.debug, console.log'un; console.warn ise console.error'un takma adıdır. Yani warn ile error arasında Node.js açısından bir fark yoktur; ikisi de stderr'e gider.
Akışın bir terminale bağlı olup olmadığını process.stdout.isTTY ile öğrenebilirsiniz; belgedeki örnekte node -p "Boolean(process.stdout.isTTY)" terminalde true, çıktı | cat ile boruya verildiğinde false döndürür. Aşağıda göreceğiniz renk davranışı tam olarak bu ayrıma dayanır.
Sayaç, grup ve doğrulama

console.count(etiket) her etiket için ayrı bir sayaç tutar ve kaçıncı kez çağrıldığını yazar; etiket verilmezse 'default' kullanılır. console.countReset() sayacı sıfırlar. console.group() sonraki satırların girintisini artırır, console.groupEnd() azaltır; girinti miktarı varsayılan olarak 2 boşluktur. console.assert() ilk argüman falsy ise Assertion failed ile başlayan bir mesaj yazar, truthy ise hiçbir şey yapmaz.
for (const meyve of ['elma', 'armut', 'elma']) console.count(meyve);
console.count();
console.countReset('elma');
console.count('elma');
console.group('Sipariş 1001');
console.log('Ürün: klavye');
console.group('Kargo');
console.log('Durum: yolda');
console.groupEnd();
console.groupEnd();
console.log('grup bitti');
console.assert(1 + 1 === 2, 'görünmez');
console.assert([].length > 0, 'Liste boş: %d öğe', 0);
// çıktı: elma: 1
// çıktı: armut: 1
// çıktı: elma: 2
// çıktı: default: 1
// çıktı: elma: 1
// çıktı: Sipariş 1001
// çıktı: Ürün: klavye
// çıktı: Kargo
// çıktı: Durum: yolda
// çıktı: grup bitti
// çıktı: Assertion failed: Liste boş: 0 öğeconsole.assert hakkında önemli bir ayrıntı: belgeye göre v10.0.0'dan beri yalnızca mesaj yazar ve çalışmayı etkilemez, yani hata fırlatmaz. Bir koşul sağlanmadığında programın durmasını istiyorsanız node:assert modülünü kullanın; test bağlamındaki kullanımı node:test yazısında. Ayrıca bu doğrulama mesajı stdout'a değil stderr'e gider; çıktıyı yönlendirirken bunu hesaba katın. console.groupCollapsed() Node.js'te yalnızca console.group()'un takma adıdır.
console.table ile tablo çıktısı
console.table(), bir dizi ya da nesnenin özelliklerinden sütunlar oluşturup bir tablo çizer. İkinci argüman olarak gösterilecek sütunların listesini verebilirsiniz. Veri tabloya dönüştürülemiyorsa (örneğin bir Symbol veya undefined) argüman olduğu gibi yazılır.
console.table([
{ urun: 'Klavye', adet: 2 },
{ urun: 'Fare', adet: 5 },
]);
console.table([{ urun: 'Klavye', adet: 2, fiyat: 900 }], ['urun']);
// çıktı: ┌─────────┬──────────┬──────┐
// çıktı: │ (index) │ urun │ adet │
// çıktı: ├─────────┼──────────┼──────┤
// çıktı: │ 0 │ 'Klavye' │ 2 │
// çıktı: │ 1 │ 'Fare' │ 5 │
// çıktı: └─────────┴──────────┴──────┘
// çıktı: ┌─────────┬──────────┐
// çıktı: │ (index) │ urun │
// çıktı: ├─────────┼──────────┤
// çıktı: │ 0 │ 'Klavye' │
// çıktı: └─────────┴──────────┘Tablo kutu çizim karakterleriyle çizildiği için makine tarafından okunacak bir çıktı için uygun değildir; bir betiğin çıktısını başka bir programa vereceksiniz JSON veya CSV gibi bir biçim tercih edin. İkinci tabloda fiyat sütununu ['urun'] listesiyle dışarıda bıraktık.
Süre ölçümü ve yığın izi
console.time(etiket) bir zamanlayıcı başlatır, aynı etiketle çağrılan console.timeEnd() onu durdurup geçen süreyi uygun birimle yazar; belgeye göre bu birim seçimi v13.0.0 ile geldi ve 3869 milisaniye 3.869s olarak gösterilir. console.timeLog() zamanlayıcıyı durdurmadan ara süreyi ve ek verileri yazar.
console.time('döngü');
let t = 0;
for (let i = 0; i < 1e6; i++) t += i;
console.timeLog('döngü', 'ara toplam', t);
console.timeEnd('döngü');
console.timeEnd('yok');
// çıktı: döngü: 4.693ms ara toplam 499999500000
// çıktı: döngü: 5.986ms
// çıktı: (node:70204) Warning: No such label 'yok' for console.timeEnd()
// çıktı: (Use `node --trace-warnings ...` to show where the warning was created)Süreler her çalıştırmada değişir; gösterdiğimiz değerler bizim makinemizdeki bir çalıştırmaya aittir. Başlatılmamış bir etiketi durdurmaya çalışmak hata fırlatmaz, bir süreç uyarısı yazar. Bu araç kabaca ölçüm içindir; ayrıntılı performans analizi ve olay döngüsü gecikmesi için Node.js performans optimizasyonu yazısına bakın.
console.trace(), Trace: önekiyle mesajı ve o noktaya kadarki yığın izini stderr'e yazar. Learn rehberinin sorusuyla, "koda bu noktaya nasıl gelindi" sorusunu yanıtlamak için kullanışlıdır:
function ic() { console.trace('Buraya nasıl gelindi?'); }
function dis() { ic(); }
dis();
// çıktı: Trace: Buraya nasıl gelindi?
// çıktı: at ic (file:///home/kullanici/proje/trace.mjs:1:25)
// çıktı: at dis (file:///home/kullanici/proje/trace.mjs:2:18)
// çıktı: at file:///home/kullanici/proje/trace.mjs:3:1Çıktılardaki yerel yollar /home/kullanici/proje/ biçiminde kısaltıldı. Yığının geri kalan Node.js iç satırlarını göstermedik. console.clear() stdout bir terminalse onu temizlemeye çalışır, değilse hiçbir şey yapmaz. console.profile() ve console.timeStamp() gibi metotlar ise yalnızca inspector bağlıyken çıktı üretir; bunlar --inspect ve DevTools yazısının konusu.
Kendi Console örneğiniz: dosyaya log yazmak
node:console modülündeki Console sınıfı, istediğiniz herhangi bir yazılabilir akışa yazan bir konsol oluşturur. stderr akışı verilmezse stdout akışı her iki iş için de kullanılır. Global console da aslında new Console({ stdout: process.stdout, stderr: process.stderr }) ile eşdeğer özel bir örnektir.
import { Console } from 'node:console';
import { createWriteStream } from 'node:fs';
import { readFileSync } from 'node:fs';
const out = createWriteStream('./uygulama.log');
const logger = new Console({ stdout: out, stderr: out });
logger.log('sipariş: %d', 1001);
logger.error('ödeme reddedildi');
out.end(() => console.log(readFileSync('./uygulama.log', 'utf8')));
// çıktı: sipariş: 1001
// çıktı: ödeme reddedildiKurucuya verebileceğiniz diğer seçenekler: ignoreErrors (varsayılan true; alttaki akışa yazma hataları yok sayılır), colorMode (varsayılan 'auto'), inspectOptions ve groupIndentation (varsayılan 2). Belgeye göre v24.10.0 ile inspectOptions stdout ve stderr için farklı seçenekler tanımlamak amacıyla bir Map da olabilir. Dosya akışlarının ayrıntısı stream nedir ve dosya yazma yazılarında.
util.styleText ile renkli çıktı

util.styleText(bicim, metin[, secenekler]), metni terminalde biçimlendirilecek şekilde ANSI kodlarıyla sarar. Belgeye göre v23.5.0 ve v22.13.0 ile kararlı hâle geldi. Learn sayfasındaki notun bu fonksiyonu "aktif geliştirme" olarak anması, sayfanın v22.11 için yazılmış olmasından kaynaklanır. Biçim olarak tek bir ad, ad dizisi ya da v26.1.0 ile gelen #RGB veya #RRGGBB biçiminde onaltılık bir renk verebilirsiniz. Dizide biçimler soldan sağa uygulanır; ['red', 'green'] sonuçta yeşil yazar. Özel 'none' değeri hiçbir biçim eklemez.
import { styleText } from 'node:util';
const ok = styleText(['green', 'bold'], 'Başarılı');
console.log(ok);
console.log(JSON.stringify(ok));
const zorla = styleText('red', 'Hata', { validateStream: false });
console.log(JSON.stringify(zorla));
console.log(JSON.stringify(styleText('#ff5733', 'turuncu', { validateStream: false })));
console.log(JSON.stringify(styleText('none', 'düz', { validateStream: false })));
try {
styleText('pembe', 'x');
} catch (err) {
console.log(err.code);
}node renk.mjs | cat
# çıktı: Başarılı
# çıktı: "Başarılı"
# çıktı: "\u001b[31mHata\u001b[39m"
# çıktı: "\u001b[38;2;255;87;51mturuncu\u001b[39m"
# çıktı: "düz"
# çıktı: ERR_INVALID_ARG_VALUEBu çıktı fonksiyonun en önemli davranışını gösteriyor. Çıktı boruya gittiği için process.stdout bir TTY değildi ve styleText ilk metne hiçbir ANSI kodu eklemedi; JSON.stringify sonucunda da düz "Başarılı" görünüyor. Belgeye göre fonksiyon varsayılan olarak stream seçeneğindeki akışın (varsayılan process.stdout) renkleri destekleyip desteklemediğini denetler ve NO_COLOR, NODE_DISABLE_COLORS ve FORCE_COLOR ortam değişkenlerine uyar. validateStream: false verdiğimizde denetim kapandı ve kodlar eklendi. Tanımsız bir biçim adı ise ERR_INVALID_ARG_VALUE hatası verdi.
Aynı betiği FORCE_COLOR=1 ile boruya verdiğimizde ilk satır da \u001b[32m\u001b[1m ile başlayan kodlarla geldi. CLI belgesine göre FORCE_COLOR değeri 1, true veya boş metin olduğunda 16 renk, 2 olduğunda 256 renk, 3 olduğunda 16 milyon renk desteği bildirir ve geçerli bir değerle ayarlandığında NO_COLOR ile NODE_DISABLE_COLORS yok sayılır. stderr'e renkli yazacaksanız { stream: process.stderr } verin ki denetim doğru akış üzerinde yapılsın.
| Grup | Örnek biçimler |
|---|---|
| Değiştiriciler | bold, italic, underline, dim, inverse, strikethrough, hidden, reset |
| Ön plan renkleri | black, red, green, yellow, blue, magenta, cyan, white, gray, redBright |
| Arka plan renkleri | bgBlack, bgRed, bgGreen, bgYellow, bgBlue, bgGray, bgRedBright |
| Onaltılık | #f00, #ff5733 (v26.1.0 ile) |
| Özel | none: biçim eklemez |
Belgeye göre değiştirici desteği terminalden terminale değişir; desteklenmeyenler çoğunlukla yok sayılır. Learn bölümündeki geçiş rehberleri chalk, kleur ve ansi-colors gibi paketlerden util.styleText()'e geçişi ayrıca anlatır.
Sık yapılan hatalar
- Hata mesajlarını console.log ile yazmak: Çıktı bir dosyaya veya başka bir komuta yönlendirildiğinde hata mesajları veriye karışır. Hatalar için
console.errorkullanın. - console.assert'in programı durduracağını sanmak: Yalnızca mesaj yazar; durdurmak için
node:assertkullanın. - Renk kodlarını elle yazmak: Elle eklenen ANSI kodları boruya ve log dosyalarına da gider.
styleTextakışı denetleyip gerektiğinde kodları eklemez. - Derin nesnelerde [Object] görüp verinin eksik olduğunu sanmak: Bu yalnızca gösterim derinliğidir;
console.dir(obj, { depth: null })kullanın. - console.table çıktısını ayrıştırmaya çalışmak: Tablo insanlar için çizilir; makine için JSON yazın.
- Yoğun döngüde büyük nesneleri loglamak: Biçimlendirme senkrondur ve bazı ortamlarda yazma da senkron olduğundan olay döngüsü bloklanabilir.
Sık Sorulan Sorular
console.warn ile console.error arasında fark var mı?
Node.js'te yok; console.warn, console.error'un takma adıdır ve ikisi de stderr'e yazar.
process.exit() sonrası bazı log satırları neden kayboluyor?
Çıktı bir boruya veya terminale asenkron yazılıyorsa, process.exit() süreci bu yazma işlemleri bitmeden kapatabilir. Belge bu yüzden çıkış kodunu process.exitCode ile ayarlayıp sürecin doğal yolla bitmesini önerir; ayrıntılar process.exitCode yazısında.
Renkleri tamamen kapatmak için ne yapmalıyım?
NO_COLOR ortam değişkenini herhangi bir değerle tanımlayın; belgeye göre bu NODE_DISABLE_COLORS'ın takma adıdır. FORCE_COLOR geçerli bir değerle tanımlıysa bu iki değişken yok sayılır.
Konsoldan kullanıcı girdisi nasıl alınır?
console yalnızca çıktı içindir. Girdi okumak için node:readline kullanılır; readline ile kullanıcı girdisi yazısına bakın.
Üretimde console.log kullanmak doğru mu?
Küçük servislerde stdout'a yazıp logları süreç yöneticisine veya sistem günlüğüne bırakmak yaygın bir yaklaşımdır. Ancak yukarıdaki senkron yazma uyarısını dikkate alın ve yoğun çıktı üreten kodda yazma maliyetini ölçün.
Marka adları sahiplerine aittir. Bu yazı bağımsız bir teknik rehberdir; adı geçen kuruluşlarla bayilik veya ortaklık ilişkisi bulunduğu anlamına gelmez.
İlgili içerikler: Node.js öğrenme rehberi · util.inspect ve format · process ve çıkış kodları · readline · stream nedir · Debug ve DevTools