Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

Índice

Problema

Os sistemas geram logs muito volumosos, de difícil análise e administração, tornando complexa a gestão por parte do cliente.

Para contornar limitações de espaço em disco, normalmente o cliente adota uma destas soluções:

  • configura os logs com nível mínimo de detalhes, para que os arquivos fiquem pequenos;
  • rotaciona e elimina os logs com alta frequência;

Estas soluções levam à perda de informações importantes no momento de análise de um problema.


Cenário comum:

  • o cliente abre chamado reportando um problema, porém não tem o log em nível detalhado, ou então possui log detalhado apenas das últimas horas e não do momento do erro;
  • com isso recebe orientação para aumentar o nível de log e provocar o problema novamente, e isso nem sempre é factível, especialmente em problemas mais graves, como queda de serviços;
  • muitas vezes não é possível reproduzir no ambiente de homologação o problema exato que ocorreu na produção;
  • como consequência, a atuação do suporte fica prejudicada, aumentando o tempo de atendimento, a quantidade de iterações e esforço de investigação, para todos os envolvidos.

Precisamos de uma forma mais robusta de armazenar e consultar logs recentes sem comprometer a operação e minimizando impactos ao usuário final.


Solução proposta

Definir uma configuração para possibilitar gerenciamento ativo dos logs gerados pelo sistema, que possa ser implantado pelo próprio cliente na sua estrutura e utilizado para agilizar análises, consultorias, atendimentos de suporte e situações relacionadas.


Informações

Antes de continuar, veja neste link como o processo funciona: Consulta logs Datasul com Elasticsearch


Escopo

Esta documentação cobre um método para gerenciamento dos logs do Progress 12 PASOE que já utilizamos internamente e recomendamos aos clientes.

A mesma tecnologia pode ser utilizada para qualquer outro tipo de log, como Progress Clientlog, Tomcat, Apache, etc.

Reforçamos que esta não é a única solução que existe, e nem a única forma de fazer. Aqui tivemos a intenção de definir uma solução simples e 100% utilizando software livre. O cliente pode ficar à vontade para experimentar outros tipos de ferramentas.

  • A TOTVS não se compromete com suporte a este serviço (bugs da ferramenta, atualização futura, etc).


setup que propomos utiliza 3 ferramentas que fazem parte do Elastic Stack para coletar, armazenar e consultar os logs:

  • Filebeat - agente que monitora os logs do Datasul e envia continuamente para o banco de dados;
  • Elasticsearch - o banco de dados propriamente dito - coração de todo o stack;
  • Kibana - interface gráfica para aplicar queries sobre o banco e mostrar os resultados;

  • O Elastic Stack possui outras ferramentas, inclusive de Machine Learning, mas neste escopo estamos adotando apenas soluções mais simples e sem custo.


Impacto na estrutura

A única alteração prevista para as máquinas já existentes é garantir que o log do PASOE esteja sendo gerado com alto nível de detalhes, e rotacionado dentro de um tempo adequado para impedir risco de estouro de disco.

Já para o Elastic Stack, recomendamos a criação de uma nova Virtual Machine, para concentrar todas as configurações e isolar todos os processos, evitando qualquer risco de desestabilização dos sistemas já existentes.


Configurar nível de log do PASOE

Seguir as recomendações deste link: https://centraldeatendimento.totvs.com/hc/pt-br/articles/10403011775255-Framework-Linha-Datasul-TEC-Alterar-o-n%C3%ADvel-de-log-do-PASOE


Rotacionamento dos logs do PASOE

Na máquina onde o PASOE é executado, configure uma rotina (exemplos completos mais abaixo) para executar periodicamente o comando de rotacionamento do log.

Mais detalhes neste link: https://centraldeatendimento.totvs.com/hc/pt-br/articles/18741602158999-Framework-Linha-Datasul-TEC-Como-rotacionar-logs-do-PASOE


Abaixo seguem exemplos dos scripts que utilizamos internamente na Totvs, que podem ser customizados conforme a sua necessidade. O que essa versão faz:

  • Rotaciona os logs PASOE quando excedem o tamanho de 20 MB
  • Eliminam o histórico de logs rotacionados quando atingem 60 minutos sem alteração


