# Console

> O feed de diagnóstico ao vivo do programa em execução: 500 entradas em memória, buscadas e filtradas por nível, área e componente, com uma captura detalhada e um pacote de suporte para investigação.

A aba Console de [Eventos](events) (`/events?view=console`) é o feed de diagnóstico de todo o
programa: cada subsistema (a aplicação, o servidor OPC UA embutido, os drivers, a Logic, o Process,
os dashboards, o acesso de agente e o licenciamento) escreve num fluxo só, e o Console mostra as 500
entradas mais recentes dele, ao vivo. Ela é a última aba porque é o detalhe técnico que se lê por
último, depois das linhas do tempo tipadas. Vê-la exige **Ver eventos**; exportar linhas ou criar um
pacote de suporte exige **Exportar/importar históricos**; iniciar ou parar uma captura detalhada
exige **Alterar configurações**.

## O feed e o seu buffer {#the-feed-and-its-buffer}

O Console é uma projeção do fluxo único de diagnóstico do processo, mantida em memória: as 500
entradas mais recentes, compartilhadas por toda superfície que as mostra (a janela da própria
estação, todo navegador remoto, toda aba). As entradas mais antigas saem conforme as novas chegam;
nada nesta aba sobrevive a um reinício. Esse mesmo fluxo é escrito num arquivo diário rotativo,
`logs\ganter-lab-<date>.log` na pasta de dados da estação (30 dias guardados, 50 MB por arquivo),
que é o que um pacote de suporte recolhe.

Toda entrada é higienizada antes de chegar ao Console ou ao arquivo: senhas, tokens, chaves e
credenciais dentro de URLs são substituídas por "[REDACTED]", cargas de protocolo (bytes crus,
documentos JSON ou XML) por "[PROTOCOL PAYLOAD OMITTED]", uma mensagem é cortada em 16 KB e uma
exceção em 64 KB com "…[TRUNCATED]". Só entradas de nível Informação para cima entram no feed; o
detalhe verboso, e as entradas que um produtor marca como detalhe de diagnóstico (a conversa de
protocolo crua e repetitiva), chegam apenas a um arquivo de captura detalhada. Falhas de comunicação
que se repetem são agrupadas pelo seu produtor numa linha de primeira falha, resumos periódicos e
uma linha de recuperação, para que um dispositivo quebrado não inunde a lista.

## Uma entrada {#an-entry}

Cada linha mostra a hora do dia, um ponto para o nível (neutro para Informação, cautela para Aviso,
crítico para Erro), "Área · Componente" e a mensagem. O botão **Copiar a linha**, na borda direita de
uma linha, copia "instante completo [Severidade] Área · Componente mensagem", e o feed de ações
responde "Linha copiada para a área de transferência." (ou "A área de transferência recusou a
cópia." num navegador que a nega). Clicar na linha a seleciona e abre o painel de detalhes.

## Busca {#search}

A caixa "Busque nas mensagens e em todo o contexto disponível" filtra enquanto você digita, sem
atraso. Uma linha casa quando o texto está contido (sem diferenciar maiúsculas) em qualquer um
destes: a mensagem, a área, o componente, o logger, o dispositivo, o tag, a operação, o cliente, a
sessão, a unidade, o procedimento, o id da execução ou o texto de detalhe (uma exceção e o seu stack
trace).

## Os chips de nível {#the-level-chips}

Três chips, **Informação**, **Aviso** e **Erro**, cada um um alternador com um ponto no tom do nível e uma
contagem ao vivo. Um chip ligado mostra o seu nível; clique nele para esconder aquele nível. A
contagem é quantas entradas o chip revelaria sob a busca, a área e o componente atuais: ela respeita
esses três filtros e ignora os próprios alternadores de nível, então um nível escondido continua
anunciando o que guarda. Os três começam ligados.

Não há chip de Debug: entradas abaixo de Informação nunca entram no feed, então um chip para elas só
poderia marcar 0 e não esconderia nada. O detalhe verboso se encontra num arquivo de captura
detalhada.

## As listas Área e Componente {#the-area-and-component-lists}

| Lista | Valores | O que faz |
| --- | --- | --- |
| Área | **Todas as áreas** (padrão) e, em seguida, uma por subsistema: **App**, **Server**, **Connector**, **Logic**, **Process**, **Dashboard**, **Agent**, **Licensing** | Mantém as entradas de um subsistema. |
| Componente | **Todos os componentes** (padrão) e, em seguida, todo componente presente no buffer para a área selecionada, em ordem alfabética | Mantém as entradas de um produtor concreto dentro da área (um driver, um worker, o SDK do OPC UA). |

| Área | O que escreve ali |
| --- | --- |
| App | O ciclo de vida da aplicação: o host da área de trabalho, o registro em log, o tratamento de falhas e de atualizações, as falhas do próprio diário de eventos e tudo o que não nomeou outra área. |
| Server | O servidor OPC UA embutido e o seu SDK. |
| Connector | A comunicação com dispositivos: o conector, os drivers, as leituras e escritas de tags. |
| Logic | Variáveis, ações, gatilhos, alarmes e o funil de escrita. |
| Process | Modelos, receitas, avaliações, ocorrências, o monitor de intertravamento e o ciclo de vida da execução. |
| Dashboard | Comandos acionados em dashboards, e o host web embutido que os serve. |
| Agent | O que um agente de IA fez via MCP. |
| Licensing | A licença da estação e o limitador de runtime não licenciado. |

O componente que você escolheu continua na lista mesmo depois que toda entrada que o carregava saiu
do buffer, para que um filtro posto a vigiar um driver não seja alargado em silêncio para todo
componente; uma lista vazia é então a resposta honesta. Mudar a área reconstrói a lista de
componentes daquela área.

## Acompanhando o fim {#following-the-tail}

Com **Acompanhar o fim (rolagem automática)** ligado (o padrão), a lista gruda na entrada mais
recente conforme o feed cresce. Rolar para cima o desliga, para que você possa ler algo enquanto as
entradas continuam chegando; rolar de volta até 24 pixels do fundo o liga de novo. Enquanto ele está
desligado, uma pílula "N entradas novas" (ou "1 entrada nova") conta as chegadas que casam com os
filtros atuais; clique nela, ou no botão da barra de ferramentas, para voltar ao fim. Trocar para
outra aba e voltar preserva o estado de acompanhamento, e salta para o fim se ele estava ligado.

## A barra de ferramentas {#the-toolbar}

| Comando | O que faz | Fica cinza quando | Não é desenhado quando |
| --- | --- | --- | --- |
| Iniciar a captura / Parar a captura | Inicia uma captura detalhada de diagnóstico por até 15 minutos, ou para a que está correndo (veja abaixo). | Enquanto a troca está sendo aplicada | O papel não tem Alterar configurações |
| Abrir em uma janela | Abre a página Eventos numa aba ou janela nova do navegador, tanto na janela da própria estação quanto num navegador remoto, para que o feed possa ficar num segundo monitor. A janela nova abre na aba Console, aquela em que o botão fica. Um navegador que bloqueia pop-ups não abre nada, e o feed de ações avisa: "O navegador não abriu uma segunda janela. Libere as janelas pop-up para esta estação e tente de novo." | | |
| Quebrar linha | Quebra mensagens longas em várias linhas em vez de cortá-las. | | |
| Acompanhar o fim (rolagem automática) | Liga o acompanhamento (saltando para o fim e zerando a contagem de entradas novas) ou o desliga. | | |
| Limpar a visão | Esvazia o feed em memória em toda superfície de uma vez: a janela da estação, todo navegador remoto e toda aba veem a mesma lista vazia. O feed de ações responde "Visão do console limpa para a estação inteira." Os arquivos de log rotativos, os arquivos de captura e o diário de eventos ficam intocados. | O runtime está parado: o botão fica cinza, e a sua dica diz que a estação não aceita nenhuma mudança agora | O papel não tem Alterar configurações |
| Exportar | Abre o menu: **Exportar como CSV…**, **Exportar como JSON…** e, depois de um separador, **Criar pacote de suporte…**. | Criar pacote de suporte fica cinza enquanto um está sendo montado | O papel não tem Exportar/importar históricos |

## Captura detalhada {#detailed-capture}

**Iniciar a captura** eleva o processo inteiro ao registro verboso por até quinze minutos e escreve
tudo, detalhe verboso e conversa de protocolo inclusive, num arquivo de captura próprio:
`logs\diagnostic-captures\ganter-temporary-diagnostic-<stamp>-<id>.log`, na pasta de dados da
estação (uma sessão rotaciona em 25 MB mantendo dois arquivos; as dez sessões mais recentes são
guardadas). O feed de 500 entradas e o arquivo rotativo normal ficam exatamente como estavam: nada
de extra chega a eles.

O botão passa então a dizer **Parar a captura**; a sua dica diz "Parar antes da hora a captura
detalhada de diagnóstico. Iniciada hh:mm:ss." A captura para sozinha quando a contagem chega a zero,
quando você aciona o botão, ou quando a aplicação é encerrada. As duas pontas são anunciadas no feed de ações
("Captura detalhada iniciada por até 15 minutos.", "Captura detalhada parada.") e deixam linhas no
Console sob App · Diagnostic capture.

A captura é uma chave da estação inteira: todo circuito vê a mesma contagem regressiva, e ela
sobrevive à janela que a acionou. É por isso que ela exige **Alterar configurações**: um papel sem
essa permissão não recebe o botão desenhado, e um acionamento que ainda assim chegue ao tratador
responde "Iniciar ou parar a captura detalhada exige a permissão Alterar configurações." O que a
captura está fazendo não fica sob permissão nenhuma: enquanto ela grava, um mostrador ao lado do
botão traz um ponto de gravação, "Captura detalhada ativa" e o tempo que falta (mm:ss, a partir de
15:00), e todo papel o lê. Quando nada está gravando, esse mesmo mostrador fica só para o leitor de
tela, que diz "Captura detalhada inativa".

## Criar pacote de suporte {#create-support-package}

O último item do menu Exportar monta um zip para entregar ao suporte e o baixa pelo navegador; o
feed de ações responde "Pacote de suporte criado:" seguido do nome do arquivo
(`ganter-support-<stamp>-<id>.zip`), ou "O pacote de suporte falhou:" seguido do motivo. Ele precisa
de **Exportar/importar históricos**, como toda exportação. O
pacote contém:

| Entrada | Conteúdo |
| --- | --- |
| `recent-console.json` | As entradas do feed em memória como registros estruturados (todo campo de toda entrada, não a visão filtrada). |
| `logs/ganter-lab-*.log` | Os arquivos de log rotativos normais. |
| `diagnostic-captures/ganter-temporary-diagnostic-*.log` | Os arquivos de captura detalhada. |
| `manifest.json` | Quando ele foi gerado, o estado da captura (ativa, iniciada, termina, parada, nome do arquivo), quantas entradas do feed foram incluídas, os limites, a lista de arquivos incluídos com os seus tamanhos, e toda omissão com o seu motivo. |

Os arquivos são tomados do mais novo para o mais antigo dentro de um orçamento: no máximo 8
arquivos, no máximo 24 MB por arquivo e 96 MB no total; um arquivo maior que a sua cota entra apenas
pelo fim (os seus bytes mais novos) e o manifesto diz isso. O zip é montado na pasta temporária do
sistema e excluído assim que o download é servido.

## O painel de detalhes {#the-detail-panel}

Selecionar uma entrada abre o painel com o distintivo da severidade, "Área · Componente" e um xis de
fechar e, em seguida:

| Seção | Campo | Conteúdo |
| --- | --- | --- |
| Cabeçalho | Instante | Data e hora completas com milissegundos. |
| Cabeçalho | Mensagem | A mensagem de uma linha. |
| CONTEXTO | Área | O subsistema. |
| CONTEXTO | Componente | O produtor concreto. |
| CONTEXTO | Origem do registro | A categoria de logger por trás da entrada, mostrada quando conhecida. |
| CONTEXTO | Nível | A palavra do chip do nível: Informação, Aviso ou Erro. Debug nunca aparece, porque nenhuma entrada abaixo de Informação entra no feed. |
| CONTEXTO | Dispositivo, Tag, Operação, Cliente, Sessão, Unidade, Procedimento, Execução | Cada um mostrado só quando a entrada o carrega: o dispositivo e o tag a que uma linha do conector se refere, a operação em diagnóstico (uma leitura, uma escrita, uma conexão), o cliente e a sessão OPC ou de protocolo, e a unidade, o procedimento e o id da execução do Process. |
| DETALHES | | O texto da exceção e o stack trace, quando a entrada carregava um. |

**Copiar a entrada**, no pé, copia o painel inteiro como texto (a linha de cabeçalho, a mensagem, uma
linha "Rótulo: valor" por campo de contexto e, em seguida, o bloco de detalhe) e responde "Entrada
copiada para a área de transferência." A seleção é descartada se a entrada sair do buffer, e é
limpa por Limpar a visão.

## Exportar {#export}

**Exportar como CSV…** e **Exportar como JSON…** gravam as linhas visíveis no momento (a visão
filtrada) como um download do navegador chamado `app-logs-<yyyyMMdd-HHmmss>.csv` ou `.json`; o feed
de ações responde "Exportadas N linhas para" seguido do nome do arquivo. Os dois carregam as
mesmas colunas, nesta ordem: `Timestamp` (encabeçada "Timestamp (UTC-03:00)" no CSV, a referência
de tempo declarada uma vez), `Severity`, `Area`, `Component`, `Logger`, `Device`, `Tag`,
`Operation`, `Client`, `Session`, `Unit`, `Procedure`, `RunId`, `Message` e `Exception`. O JSON é um
envelope, `{ "TimeZone": "...", "Entries": [ ... ] }`. Uma célula de CSV que começa com `=`, `+`,
`-` ou `@` recebe um apóstrofo na frente para que a planilha a leia como texto.

## A linha de status {#the-status-line}

"N mostradas · M no buffer" e, em seguida, " · filtrado" enquanto qualquer filtro de busca, área,
componente ou nível está em vigor; à direita, "1 selecionada" enquanto uma entrada está selecionada
e "Atualizado hh:mm:ss", a hora da entrada mais recente do buffer, já ao abrir a página. Quando nada casa, a lista diz "Nenhuma
entrada combina com os filtros atuais. Ajuste o nível, a área, o componente ou a busca para ver mais."

## O que o Console não faz {#what-console-does-not-do}

- Ele não é um registro: guarda 500 entradas em memória, as perde no reinício, e Limpar a visão o
  esvazia para todo mundo. O registro durável são as três linhas do tempo e, em disco, os arquivos
  de log rotativos.
- Ele não mostra nada abaixo de Informação, e nunca o detalhe de protocolo; é para isso que serve
  uma captura detalhada.
- Limpar a visão não exclui arquivo nenhum nem linha nenhuma do diário, é recusado enquanto o runtime
  está parado, e é desenhado apenas para um papel que pode alterar configurações, como Exportar e
  Iniciar a captura ao lado dele.
- A captura detalhada não pode ser esticada além de quinze minutos; inicie outra.
- Exportar grava o que está visível, nunca os arquivos em disco; o pacote de suporte é como os
  arquivos saem da estação.
- Um agente com a área Logs aberta lê esse mesmo feed por `logs_read`
  (veja [Ferramentas](agent-tools)); ele não consegue limpá-lo.
