Biblioteca de log para jogos (c ++) [fechada]

15

Conheço muitas bibliotecas de log, mas não testei muitas delas. (GoogleLog, Pantheios, o próximo impulso :: biblioteca de registros ...)

Nos jogos, especialmente nos jogos multiplayer remoto e multithread, o log é vital para a depuração, mesmo se você remover todos os logs no final.

Digamos que eu esteja criando um jogo para PC (não console) que precise de logs (multiplayer e multithread e / ou multiprocess) e tenho boas razões para procurar uma biblioteca para log (como, não tenho tempo ou estou não confiante em minha capacidade de escrever um corretamente para o meu caso).

Supondo que eu precise:

  1. desempenho
  2. facilidade de uso (permite streaming ou formatação ou algo assim)
  3. confiável (não vaze ou bata!)
  4. multiplataforma (pelo menos Windows, MacOSX, Linux / Ubuntu)

Qual biblioteca de registro você recomendaria?

Atualmente, acho que o boost :: log é o mais flexível (você pode até fazer logon remotamente!), Mas não possui uma boa atualização de desempenho : é para alto desempenho, mas ainda não foi lançado. O Pantheios é frequentemente citado, mas não tenho pontos de comparação em desempenho e uso. Eu uso minha própria biblioteca há muito tempo, mas sei que ela não gerencia multithreading, por isso é um grande problema, mesmo que seja rápido o suficiente. O Google Log parece interessante, só preciso testá-lo, mas se você já comparou essas bibliotecas e muito mais, seu conselho pode ser útil.

Os jogos geralmente exigem desempenho, embora sejam complexos para depuração, por isso seria bom conhecer as bibliotecas de log que, no nosso caso específico, têm vantagens claras.

Klaim
fonte
3
Um requisito que importa que você não mencionou é para o qual pretende usar os logs. Os requisitos para registrar, digamos, mensagens de depuração, métricas para designers, estado dos caracteres para suporte ao cliente e transações com cartão de crédito são diferentes. Em geral, você troca desempenho, facilidade de uso para programadores, facilidade / velocidade de análise offline e durabilidade, dependendo da situação.
Isso mesmo, mas eu estava assumindo que uma solução de log "completa" permitiria aos usuários configurar tipos diferentes de logs como você descreve. Se você achar essa precisão importante na pergunta, seja meu convidado e adicione-a à pergunta.
18711 Klaim

Respostas:

8

log usando socket (qualquer invólucro de soquete pode ser suficiente) + navegador da web websocket => a ferramenta de registro mais versátil e discreta possível, obterá horas de depuração e evitará causar danos aos olhos.

  • assíncrono (velocidade que adia todo o trabalho no navegador)
  • formatado (cor, tamanho etc.)
  • confiável (soquetes ...)
  • multiplataforma (navegador)

Agora, o bônus:

  • filtragem dinâmica feita com muita facilidade (usando regex javascript, se necessário)
  • com histórico de log, memória e comparação (especificação HTML5 no banco de dados "no navegador")
  • Maneira fácil de fazer um gráfico de qualquer dado (usando SVG, tela ou qualquer outra coisa) como memória , fragmentação de memória , etc ...
  • maneira fácil de criar um gráfico 2D de qualquer dado ( subdivisão kd-tree ? campo potencial? ou mesmo apenas uma variação de valor variável? etc ...)
  • permite registro distante (usando o navegador outro computador)
  • usando o html5 no armazenamento do navegador, você pode armazenar os parâmetros da sessão de log (filtros de log atuais, etc.) e até notas sobre cada um)
  • muito fácil criar relatórios de erros ou vincular tickets trac com apenas um clique
  • capacidade de rebobinar o registro facilmente, com uma interface de linha do tempo