Linux

Opcionalmente, recomenda-se editar no arquivo <$DLC>/servers/pasoe/bin/tcmanager.sh a variável _subdir conforme abaixo, para criar as pastas de rotacionamento no formato AAAA-MM-DD_HH-MM-SS, tornando mais fácil a identificação:

Próximo a linha 2821, trocar:

        _subdir="`date +"%m-%d-%Y-%H%M%S"`"

por

        _subdir="`date +"%Y-%m-%d_%H-%M-%S"`"


Baixar e salvar o arquivo quebrar_log_pasoe_linux.sh na sua estrutura, por exemplo:

/opt/totvs/scripts/quebrar_log_pasoe_linux.sh


Configurar chamada periódica na cron do Linux (crontab -e) conforme sua necessidade. Exemplos:

  • 0 * * * * /opt/totvs/scripts/quebrar_log_pasoe_linux.sh # de hora em hora
  • * * * * * /opt/totvs/scripts/quebrar_log_pasoe_linux.sh # de minuto em minuto
  • 0,15,30,45 * * * * /opt/totvs/scripts/quebrar_log_pasoe_linux.sh # a cada 15 minutos



Windows

Primeiramente o arquivo <$DLC>\servers\pasoe\bin\tcmanager.ps1 precisa ser atualizado, para corrigir um bug reconhecido pela Progress. Detalhes neste link: https://centraldeatendimento.totvs.com/hc/pt-br/articles/18742185170839-Framework-Linha-Datasul-TEC-The-process-cannot-access-the-file-agent-log-filename-because-it-is-being-used-by-another-process


Baixar e descompactar o arquivo quebrar-log-pasoe-tcman-clean.zip na sua estrutura, por exemplo:

c:\totvs\scripts\quebrar-log-pasoe-tcman-clean.ps1


Configurar Chamada periódica no Windows Task Scheduler conforme sua necessidade (a cada minuto, de hora em hora, 15 em 15 minutos, etc), exemplo:




Requisitos de hardware para a nova VM do Elastic Stack

Descrevemos aqui a configuração que estamos utilizando internamente para os ambientes de desenvolvimento. Cenários de produção dos clientes podem demandar de configurações diferentes, especialmente no quesito Disco, dependendo do volume de logs e quantidade de tempo que desejar armazená-los.

Recomendamos criar uma nova Virtual Machine exclusiva para este setup, para isolar os processos e garantir que as demais máquinas utilizadas para o sistema não sejam afetadas.

  • Sistema Operacional: Oracle Linux 8 (pode ser outro. Utilizamos este por ser homologado para uso internamente na Totvs).
  • Disco: 500 GB (hoje estamos gerenciando logs de 10 ambientes e mantendo histórico por 7 dias. 500 GB está se mostrando suficiente).
  • Memória: 8 GB (dependendo da quantidade de logs a administrar e usuários que realizarão consultas, pode ser interessante mais memória, para otimizar a performance).
  • Processadores: 4 núcleos (dependendo da quantidade de logs a administrar e usuários que realizarão consultas, pode ser interessante mais núcleos, para otimizar a performance).



Passo a passo para a instalação

Elasticsearch

Instalação

Vamos começar começar pelo banco de dados, que é a parte mais importante de todo o stack. Inicialmente faremos a instalação padrão conforme a documentação da ferramenta (executar os comandos abaixo no prompt do Linux):


1. Garantir que os pacotes estejam atualizados no Sistema operacional:

sudo dnf update -y


2. Adicionar o repositório do Elasticsearch (chave GPG):


3. Criar o arquivo do repositório:

echo "[elasticsearch-8.x]
name=Elasticsearch repository for 8.x packages
baseurl=https://artifacts.elastic.co/packages/8.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md" | sudo tee /etc/yum.repos.d/elasticsearch.repo


4. Instalar o Elasticsearch:

sudo dnf install -y elasticsearch

Configuração e utilização


Neste momento vamos configurar o Elasticsearch. Vamos usar a abordagem mais simples possível, sem autenticação https (apenas http), visto que todo o escopo fica concentrado na máquina dedicada, sem conexão com o mundo externo. O cliente fica livre para configurar segurança mais avançada, que não será tratada neste documento (consultar a documentação oficial).


