Skip to content

Adiciona o logger v2 para criar arquivos de log de nome único e que não rotacionam internamente#13

Open
gabrielferreira-gaudium wants to merge 4 commits intodevfrom
topic-simplica-arquivos-log
Open

Adiciona o logger v2 para criar arquivos de log de nome único e que não rotacionam internamente#13
gabrielferreira-gaudium wants to merge 4 commits intodevfrom
topic-simplica-arquivos-log

Conversation

@gabrielferreira-gaudium
Copy link

MchLogToolkitGo - Logger v2

Descrição

Adiciona ao MchLogToolkitGo uma versão atualizada do logger (chamada v2) na qual os arquivos gerados de um tipo (parâmetro subject) são chamados /<subject>/<subject>.log. Por ex., para o tipo "error", o arquivo será: /error/error.log.

Com essa alteração, não mais serão gerados múltiplos arquivos de log de cada tipo, e a rotação de logs não será mais feita internamente pelo MchLogToolkitGo.

É possível determinar a versão do logger a ser utilizada a partir da função pública SetVersion().

A estrutura dos arquivos foi levemente modificada:

  • mchlogcoreV1/mchlogV1.go : Exatamente o mesmo código do logger atual (o que reside em mchlogcore/mchlog.go)
  • mchlogcoreV2/mchlogV2.go : Versão atualizada do logger
  • mchlogcore/mchlog.go : Agora serve para configurar qual a versão do logger deve ser utilizada

Tipo de Mudança

  • Correção de Bug: Esta alteração resolve um problema existente no projeto.
  • Nova Funcionalidade: Adição de uma nova funcionalidade que enriquece o projeto.
  • Melhoria de Código: Refatoração que melhora a performance ou legibilidade do código sem alterar funcionalidades.
  • Breaking Change: Alteração significativa que afeta a compatibilidade com versões anteriores, requerendo atenção especial durante a integração.
  • Internacionalização e Localização: Adição ou melhoria no suporte de múltiplos idiomas ou adaptações regionais.
  • Desempenho: Melhorias que aumentam a eficiência e velocidade do sistema.
  • Segurança: Correções ou melhorias que aumentam a segurança do projeto.
  • Dependências: Atualizações ou adições em bibliotecas e pacotes externos.
  • Testes: Adição ou melhoria nos testes do projeto, incluindo testes unitários, bdd, etc.
  • Infraestrutura/DevOps: Mudanças relacionadas à configuração de infraestrutura, CI/CD, ferramentas de desenvolvimento, alteração de config etc.

Checklist

  • Testei o código localmente
  • Revisei o código (self-review)
  • Comentei meu código, especialmente em áreas difíceis de entender
  • Fiz alterações correspondentes na documentação
  • Minhas alterações não geram novos warnings
  • Novos e existentes testes unitários passam localmente com minhas alterações
  • Chequei se o PR cumpre os critérios de aceitação da issue relacionada

Como testar as alterações

Ao testar um um serviço que use o novo logger, ao inicializar o serviço, a primeira mensagem em /applog/<serviço>/info/info<?>.log deve ser a versão do logger utilizada.

Pelo nome dos arquivos de log gerados nas pastas dentro de /applog/<serviço>/ do serviço, é possível determinar a versão do logger também.

Impactos no Deploy

Importante adicionar aos microsserviços que usarem este logger com a implementação atual uma flag no arquivo .conf para determinar a versão (v1 ou v2); sendo a padrão a v1.

Dependências

Não há.

Issues

Não há.

Observações Adicionais

Não há.

@gemini-code-assist
Copy link

Summary of Changes

Hello @gabrielferreira-gaudium, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

Este pull request introduz uma nova versão do sistema de logging, o Logger V2, que visa otimizar a forma como os arquivos de log são gerados e gerenciados. Ao invés de múltiplos arquivos rotacionados internamente, a V2 cria um arquivo único por tópico, simplificando a estrutura e a manutenção. A mudança é implementada de forma a permitir a escolha entre a versão original (V1) e a nova (V2), garantindo compatibilidade e flexibilidade para os serviços que utilizam a biblioteca.

Highlights

  • Introdução do Logger V2: Foi adicionada uma nova versão do logger (V2) que simplifica a gestão de arquivos de log, criando um único arquivo por 'subject' (tópico) sem rotação interna.
  • Refatoração da Versão Original (V1): A implementação original do logger foi movida para um novo pacote e arquivo (mchlogcoreV1/mchlogV1.go), preservando sua funcionalidade e permitindo a coexistência com a V2.
  • Mecanismo de Seleção de Versão: O arquivo mchlogcore/mchlog.go foi refatorado para atuar como um 'facade' ou dispatcher, permitindo que os usuários selecionem qual versão do logger (V1 ou V2) desejam utilizar através da função SetVersion().
  • Nomenclatura Simplificada de Arquivos de Log: A V2 adota uma convenção de nomenclatura de arquivos de log mais simples, onde os logs para um determinado 'subject' são armazenados em /<subject>/<subject>.log, eliminando o IP e o timestamp do nome do arquivo.

🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Changelog
  • mchlogcore/mchlog.go
    • Transformado em um dispatcher para as versões V1 e V2 do logger.
    • Removida toda a lógica de logging, manipulação de arquivos e obtenção de IP, que foram movidas para os pacotes mchlogcoreV1 e mchlogcoreV2.
    • Adicionada a enumeração LogVersion (V1, V2) e a função SetVersion() para alternar entre as implementações.
    • Os métodos LogSubject, GetFileNameFromStreamName e GetIP agora delegam suas chamadas para a versão do logger atualmente selecionada.
  • mchlogcoreV1/mchlogV1.go
    • Novo arquivo adicionado, contendo a implementação completa do logger original (anterior a este PR).
    • Preserva a funcionalidade de logging com rotação de arquivos baseada em timestamp e inclusão de IP no nome do arquivo.
  • mchlogcoreV2/mchlogV2.go
    • Novo arquivo adicionado, contendo a nova implementação do Logger V2.
    • Implementa a criação de arquivos de log de nome único por 'subject' (/<subject>/<subject>.log), sem rotação interna.
    • Remove a inclusão de IP e timestamp do nome do arquivo de log.
    • Otimiza a gestão de arquivos de log através de um cache de loggers, evitando a abertura e fechamento repetidos de arquivos.
Activity
  • O autor gabrielferreira-gaudium criou este pull request para adicionar o Logger V2, conforme descrito no título e corpo do PR.
  • O pull request foi marcado como 'Nova Funcionalidade' e 'Desempenho', indicando a adição de novos recursos e melhorias de eficiência.
  • O autor realizou testes locais e uma auto-revisão do código, garantindo a qualidade inicial da implementação.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

Este pull request introduz uma nova versão (v2) do logger, que simplifica a nomenclatura dos arquivos de log e remove a rotação interna, ao mesmo tempo que mantém a versão antiga (v1) para retrocompatibilidade. A arquitetura utiliza um padrão Facade para alternar entre as versões.

A refatoração é bem-vinda e a nova implementação v2 é mais simples e performática ao evitar a comunicação por canais e ao fazer cache dos loggers.

No entanto, identifiquei alguns pontos críticos que precisam de atenção:

  • Segurança de Concorrência (Race Condition): A forma como a versão do logger é selecionada através de uma variável global (currentVersion) não é segura para uso em goroutines concorrentes, o que pode levar a comportamento inesperado ou pânico.
  • Tratamento de Erros: A nova implementação v2 pode descartar logs silenciosamente se houver uma falha ao abrir o arquivo de log, o que é um comportamento arriscado para um sistema de logging.
  • Permissões de Arquivo: A implementação v1 (que foi movida) utiliza permissões de arquivo e diretório inseguras, o que foi corrigido na v2. Seria bom aplicar a mesma correção na v1 para consistência e segurança.

Detalhei esses pontos nos comentários específicos no código. No geral, as mudanças são positivas, mas os problemas de concorrência e perda de logs precisam ser resolvidos antes do merge.

Comment on lines +18 to 24
var currentVersion = V1

// fileStreamType é usado na comunicação por canal
type fileStreamType struct {
filename string
subject string
chReturn chan fileLogType
// SetVersion chooses which version to use (V1 or V2).
// This should ideally be called before InitializeMchLog.
func SetVersion(v LogVersion) {
currentVersion = v
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

critical

A variável global currentVersion é acessada e modificada por múltiplas funções (SetVersion, LogSubject, InitializeMchLog, etc.) sem qualquer tipo de sincronização. Isso cria uma condição de corrida (race condition) em um ambiente com múltiplas goroutines. Por exemplo, se uma goroutine chama SetVersion enquanto outra chama LogSubject, o comportamento é indefinido e pode causar pânicos.

Para corrigir isso, o acesso à variável currentVersion deve ser protegido por um mutex (como sync.RWMutex).

Exemplo de correção:

import "sync"

var (
	currentVersion = V1
	versionMutex   sync.RWMutex
)

func SetVersion(v LogVersion) {
	versionMutex.Lock()
	defer versionMutex.Unlock()
	currentVersion = v
}

// Nas outras funções que leem currentVersion:
func (l *LogType) LogSubject(...) {
    versionMutex.RLock()
    version := currentVersion
    versionMutex.RUnlock()

    if version == V1 {
        // ...
    } else {
        // ...
    }
}

Considerando que a versão deve ser definida idealmente antes da inicialização, uma alternativa mais segura seria remover a função SetVersion e passar a versão como parâmetro para InitializeMchLog, evitando o estado global mutável.

Comment on lines +110 to +113
f, err := os.OpenFile(filename, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0664)
if err != nil {
return
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

Se os.OpenFile falhar (por exemplo, por falta de permissão ou disco cheio), a função retorna silenciosamente (return). Isso faz com que a mensagem de log seja perdida sem qualquer indicação do problema. Isso é perigoso, pois a aplicação pode estar falhando em registrar logs importantes sem que ninguém perceba.

A implementação V1 possuía um fallback para logar o erro no console. A V2 deveria ter um comportamento semelhante, logando o erro de abertura do arquivo no stderr para garantir que a falha seja visível. Para isso, será necessário importar o pacote github.com/rs/zerolog/log.

f, err := os.OpenFile(filename, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0664)
if err != nil {
    log.Error().Err(err).Str("filename", filename).Msg("mchlogcoreV2: falha ao abrir arquivo de log")
    return
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants