← Todos los artículos

Ventanas en el frontend

Output Console: observar el console.log de la página en un panel de la pestaña — sin DevTools

La consola de las DevTools funciona muy bien — cuando está abierta. La mayor parte del tiempo no lo está. Y peor: la consola de las DevTools muestra los logs de cada página que estás usando en ese momento. Difícil pescar «mis logs de este flujo específico» en la avalancha de ruido. La Output Console (desde v2.13.66) es un visor de logs de solo lectura en la pestaña misma — ves los logs de esta pestaña, limitados a este dominio, siempre disponibles como los demás paneles JustZix.

Cuatro tipos de ventanas — dónde encaja la Output Console

TipoQué haceLectura/escritura
CSS paneEditor CSS en tiempo real, aplicado vía <style>ESCRITURA (CSS → página)
JS paneScript JS Run-on-demand (botón ▶)ESCRITURA (JS → página)
JS ConsoleREPL con eval Ctrl+Enter + historial ↑↓ESCRITURA (JS → página) + LECTURA (resultado eval)
Output ConsoleVisor de logs de solo lecturaSOLO LECTURA

Los tres primeros tipos hacen algo a la página. La Output Console escucha. Cada llamada console.log/warn/error/info/debug de la página (y de otros scripts JustZix) llega como una línea coloreada. Además — un canal window.JUSTZIX.log() dedicado (desde v2.13.73; alias primario desde v2.13.76, con nombre de marca y riesgo de colisión despreciable) que NO se reenvía a la consola nativa, solo a la Output Console — tus scripts pueden loguear sin contaminar las DevTools.

Arquitectura — hook de página + broadcast hacia los sinks

La Output Console trabaja en dos pasos:

  1. Hook de página (MAIN world) — Inyectado vía chrome.scripting.executeScript({world: 'MAIN', func: hookFn}) (inmune a la CSP desde v2.13.74). Envuelve console.log/warn/error/info/debug conservando el passthrough hacia el original (las DevTools no pierden nada), pero cada llamada hace también window.postMessage({source:'jz-output-console', kind:'console', level, text, t}).
  2. Broadcast hacia los sinks (ISOLATED world) — El content script de JustZix escucha window.message y hace el broadcast de las entradas hacia todos los paneles Output Console actualmente renderizados mediante el Map _outputConsoleSinks. Cada panel añade su línea a su propio log (estado por instancia).

Además stringifyArg — un transformador de argumentos consciente de los tipos:

viewMode: [C+J] / [C] / [J] — dos canales, un panel

Desde v2.13.73 la Output Console tiene un botón viewMode cíclico en la cabecera. Tres estados:

ModoQué vesCaso de uso
[C+J] (Ambos)Todo — consola de la página + scripts JustZixPredeterminado — la vista más completa
[C] (Solo consola)Solo console.* de la páginaDepurar la página, sin tus logs
[J] (Solo JustZix)Solo window.JUSTZIX.log/.warn/.error/.info/.debug (o JZ.log si no está ocupado)Tus acciones, limpias, sin ruido

Implementación: cero overhead JS por línea. Cada entrada recibe una clase jz-output-line-{kind}, y el modo añade una clase jz-output-mode-{mode} sobre el pane. Las reglas CSS de ocultación hacen el resto:

.jz-output-mode-standard .jz-output-line-jz { display: none; }
.jz-output-mode-jz       .jz-output-line-console { display: none; }
/* .jz-output-mode-both muestra todo */

Filtros por nivel + búsqueda — funciones de power-user

Bajo el botón ⚙ se abre un popover con 5 checkboxes: log / info / warn / error / debug. Todas marcadas por defecto excepto debug (default off — las páginas abusan de console.debug para el spam). Mismo mecanismo que el viewMode — clase jz-output-hide-{level} + regla CSS, cero overhead JS.

Además un toggle de búsqueda 🔍 sobre el log. Filtro en vivo con match de subcadena, case-insensitive. Esc lo vacía. Persistido en sessionStorage por pestaña — filtros/búsqueda sobreviven a la recarga.

// Escribe en la JS Console:
for (let i = 0; i < 5; i++) console.log(`Acción usuario ${i}`);
for (let i = 0; i < 5; i++) console.warn(`Aviso usuario ${i}`);
JUSTZIX.log('Log de mi script');

// La Output Console mostrará 11 líneas.
// Pasa a [J] → solo 1 (JUSTZIX.log).
// Pasa a [C] + solo filtro «warn» → 5 (console.warn).
// Búsqueda «usuario 3» → captura «Acción usuario 3» + «Aviso usuario 3».