e muitas outras tarefas fora do log:

  • permite informações do criador de perfil (gráficos ...)
  • pode até servir como console (enviar comando do navegador) ou até mesmo com GUI rápida usando algum HTML ou até interface do usuário flash
  • diff de imagem no navegador (envie imagem usando soquete e compare no navegador usando recursos de pixel de imagem em tela)
  • etc ...

(quase todas as opções acima podem ser feitas usando soquetes flash, salve os recursos do banco de dados)

Agora eu sei que parece um pouco longo para configurar a coisa. Mas é realmente um ganho de tempo em um projeto longo, com uma situação difícil de depuração (como nos jogos). É a coisa mais poderosa que eu usei desde os depuradores ...

Nota 1: a única desvantagem => verifique o efeito colateral ao depurar o código de rede do jogo (impacto no tamanho do buffer do soquete, latência, largura de banda, etc ...)

Nota 2: alguns broswer desativados por padrão na Web devido a razões de segurança, verifique about: config things para ter certeza de que está ativado.

Tuan Kuranes
fonte
11
Corrija-me se estiver errado, mas isso apenas sugere para onde direcionar a saída de log, não? Uma biblioteca de log real também permitiria filtrar em tempo de compilação (o que é crucial se o desempenho for um problema), formatar e fornecer uma sintaxe fácil de usar para criar mensagens de log.
SBI
@sbi É uma coisa global ligada ou desligada no lado do aplicativo. "Cliente de log do navegador" faz a filtragem, sintaxe, mas sempre obtém todo o log. É radical, mas é baseado na experiência de que durante o desenvolvimento, você deve sempre registrar tudo para poder capturar / reproduzir facilmente quaisquer bugs que encontrar. Se você precisa otimizar, é o lado do navegador novamente: usando o soquete que você não é obrigado a registrar usando a string, é possível registrar diretamente os dados binários (Id + floats), que ficam em negrito mais rápido do que qualquer outra lib de log baseada em strings ... ( ID correspondente ao lado do navegador de string ...)
Tuan Kuranes
11
Embora eu possa ver que isso é muito prático, é realmente apenas o back-end de um criador de logs (o que o templog chama de "coletor de logs", IIRC). O desempenho é um dos requisitos listados. Descobri que preciso adicionar instruções de log a um trecho de código durante a depuração, mas, uma vez instalado, esse trecho de código seria muito falador e afogaria tudo o que estou trabalhando naquele momento e também custaria muito desempenho. Então, eu quero poder ajustar o nível do log em partes inteiras do código, alterando algumas linhas de código. É isso que a camada intermediária de uma biblioteca de log faz por você.
SBI
@sbi: pode exigir benchmarks, mas há chances de que a melhor biblioteca de log, mesmo no nível mais baixo, ainda lhe custe mais do que um log binário que registra tudo. Não há sequer um único ciclo de CPU "binário para char" desperdiçado ... Portanto, é realmente mais recurso E mais desempenho.
Tuan Kuranes
Antes de decidirmos realmente usar o templog, fizemos alguns testes. Se o log estiver desativado para a gravidade, origem ou outros enfeites de uma mensagem de log específica, e se o compilador puder descobrir que não há efeitos colaterais na avaliação dos parâmetros, o VC poderá realmente otimizar um declaração de log em nada. E quando se trata de velocidade, você não vai vencer o código que não existe para ser executado em primeiro lugar.
SBI
8

Quando se trata de desempenho, achei o templog praticamente invicto. Ele usa modelos de expressão para adiar a avaliação das instruções de log até que seja estabelecido que as informações serão registradas. Como você também pode desativar parcialmente o log (dependendo da gravidade, origem e público-alvo de uma mensagem de log), algumas dessas instruções de log podem ser eliminadas no código zero pelo compilador para compilações de versão. (Na verdade, eu vi isso acontecer com o VC.)

Não havia muito o que fazer na biblioteca recentemente, e outras pessoas no SO descobriram que o porta-mal estava ausente em alguns aspectos, mas em uma empresa em que eu trabalhava, encontramos o cara bastante receptivo e um dos meus colegas de trabalho até obteve acesso de confirmação e adicionou algum código a ele, então você pode achar que vale a pena tentar.

Para enumerar seus requisitos:

desempenho

Melhor que eu encontrei. Especialmente sua capacidade de excluir mensagens de log em tempo de compilação e fazer com que o compilador os eliminasse completamente era muito atraente.

facilidade de uso (permite streaming ou formatação ou algo assim)

Há as horríveis mensagens de erro clássicas do compilador de modelos - meta-coisas quando você faz algo errado, mas quando se trata de facilidade de uso, isso

TEMPLOG_LOG(my_logger,sev_error,aud_support) << "logged in as " << user_name;

é difícil de bater.
No entanto, pode ser necessário criar seus próprios coletores de log (é para onde as mensagens de log vão), pois os poucos pré-empacotados (stderr, arquivo, log do Windows etc.) não são tão sofisticados. Como o desempenho é um objetivo principal, os intrínsecos da coisa toda são um pouco complicados (como formatadores de mensagens de log sendo bastante entrelaçados com sumidouros de logs), mas nós dominamos isso (lembro de percorrê-lo em um depurador ajudando nisso) e uma vez entendeu que não era tão difícil escrever seus próprios formatadores de mensagens ou coletores de log.

confiável (não vaze ou bata!)

Nós o usamos sem encontrar problemas graves. Não há praticamente nenhuma alocação dinâmica de memória, por isso é difícil imaginar que ele esteja fazendo algo errado. Obviamente, nós apenas o testamos no mundo real em um produto.

multiplataforma (pelo menos Windows, MacOSX, Linux / Ubuntu)

Quando o usamos, usamos no Win32, OSX e em várias distribuições Linux diferentes, entre elas o Ubuntu.

Quanto ao multi-threading: não usamos isso, mas pelo que me lembro da arquitetura da lib, parece que você só precisaria lidar com isso nos coletores de logs. ICBWT.

sbi
fonte
Obrigado, eu não conhecia este. Parece uma versão simplificada (e de alto desempenho) do boost :: log, pelo menos na ideia original.
21411 Klaim
@Klaim: Eu acho que o boost não tinha nada a oferecer quando eu olhei pela última vez para as bibliotecas de registro em C ++, então não sei sobre o boost :: log.
sbi
11
@ Joe: Você entende o termo "modelos de expressão" ?
SBI
11
Eu pensei que sim, mas agora baixei e comecei a ler o código fonte do templog, e parece que o C ++ me superou novamente.
11
@sbi: Parte da minha confusão foi sua declaração "passada de uma só vez por várias camadas" - em inglês de uma só vez pode significar imediatamente ou juntos , que neste caso são opostos. Eu li como o primeiro, e você (agora obviamente para mim) foi o segundo. Obrigado por reservar um tempo para explicá-lo.
0

Você pode estar interessado no Baical conjunto de ferramentas :

  • Biblioteca de código aberto e de plataforma cruzada (Win, Linux, x86 / x64) para logs, rastreamentos e telemetria - P7
  • Incrivelmente rápido (projetado para dispositivos incorporados) - 3 milhões de logs por segundo para rede, 5 milhões para arquivo na CPU moderna. Não conheço nenhuma outra biblioteca de registro que ofereça essa velocidade e informações tão detalhadas para cada mensagem de registro.
  • Discussão segura
  • Cada mensagem de rastreamento contém:
    • mensagem de texto
    • nível
    • tempo preciso (100ns)
    • arquivo de origem, nome da função e linha
    • ID do módulo e nome do módulo
    • ID e nome do segmento
    • índice de núcleo do processador
  • Aplicativo de servidor para receber e visualizar logs e telemetria
  • Você pode coletar, analisar, pesquisar e filtrar logs de várias fontes em tempo real
maximu
fonte
A partir de 06/2017,% s na formatação de sequência ainda não é suportada.
Romeno