15. Vamos editar as configurações no arquivo /etc/elasticsearch/elasticsearch.yml (tenha atenção redobrada com todos os arquivos *.yml, pois erros de identação causam falha de execução. Yml segue o mesmo padrão do python):Atenção especial para estes campos:

path.data: /var/lib/elasticsearch # é neste diretório que os dados serão armazenados, portanto aponte para uma pasta (ou volume) com ao menos 500 GB disponíveis.

path.logs: /var/log/elasticsearch # os logs do elasticsearch serão fundamentais para mitigar quaisquer problemas durante a configuração.

xpack.security.enabled: true # exigir usuário e senha para os outros componentes (kibana e filebeat) conectarem ao banco

xpack.security.enrollment.enabled: false

xpack.security.http.ssl:
    enabled: false

xpack.security.transport.ssl:
    enabled: false


A porta default do Elasticsearch é 9200. Se necessário, altere diretamente no arquivo. Neste setup vamos manter o default.

Exemplo da identação correta no arquivo:


26. Habilitar e iniciar o serviço:

sudo systemctl enable --now elasticsearch

37. Já com o serviço no ar, vamos gerar a senha para o usuário padrão elastic. Esta senha precisará ser usada futuramente nas chamadas à API do Elasticsearch (a senha será solicitada no prompt):

sudo /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic -i


48. O print abaixo mostra o comando para validar se o Elasticsearch está rodando corretamente e o resultado esperado (quando solicitado informe a mesma senha que você definiu acima):


59. Agora vamos criar o usuário usuário kibana_system_user, que será utilizado para o serviço do Kibana comunicar via API com o Elasticsearch.

Execute o comando abaixo no prompt do Linux com curl, informando a senha desejada no lugar de <SENHA>:

-X POST -u elastic -H "Content-Type: application/json" "http://localhost:9200/_security/user/kibana_system_user" -d '{ "password" : "<SENHA>", "roles" : [ "kibana_system" ], "full_name" : "Kibana System User", "enabled": true}'

Exemplo:


610. Em seguida vamos criar o usuário kibana_admin, que será utilizado para fazermos login na interface gráfica do Kibana e realizarmos ações administrativas.

Execute com curl, informando a senha desejada no lugar de <SENHA>:

-X POST -u elastic -H "Content-Type: application/json" "http://localhost:9200/_security/user/kibana_admin" -d '{ "password" : "<SENHA>", "roles" : [ "superuser" ], "full_name" : "Kibana Admin", "enabled": true}'

Exemplo:


Kibana

Instalação

Agora que temos a configuração básica do Elasticsearch, vamos instalar a interface gráfica, pois através dela será mais simples realizar as demais configurações do Elasticsearch.

1. Instalação padrão do Kibana:

sudo dnf install -y kibana

Configuração e utilização


1. Após 2. Após instalado, vamos editar as configurações no arquivo /etc/kibana/kibana.yml:Atenção especial para estes campos:

server.port: 8080 # por default a porta do Kibana é 5601. Aqui internamente optamos por utilizar a 8080 por ser mais adequada ao nosso modelo de redes e segurança.

server.host: "0.0.0.0" # fizemos esta configuração para permitir acesso à interface gráfica à partir de qualquer ponto da rede. Restrinja de acordo com a sua necessidade. #

elasticsearch.username: "kibana_system_user" # usuário que foi criado na etapa anterior para permitir que o Kibana faça login no Elasticsearch para realizar queries e aplicar alterações de configurações.

elasticsearch.password: "<SENHA>" # senha que você definiu para o usuário kibana_system_user. Este setup permite que a senha fique legível no arquivo. Por ser algo controlado na rede interna, isso nos atende. Mas você pode optar por utilizar um formato mais robusto, seguindo a documentação oficial do Kibana, que não vamos tratar neste manual.

Exemplo (no cenário de teste a senha foi criada igual ao nome do usuário):

2


3. Habilitar e executar o serviço:
sudo systemctl enable --now kibana


