Qual é o logger C ++ thread-safe mais eficiente? [fechadas]


85

Estou trabalhando em um aplicativo multi-thread de desempenho crítico. Eu olhei para o registro de rlog, Ace e Boost. Escolhi rlog porque li que é o mais rápido (quando o log está desabilitado, ele tem menos overhead).

O problema que tenho é que mostra o nome do arquivo, o número da linha, etc., mesmo no modo de liberação. Se você puder me dizer como desligar essas informações, meu problema pode ser resolvido. Em qualquer caso, qual é o logger mais eficiente em C ++ para minha situação?


23
Estou chegando rapidamente à conclusão de que boost tem tudo. Mesmo que não apareça, terá aparecido quando você olhar de novo!
— Martin Beckett

21
Não consigo ver porque está fechado. Ele fez uma pergunta específica e mensurável. Se negligenciarmos qual compilador está sendo usado, pode haver apenas um "logger C ++ thread-safe mais eficiente". Stackoverflow nos dias de hoje ....
— JohnJohn


1
Consulte também github.com/gabime/spdlog
— maxik

Respostas:


35

Infelizmente, não posso votar contra ele no momento. Tanto quanto posso dizer, nunca use porcarias como o Apache log4cxx. Ele contém bugs graves.

  1. A última versão do branch 0.9 é 0.9.7 e ainda contém vazamentos de memória porque cada classe com membros virtuais não tem dtor virtual.
  2. A versão mais recente 0.10.x perdeu muitas funcionalidades da 0.9.xe não é compatível com versões anteriores. Você é forçado a reescrever muito do seu próprio código.
  3. Todo o projeto parece não ter manutenção. O lançamento de 0.11.xx foi anunciado há 2 anos.

Na minha opinião, você deve ir com impulso.


10
“toda turma com membros virtuais não tem dtor virtual” não acreditou e teve que verificar. Apache bastante decepcionante.
— ManuelSchneid3r,

6
Você pode votar negativamente agora :)
— Financiar o processo de Monica em

5
>> "toda aula com membros virtuais não tem dtor virtual" Embora isso não seja maravilhoso, não significa que cause problemas. É um problema apenas se as classes são excluídas por seu tipo dinâmico em vez de seu tipo estático. Isso, por si só, não é um problema e não significa que nenhuma memória foi perdida.
— evilrix de

2
@evilrix As classes têm membros virtuais, mas nenhum dtor virtual. As classes não têm novos operadores protegidos / privados. Na verdade, este é um código muito pobre e ruim que nunca deveria ter sido lançado. Então, qual é o seu ponto?
— kirsche40

@ kirsche40 Achei que meu ponto estava bem claro. Qual parte da minha explicação de como o padrão é redigido você não entendeu? Permita-me reformular: é um problema se você tentar excluir por meio de um ponteiro de classe base. Nesse caso, se o destruidor não for virtual, o comportamento é indefinido. O padrão é incomumente claro neste ponto. Tenho certeza de que nada do que eu disse implica que estou defendendo que o OP usa isso como uma implementação.
— evilrix

19

Pantheios é considerada a biblioteca de registro C ++ de melhor desempenho , além de ser a única 100% segura (consulte este artigo sobre uma biblioteca relacionada explicando por que as bibliotecas baseadas em printf () / iostream não são de tipo seguro)


4
E mesmo que eles não gostem da Pantheios, a lista de 'concorrentes' na página que você vinculou é informativa.
— jwd

10

Tive sucesso com log4cxx em http://logging.apache.org/log4cxx/index.html . É uma versão C ++ do popular logger Log4j, fácil de configurar por meio de um arquivo conf ou no código. A sobrecarga quando está desabilitada é mínima (chamada de método e comparação de inteiro).

O padrão para a saída do log é definido por um padrão de conversão que pode ser tão simples quanto a data / hora e uma mensagem. Ele também lida com limitação de tamanho de arquivo, rollover, etc. Você também pode configurar diferentes padrões para vários erros e fontes.


9

Aqui está como você pode desligar as informações extras que o rlog fornece (como nome do arquivo, número da linha, etc.). Ao inicializar o rlog em sua main()função (ou qualquer outro lugar), você pode fazer o seguinte:

rlog::RLogInit(argc, argv);
rlog::StdioNode slog (2, rlog::StdioNode::OutputColor);
slog.subscribeTo( RLOG_CHANNEL("error") );

O segundo argumento para StdioNodeé para que os sinalizadores controlem a saída. Verifique a documentação rlog (pode ser gerada com Doxygen) para a lista completa de possíveis sinalizadores. Aquele no exemplo aqui faz com que o rlog apenas colore a saída de acordo com a gravidade, sem qualquer outra informação adicionada.


9

Você pode querer considerar o sistema de logog. logog oferece exatamente esse tipo de funcionalidade, mas não tem as dependências de código implícitas que o Pantheios possui. logog é thread-safe e permite um alto grau de controle sobre quais tipos de mensagens são registradas em qualquer ponto.

Sou o autor e mantenedor do logog, então minha opinião é um pouco tendenciosa. Mas eu revisei rlog, Pantheios e outros sistemas de registro antes de implementar este.

https://github.com/johnwbyrd/logog .


Link atualizado, obrigado pela nota.
— johnwbyrd

4

Algumas das sobrecargas podem acontecer em suas macros / fluxos. Você precisa ter muito cuidado para não compor a string sendo registrada quando o registro está desabilitado.

O uso inteligente de fluxos e do operador?: Permite que você faça isso, assim como as macros.




2

experimente a lib c-log, https://github.com/0xmalloc/c-log , uma biblioteca de log rápida, estável e thread-safe para a linguagem C / C ++.


9
Infelizmente, o c-log está sob GPL, o que significa que você não pode usá-lo com software não compatível com GPL (por exemplo, comercial proprietário). Isso o torna inutilizável para muitos usuários.
— chris de

agora não há LICENÇA em github.com/0xmalloc/c-log É grátis para uso comercial e pessoal.
— user2538508

3
Você é o autor do c-log? Em caso afirmativo, sugiro que você declare explicitamente (na página do Github, o arquivo leia-me e comentários no código-fonte) sob qual licença seu software é lançado. Mesmo que seja de domínio público (o que eu não recomendo!), Você deve declarar isso explicitamente. Dito isso, existem muitas licenças de código aberto "amigáveis ​​para o comércio" (ou seja, permissivas) para escolher - as mais populares são Apache, BSD ou MIT.
— chris

Apenas Linux? ( #include <pthread.h>...)
— rustyx
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.