O contexto: estamos trabalhando em um aplicativo multithread (Linux-C) que segue um modelo de pipeline.
Cada módulo possui um encadeamento privado e objetos encapsulados que processam dados; e cada estágio possui uma forma padrão de troca de dados com a próxima unidade.
O aplicativo está livre de vazamento de memória e é seguro para threads usando bloqueios no ponto em que eles trocam dados. O número total de threads é de cerca de 15 - e cada thread pode ter de 1 a 4 objetos. Criar cerca de 25 a 30 objetos estranhos, todos com alguns registros críticos a serem feitos.
A maioria das discussões que eu vi sobre diferentes níveis, como no Log4J e em outras traduções. A grande questão é sobre como o registro geral deve realmente acontecer?
Uma abordagem é toda exploração madeireira local faz fprintf
para stderr
. O stderr é redirecionado para algum arquivo. Essa abordagem é muito ruim quando os logs se tornam muito grandes.
Se todos os objetos instanciarem seus loggers individuais - (cerca de 30 a 40 deles), haverá muitos arquivos. E, ao contrário do descrito acima, não se tem a ideia da verdadeira ordem dos eventos. O registro de data e hora é uma possibilidade - mas ainda é uma bagunça para agrupar.
Se houver um único padrão de logger global (singleton) - ele bloqueia indiretamente tantos threads enquanto um está ocupado colocando logs. Isso é inaceitável quando o processamento dos threads é pesado.
Então, qual deve ser a maneira ideal de estruturar os objetos de log? Quais são algumas das melhores práticas em aplicativos reais de larga escala?
Eu também adoraria aprender com alguns dos projetos reais de aplicativos de larga escala para obter inspirações!
======
EDITAR:
Com base nas duas respostas, aqui está a pergunta que me resta agora:
Qual é a melhor prática para atribuir loggers (filas de log) ao objeto: eles devem chamar algum global_api () ou o logger deve ser atribuído a eles no construtor. Quando os objetos estão em uma hierarquia profunda, essa abordagem posterior se torna tediosa. Se eles estão chamando algum global_api (), é meio que um acoplamento com o Aplicativo, portanto, tentar usar esse objeto em outro aplicativo gera essa dependência. Existe uma maneira mais limpa para isso?