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.