Caso de uso 1 — Monitorizar dataLayer.push (debug GTM)

Problema GTM clásico: quieres saber qué envía cada tag al dataLayer. Consola de las DevTools = abrirse paso entre decenas de otros logs. Output Console:

// Regla JS (arranca automáticamente en el sitio):
const origPush = window.dataLayer.push;
window.dataLayer.push = function(event) {
  JUSTZIX.log('[dataLayer]', JSON.stringify(event));
  return origPush.call(this, event);
};
JUSTZIX.log('Hook dataLayer instalado.');

La Output Console en modo [J] muestra solo tus líneas JUSTZIX.log — cada tag GTM = una línea coloreada. Filtro «purchase» → solo e-commerce. Filtro «ga4» → solo eventos GA. Sin F12, sin Tag Assistant, sin panel Network.

Caso de uso 2 — Monitorización de un flujo QA largo

Un tester QA registra un flujo de 30 minutos. La consola de las DevTools se llena tras 5 minutos (máximo predeterminado ~1000 líneas). Output Console:

Caso de uso 3 — Rastreo de los errores asíncronos

El overlay de error del JS pane (barra roja) NO captura los errores asíncronos — setTimeout(() => { throw err }, 100) no aparece en el pane. La Output Console SÍ los captura — porque console.error también es invocado por el gestor de errores global:

// Regla JS:
window.addEventListener('error', (e) => {
  JUSTZIX.error('[unhandled]', e.message, '@', e.filename + ':' + e.lineno);
});
window.addEventListener('unhandledrejection', (e) => {
  JUSTZIX.error('[promise reject]', e.reason);
});

La Output Console en modo [J] + filtro «solo error» — cada error global en una lista legible. Cómodo cuando una SPA loguea 50 errores por minuto y solo quieres los tuyos.

Caso de uso 4 — Monitor de las respuestas API

Una página tiene fetch que no aparecen en la vista (sync en segundo plano). Comprueba qué responde el servidor:

// Regla JS — proxy del fetch:
const origFetch = window.fetch;
window.fetch = async function(...args) {
  const res = await origFetch.apply(this, args);
  const clone = res.clone();
  clone.json().then(data => {
    JUSTZIX.log('[fetch]', args[0], '→', JSON.stringify(data).slice(0, 200));
  }).catch(() => {});
  return res;
};

La Output Console muestra la URL + los primeros 200 caracteres de la respuesta JSON. Busca por URL → ves un solo endpoint. Genial para depurar fetch inestables sin el panel Network de F12.

Páginas con CSP estricta — por qué el script inline fallaba (fix v2.13.74)

Hasta v2.13.73 el hook de página se inyectaba como elemento <script> con textContent. Funcionaba en ~99% de las páginas — pero una CSP estricta (script-src 'self' sin 'unsafe-inline', p. ej. GitHub, el checkout de Stripe, los bancos) bloqueaba silenciosamente la ejecución. appendChild tenía éxito (mutación del DOM OK), pero el script no se ejecutaba, ningún error lanzado.

Síntoma: window.JUSTZIX.log is not a function + console.log no aparece en la Output Console. Fix (v2.13.74): el hook pasó a chrome.scripting.executeScript({world: 'MAIN', func: hookFn}) — los privilegios de la extensión vencen a la CSP de la página. Tras la primera instalación la Output Console recibe un mensaje de bienvenida (desde v2.13.76 lista los alias activos): [JustZix] Output Console hook ready. API: window.JUSTZIX (or JZ / __JUSTZIX__).log/.warn/.error/.info/.debug.

Trampas

Qué hacer después

La Output Console cierra el mini-IDE en la pestaña — un canal de solo lectura junto a los tres canales de escritura (CSS pane / JS pane / JS Console). Juntos son una «alternativa a Chrome DevTools para el 80% de los casos» — sin F12, limitada por dominio, con UI personalizable. Mira también window.JZ helpers para el canal de logging dedicado y depurar GTM dataLayer.push como aplicación concreta.

Instala JustZix — completamente gratuito, sin cuenta, sin servidor.

Valora este artículo

Sin valoraciones — sé el primero.

Pruébalo tú mismo

Instala JustZix y pega cualquier snippet de este artículo. Dos minutos de cero a una regla funcionando en todos tus dispositivos.

Obtener JustZix

Funciones · Cómo funciona · Ejemplos · Casos de uso