34. No navegador, acesse http://<servidor|IP>:porta/. Exemplo:

Vamos fazer login com o usuário kibana_admin, que criamos logo acima:


45. A partir deste ponto vamos concentrar as ações na janela Dev Tools:


56. Agora vamos criar a política de ILM (Index Lifecycle Management) expirar-logs-datasul. Ela é responsável por controlar o ciclo de vida dos dados inseridos no Elasticsearch, garantindo que os logs antigos sejam eliminados automaticamente, sem estourar o disco. O exemplo abaixo mantém os logs em estado hot no primeiro dia (usa mais recursos para acelerar as consultas), muda para cold no segundo dia (usa menos recursos de máquina, podendo aumentar o tempo de resposta das consultas) e elimina fisicamente (delete) no sétimo dia. Você pode editar estes valores e usar outras configurações mais avançadas (ver documentação oficial) se desejar guardar os logs por mais dias, ter resposta mais ágil nas consultas, etc.

Cole (edite se necessário) e execute o comando abaixo no Dev Tools:

PUT_ilm/policy/expirar-logs-datasul
{
  "policy": {
    "phases": {
      "hot": {
        "min_age": "0ms",
        "actions": {
          "set_priority": {
            "priority": 100
          }
        }
      },
      "cold": {
        "min_age": "1d",
        "actions": {
          "set_priority": {
            "priority": 50
          }
        }
      },
      "delete": {
        "min_age": "7d",
        "actions": {
          "delete": {
            "delete_searchable_snapshot": true
          }
        }
      }
    }
  }
}

Exemplo:


67. Vamos criar o Index Template pasoe-logs-template. Mais adiante ele será associado ao filebeat para garantir que os logs do PASOE sejam associados à política de ILM expirar-logs-datasul, além de tratar o campo especial keyword, para permitir consulta Case Sensitive nas mensagens.

Cole e execute o código abaixo no Dev Tools:

PUT_index_template/pasoe-logs-template
{
  "index_patterns": ["pasoe-logs-*"],
  "template": {
    "settings": {
      "index": {
        "lifecycle": {
          "name": "expirar-logs-datasul"
        },
        "number_of_shards": 1,
        "number_of_replicas": 0
      }
    },
    "mappings": {
      "properties": {
        "pasoe.message": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above":

256

520
            }
          }
        }
      }
    }
  },
  "priority": 1
}

Exemplo:


78. Agora vamos criar o Ingest Pipeline Pipeline parse_pasoe_logs. Ele será responsável por entender as linhas de log do PASOE e distribuir em campos para simplificar a consulta e monitoramento futuros (será associado ao mecanismo de envio de dados do filebeat mais adiante):

No Dev Tools, vamos colar e executar o conteúdo do arquivo parse_pasoe_logs.txt:


89. Agora vamos criar o usuário usuário filebeat, que será utilizado em seguida para que o serviço do Filebeat consiga conectar à api do Elasticsearch com permissões para enviar novos dados.

No Dev Tools, colar e executar o comando abaixo, informando a sua senha desejada no lugar de <SENHA>:

POST/_security/user/filebeat
{
  "password": "<SENHA>",
  "roles": [
      "filebeat_writer",
      "read_ilm",
      "monitoring_user"
 "superuser"
  ],
  "full_name": "Filebeat User"
}

Exemplo:

Image Removed


Filebeat

Neste momento já temos o Elasticsearch (banco de dados) e o Kibana (interface gráfica) configurados, prontos para receber logs do PASOE já no formato desejado. Na sequência, vamos instalar o filebeat, que irá monitorar os logs desejados e enviar em tempo real para o banco de dados.

Informações

A documentação oficial sugere que o filebeat seja instalado na mesma máquina onde os logs são gerados (no nosso caso, máquina do PASOE), e enviar os dados via rede para a máquina do Elasticsearch.

Para a realidade do Datasul entendemos que esta não é a melhor abordagem, pois conforme já mencionado, optamos por isolar todos os novos processos em uma VM apartada, sem afetar a estrutura já existente para o Datasul.

Portanto, nesta configuração estamos propondo a instalação do Filebeat na mesma máquina dedicada ao Elastic Stack, buscando os logs da máquina do PASOE via compartilhamento de rede.

Instalação


1. Instalar o filebeat:

sudo dnf install -y filebeat

Exemplo:

Configuração e utilização


12. Antes de prosseguir, garanta que a sua VM do Elastic Stack consegue ler os logs do PASOE pela rede.

Exemplo:

Aqui internamente mapeamos a pasta no /etc/fstab:

Informações

No nosso cenário interno foi necessário:

  • compartilhar previamente via samba a pasta original dos logs no servidor do PASOE;
  • instalar cifs-utils na VM do Elastic Stack (sudo dnf install -y cifs-utils)

Validação do acesso aos logs originais via rede:


23. Agora vamos editar as configurações no arquivo /etc/filebeat/filebeat.yml. Este arquivo é um pouco mais complicado que os demais, vamos explicar por partes. Reforçando, tenha atenção redobrada com a identação:

3.1. Configuração dos logs do PASOE a serem monitorados e enviados para o Elasticsearch:

filebeat.inputs:

- type: filestream

  id: datasul_squad_120

  enabled: true

  paths:
    - /mnt/es-pasoe-lnx_pasoe-logs/datasul_squad_120.log
  fields:
    environment: datasul_squad_120

  fields_under_root: true

  encoding: iso-8859-1

No exemplo acima estamos monitorando um log chamado datasul_squad_120.log. Estamos usando o mesmo nome para os campos id environment, para simplificar a configuração. Você poderá usar nomes como DESENVOLVIMENTO, HOMOLOGAÇÃO, PRODUÇÃO, etc.


3.2. Agora vamos comentar (ou remover) os parâmetros default referentes a módulos nativos do filebeat, visto que não existe módulo pronto para o template do PASOE, e utilizaremos um criado por nós.

Vamos também adicionar a propriedade setup.template.enable: false, justamente para o filebeat não tentar criar um template automaticamente, e respeitar o nosso: 

  #filebeat.config.modules:

  #path: ${path.config}/modules.d/*.yml

  #reload.enabled: false

  #setup.template.settings:

  #  index.number_of_shards: 1

setup.template.enabled: false


3.3. Agora vamos configurar o envio de dados para o Elasticsearch:

output.elasticsearch:

  hosts: ["localhost:9200"]

  index: "pasoe-logs-%{[environment]}-%{+yyyy.MM.dd}"

  pipeline: parse_pasoe_logs

  preset: balanced

  username: "filebeat"

  password: "filebeat"

No exemplo acima o Elasticsearch está na mesma máquina que o Filebeat, e na porta default, portanto mantemos o valor localhost:9200.

No campo index estamos definindo o template para a nomenclatura dos dados quer serão criados no Elasticsearch, que será: sempre começar com pasoe-logs-, seguido do nome do ambiente (variável que tratamos acima) e a data. Se você optar por mudar este padrão, terá que replicar a mudança em todas as configurações explicadas mais adiante.

No pipeline informamos parse_pasoe_logs, que é o identificador do pipeline de ingestão de dados que já criamos.

No username e password informamos as credenciais que criamos anteriormente para o Filebeat conseguir conectar à api do Elasticsearch com permissões para criação de dados.


3.4. Ao final do arquivo, vamos adicionar as configurações para geração de logs, que serão úteis em caso de problemas:

logging.level: info
logging.to_files: true
logging.files:
  path: /var/log/filebeat
  name: filebeat
  keepfiles: 7
  permissions: 0644


4. Agora que a configuração está concluída, vamos habilitar e inicializar o serviço, que irá começar a enviar imediatamente dados para o Elasticsearch:

sudo systemctl enable --now filebeat


5. Se o log do PASOE estiver sendo movimentado, em alguns segundos já será possível verificar a criação do indice pela tela Dev Tools:

get_cat/indices

Exemplo:

Image Added


6. Confirmação que o indice criado respeitou o template e IML desejados:

GET/pasoe-logs-datasul_squad_120-2025.02.06/_settings

O ILM é configurado no template. Visto que o indice reconheceu o nome correto da política de IML, a configuração está correta:

Image Added



Configurar a visualização dos dados no Kibana

Agora que os dados já estão sendo gravados no banco de dados, vamos configurar a interface gráfica para visualização dos logs.


Entrar na tela Discover e selecionar a opção Create data view:

Image Added


Data View

Data View é o componente que permitirá configurar uma tela para consultar dados de um determinado log.

Se você configurar o processo para tratar logs de mais de um ambiente, por exemplo, desenvolvimento, homologação e produção, então você criará um Data View para cada ambiente:

Image Added

No exemplo acima, o name do Data View é SQUAD_120_DATASUL, mas poderia ser por exemplo DESENVOLVIMENTO, HOMOLOGAÇÃO, PRODUÇÃO, etc.

No campo Index pattern tenha atenção para colocar o prefixo correto do log desejado, deixando * no final. Isso fará com que ele reconheça automaticamente os novos indices que serão gerados diariamente com um nome novo, contendo a data, e consiga mostrar de forma consolidada. Veja que na medida em que você vai digitando, a tela vai filtrando na parte direita os indices reconhecidos pelo padrão definido.

Informações

Indice (ou index) é o conceito que o Elastic Stack utiliza para identificar um contexto dentro do banco de dados.

Podemos interpretar que cada indice é uma tabela do banco, que possui dados referentes a uma fonte pré-definida, no caso, o log PASOE do ambiente desejado.

Mantenha timestamp field com o valor default "@timestamp".


Agora que o Data View está configurado, a tela já está exibindo os dados dos logs em um formato padrão, que iremos refinar a seguir:

Image Added


Vamos configurar as colunas para melhor interpretarmos os logs do PASOE. Isso não é uma regra fixa, você pode editar como preferir. Este é o modelo que utilizamos internamente:

Use o campo de pesquisa para encontrar os campos desejados, que vão aparecendo na lista da direita na medida em que são selecionados.

Campos recomendados:

  • @timestamp: campo fixo e obrigatório, não pode ser retirado
  • pasoe.pid: Process ID do processo do PASOE no Sistema Operacional
  • pasoe.tid: Thread ID da sessão
  • pasoe.writer: componente do PASOE que escreveu a mensagem
  • pasoe.message: texto da mensagem

Image Added


Explore os recursos de configuração da tela para tornar a visibilidade mais aderente à sua necessidade:

Image Added


Salve a sua configuração com um nome significativo, para não precisar repetir os passos acima no próximo acesso:

Image Added


Para finalizar, recomenda-se criar um usuário com permissões restritas à consulta, para possibilitar aos times utilizarem a ferramenta sem riscos de perda de configurações.

Entre na opção Stack Management:

Image Added


Vamos criar uma role (privilégio) restrita apenas à consulta de logs.

entre na opção RolesCreate role:

Image Added


Aqui chamei a role de consulta:

Image Added


Mais abaixo na permissão do Elasticsearch, informei apenas * (asterisco) no padrão de índices, para garantir acesso a todos, e read no campo Privileges:

Image Added


Abaixo, na permissão do Kibana, clicar em Assign to space:

Image Added


No cenário atual temos apenas a Space Default (space é um conceito que não vamos abordar neste manual. Consulte a documentação oficial do Kibana se desejar criar spaces para diferenciar tipos de consulta, níveis de acesso, etc).

Associar a space Default, e abaixo habilitar Read apenas para a opção Analytics / Discover, deixando todo o restante desativado:

Image Added


Agora que a role está criada, entre no menu Users e solicite para criar um novo usuário:

Image Added


No exemplo, o usuário se chama consulta, e recebe apenas o priviégio (role) consulta:

Image Added


Recomenda-se também alterar o campo defaultRoute nas Advanced Settings, informando /app/discover. Com isso, ao fazer novo login o usuário será direcionado automaticamente para a tela de consulta de logs, reduzindo dúvidas:

Image Added


Agora, ao logar com o usuário consulta, os menus administrativos e opções de alteração de configurações não ficam disponíveis:

Image Added


Exemplos de utilização

Informações

Consulte neste link casos de utilização da ferramenta: Consulta logs Datasul com Elasticsearch