﷽
→ Último lançamento
→ Registro de alterações
→ Amostras
Visão geral Por que mais uma biblioteca Visão geral dos recursos Começando Download Início rápido Instalar (opcional) Configurando argumentos do aplicativo Configuração Nível Configurar Usando arquivo de configuração Usando a classe el::Configurations Usando configurações em linha Configurações padrão Configurações globais Especificadores de formato de registro Especificadores de formato de data/hora Especificadores de formato personalizado Sinalizadores de registro Argumentos de aplicação Macros de configuração Configurações de leitura Registro Básico Registro Condicional Registro ocasional printf como registro Registro de rede Registro detalhado Básico Condicional e Ocasional Nível detalhado Verifique se o registro detalhado está ativado Módulo VM Registrando novos registradores Cancelar registro de registradores Preenchendo IDs de Logger Existentes Compartilhando repositório de registros Recursos extras Acompanhamento de desempenho Acompanhamento de desempenho condicional Faça uso de dados de monitoramento de desempenho Rotação do arquivo de log Tratamento de falhas Instalando manipuladores de falhas personalizados Stacktrace Multi-threading VERIFICAR Macros Erros de registro() Usando Syslog Registro STL Modelos Suportados Registro Qt Aumente o registro Registro wxWidgets Estendendo Biblioteca Registrando sua própria aula Registrando aula de terceiros Liberando e rolando arquivos de log manualmente Retorno de chamada de envio de registro Retorno de chamada de registro do registrador Registro assíncrono Aulas auxiliares Contribuição Enviando correções Relatando um bug Compatibilidade Matriz de construção Licença Isenção de responsabilidade
Easylogging++ é uma biblioteca de registro eficiente de cabeçalho único para aplicativos C++. É extremamente poderoso, altamente extensível e configurável de acordo com as necessidades do usuário. Ele fornece a capacidade de escrever seus próprios coletores (por meio do recurso conhecido como LogDispatchCallback
). Esta biblioteca é atualmente usada por centenas de projetos de código aberto no GitHub e outros sites de gerenciamento de controle de código aberto.
Este manual é para Easylogging++ v9.97.1. Para outras versões, consulte a versão correspondente no github.
Você também pode estar interessado no servidor de registro de resíduos.
Ir para o topo
Se você estiver trabalhando em um utilitário pequeno ou em um projeto grande em C++, esta biblioteca pode ser útil. É baseado em um único cabeçalho e requer apenas o link para um único arquivo de origem. (Originalmente era apenas cabeçalho e foi alterado para usar o arquivo de origem na edição nº 445. Você ainda pode usar apenas cabeçalho na v9.89).
Esta biblioteca foi projetada com vários pensamentos em mente (ou seja, portabilidade, desempenho, usabilidade, recursos e facilidade de configuração).
Por que mais uma biblioteca? Bem, a resposta é bastante direta, use-a como você a escreveu para que possa corrigir problemas (se houver) à medida que avança ou abordá-los no github. Além disso, eu pessoalmente não vi nenhuma biblioteca de log baseada em cabeçalho único com um design onde você possa configurar em qualquer lugar, estendê-la de acordo com suas necessidades e obter desempenho rápido. Já vi outras bibliotecas de log de cabeçalho único para C++, mas elas usam bibliotecas externas, por exemplo, boost ou Qt para oferecer suporte a certos recursos como threading, expressão regular ou data, etc. não que eu não goste dessas bibliotecas, na verdade adoro elas, mas como nem todos os projetos utilizam essas bibliotecas, não poderia correr o risco de depender delas.
Ir para o topo
Easylogging++ é rico em recursos, contendo muitos recursos que desenvolvedores típicos e avançados exigirão ao escrever um software;
Ir para o topo
Baixe a versão mais recente do último lançamento
Para outros lançamentos, visite a página de lançamentos. Se seu aplicativo não oferece suporte a C++ 11, considere usar a versão 8.91. Esta é uma versão estável para C++98 e C++03, faltando apenas alguns recursos.
Ir para o topo
Para começar a usar o Easylogging++, você pode seguir três etapas fáceis:
easylogging++.h
e easylogging++.cc
)# include " easylogging++.h "
INITIALIZE_EASYLOGGINGPP
int main ( int argc, char * argv[]) {
LOG (INFO) << " My first info log using default logger " ;
return 0 ;
}
Agora compile usando
g++ main.cc easylogging++.cc -o prog -std=c++11
Tão simples! Observe que INITIALIZE_EASYLOGGINGPP
deve ser usado uma vez e somente uma vez, caso contrário você acabará recebendo erros de compilação. Esta é a definição de diversas variáveis extern
. Isso significa que ele pode ser definido apenas uma vez por aplicativo. O melhor lugar para colocar esta instrução de inicialização é no arquivo onde a função int main(int, char**)
está definida, logo após a última instrução de inclusão.
Se quiser instalar este cabeçalho em todo o sistema, você pode fazer isso por meio de:
mkdir build
cd build
cmake -Dtest=ON ../
make
make test
make install
As opções a seguir são suportadas pelo Easylogging++ cmake e você pode ativar essas opções usando -D<option>=ON
lib_utc_datetime
- Define ELPP_UTC_DATETIME
build_static_lib
- Constrói biblioteca estática para Easylogging++ Dito isso, você ainda precisará do arquivo easylogging++.cc
para compilar. Apenas para cabeçalho, verifique v9.89 e inferior.
Alternativamente, você pode baixar e instalar o easyloggingpp usando o gerenciador de dependência vcpkg:
git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh
./vcpkg integrate install
./vcpkg install easyloggingpp
A porta easyloggingpp no vcpkg é mantida atualizada pelos membros da equipe da Microsoft e colaboradores da comunidade. Se a versão estiver desatualizada, crie um problema ou solicitação pull no repositório vcpkg.
Ir para o topo
É sempre recomendado passar os argumentos da aplicação para o Easylogging++. Alguns recursos do Easylogging++ exigem que você defina argumentos de aplicação, por exemplo, registro detalhado para definir níveis detalhados ou vmodules (explicados posteriormente). Para fazer isso você pode usar macro auxiliar ou classe auxiliar;
int main ( int argc, char * argv[]) {
START_EASYLOGGINGPP (argc, argv);
...
}
Ir para o topo
Para começar a configurar sua biblioteca de criação de log, você deve compreender os níveis de gravidade. Easylogging++ deliberadamente não usa registro hierárquico para controlar totalmente o que está habilitado e o que não está. Dito isto, ainda há a opção de usar o log hierárquico usando LoggingFlag::HierarchicalLogging
. Easylogging++ possui os seguintes níveis (ordenados para níveis hierárquicos)
Nível | Descrição |
---|---|
Global | Nível genérico que representa todos os níveis. Útil ao definir a configuração global para todos os níveis. |
Rastreamento | Informações que podem ser úteis para rastrear determinados eventos - mais úteis do que logs de depuração. |
Depurar | Eventos informativos mais úteis para desenvolvedores depurarem aplicativos. Aplicável apenas se NDEBUG não estiver definido (para não VC++) ou _DEBUG estiver definido (para VC++). |
Fatal | Evento de erro muito grave que provavelmente levará o aplicativo a ser abortado. |
Erro | Informações de erro, mas continuarão o aplicativo em execução. |
Aviso | Informações que representam erros no aplicativo, mas o aplicativo continuará em execução. |
Informações | Útil principalmente para representar o progresso atual da aplicação. |
Verboso | Informações que podem ser altamente úteis e variam de acordo com o nível de registro detalhado. A criação de log detalhada não é aplicável à criação de log hierárquica. |
Desconhecido | Aplicável apenas à criação de log hierárquico e é usado para desativar completamente a criação de log. |
Ir para o topo
Easylogging++ é fácil de configurar. Existem três maneiras possíveis de fazer isso,
A configuração pode ser feita por arquivo que é carregado em tempo de execução pela classe Configurations
. Este arquivo possui o seguinte formato;
* LEVEL:
CONFIGURATION NAME = "VALUE" ## Comment
ANOTHER CONFIG NAME = "VALUE"
O nome do nível começa com uma estrela (*) e termina com dois pontos (:). É altamente recomendável iniciar seu arquivo de configuração com nível Global
para que qualquer configuração não especificada no arquivo use automaticamente a configuração de Global
. Por exemplo, se você definir Filename
como Global
e desejar que todos os níveis usem o mesmo nome de arquivo, não o defina explicitamente para cada nível, a biblioteca usará o valor de configuração do Global
automaticamente. A tabela a seguir contém configurações suportadas pelo arquivo de configuração.
Nome da configuração | Tipo | Descrição |
---|---|---|
Enabled | bool | Determina se o nível correspondente do criador de logs está habilitado ou não. Você pode desabilitar todos os logs usando el::Level::Global |
To_File | bool | Gravar ou não o log correspondente no arquivo de log |
To_Standard_Output | bool | Se deve ou não gravar logs na saída padrão, por exemplo, terminal ou prompt de comando |
Format | caractere* | Determina o formato/padrão de registro para o nível e registrador correspondente. |
Filename | caractere* | Determina o arquivo de log (caminho completo) para gravar logs para o nível e logger correspondentes |
Subsecond_Precision | unint | Especifica a precisão de subsegundos (anteriormente chamada de 'largura em milissegundos'). A largura pode estar dentro do intervalo (1-6) |
Performance_Tracking | bool | Determina se o rastreamento de desempenho está habilitado ou não. Isso não depende do logger ou do nível. O acompanhamento de desempenho sempre usa o registrador de 'desempenho', a menos que especificado |
Max_Log_File_Size | tamanho_t | Se o tamanho do arquivo de log do nível correspondente for >= tamanho especificado, o arquivo de log será truncado. |
Log_Flush_Threshold | tamanho_t | Especifica o número de entradas de log a serem retidas até liberarmos os dados de log pendentes |
Por favor, não use aspas duplas em nenhum comentário, pois você pode acabar tendo um comportamento inesperado.
Exemplo de arquivo de configuração
* GLOBAL:
FORMAT = "%datetime %msg"
FILENAME = "/tmp/logs/my.log"
ENABLED = true
TO_FILE = true
TO_STANDARD_OUTPUT = true
SUBSECOND_PRECISION = 6
PERFORMANCE_TRACKING = true
MAX_LOG_FILE_SIZE = 2097152 ## 2MB - Comment starts with two hashes (##)
LOG_FLUSH_THRESHOLD = 100 ## Flush after every 100 logs
* DEBUG:
FORMAT = "%datetime{%d/%M} %func %msg"
O conteúdo do arquivo de configuração no exemplo acima é simples. Começamos com o nível GLOBAL
para substituir todos os níveis. Qualquer nível subsequente definido explicitamente substituirá a configuração de GLOBAL
. Por exemplo, todos os níveis, exceto DEBUG
têm o mesmo formato, ou seja, data e hora e mensagem de log. Para o nível DEBUG
, temos apenas data (com dia e mês), função de origem e mensagem de log. O resto das configurações para DEBUG
são usadas em GLOBAL
. Além disso, observe {%d/%M}
no formato DEBUG
acima, se você não especificar o formato de data, o formato padrão será usado. Os valores padrão de data/hora são %d/%M/%Y %h:%m:%s,%g
Para obter mais informações sobre esses especificadores de formato, consulte a seção Especificador de formato de data/hora abaixo
# include " easylogging++.h "
INITIALIZE_EASYLOGGINGPP
int main ( int argc, const char ** argv) {
// Load configuration from file
el::Configurations conf ( " /path/to/my-conf.conf " );
// Reconfigure single logger
el::Loggers::reconfigureLogger ( " default " , conf);
// Actually reconfigure all loggers instead
el::Loggers::reconfigureAllLoggers (conf);
// Now all the loggers will use configuration from file
}
Seu arquivo de configuração pode ser convertido para o objeto
el::Configurations
(usando o construtor) que pode ser usado onde for necessário (como no exemplo acima).
Ir para o topo
Você pode definir configurações ou redefinir configurações;
# include " easylogging++.h "
INITIALIZE_EASYLOGGINGPP
int main ( int argc, const char ** argv) {
el::Configurations defaultConf;
defaultConf. setToDefault ();
// Values are always std::string
defaultConf. set (el::Level::Info,
el::ConfigurationType::Format, " %datetime %level %msg " );
// default logger uses default configurations
el::Loggers::reconfigureLogger ( " default " , defaultConf);
LOG (INFO) << " Log using default file " ;
// To set GLOBAL configurations you may use
defaultConf. setGlobally (
el::ConfigurationType::Format, " %date %msg " );
el::Loggers::reconfigureLogger ( " default " , defaultConf);
return 0 ;
}
A configuração só precisa ser definida uma vez. Se estiver satisfeito com a configuração padrão, você também poderá usá-la.
Ir para o topo
Configuração embutida significa que você pode definir configurações em std::string
mas certifique-se de adicionar todos os novos caracteres de linha, etc. Isso não é recomendado porque é sempre confuso.
el::Configurations c;
c.setToDefault();
c.parseFromText( " *GLOBAL: n FORMAT = %level %msg " );
O código acima define apenas o objeto Configurações, você ainda precisa reconfigurar os registradores usando essas configurações.
Ir para o topo
Se você deseja ter uma configuração para criadores de log existentes e futuros, você pode usar el::Loggers::setDefaultConfigurations(el::Configurations& configurations, bool configureExistingLoggers = false)
. Isso é útil quando você está trabalhando em grande escala ou usando uma biblioteca de terceiros que já usa o Easylogging++. Qualquer criador de logs recém-criado usará configurações padrão. Se você também deseja configurar os criadores de log existentes, você pode definir o segundo argumento como true
(o padrão é false
).
Ir para o topo
Level::Global
não tem nada a ver com configurações globais, é um conceito onde você pode registrar configurações para todos/ou alguns loggers e até mesmo registrar novos loggers usando o arquivo de configuração. A sintaxe do arquivo de configuração é:
-- LOGGER ID ## Case sensitive
## Everything else is same as configuration file
-- ANOTHER LOGGER ID
## Configuration for this logger
O ID do registrador começa com dois travessões. Depois de escrever seu arquivo de configuração global, você poderá configurar todos os seus registradores (e registrar novos) usando uma única função;
int main ( void ) {
// Registers new and configures it or
// configures existing logger - everything in global.conf
el::Loggers::configureFromGlobal ( " global.conf " );
// .. Your prog
return 0 ;
}
Observe que não é possível registrar um novo registrador usando configuração global sem definir sua configuração. Você deve definir pelo menos uma configuração única. Outras maneiras de registrar registradores são discutidas na seção Registro abaixo.
Ir para o topo
Você pode personalizar o formato do log usando os seguintes especificadores:
Especificador | Substituído por |
---|---|
%logger | ID do registrador |
%thread | Thread ID - Usa std::thread se disponível, caso contrário GetCurrentThreadId() no Windows |
%thread_name | Use Helpers::setThreadName para definir o nome do thread atual (de onde você executa setThreadName ). Veja exemplo de nomes de thread |
%level | Nível de gravidade (Informações, Depuração, Erro, Aviso, Fatal, Verbose, Rastreamento) |
%levshort | Nível de gravidade (versão resumida, ou seja, I para informações e respectivamente D, E, W, F, V, T) |
%vlevel | Nível de verbosidade (aplicável ao registro detalhado) |
%datetime | Data e/ou hora - O padrão é personalizável - consulte os especificadores de formato de data/hora abaixo |
%user | Usuário atualmente executando o aplicativo |
%host | O aplicativo de nome do computador está em execução |
%file * | Nome do arquivo de origem (caminho completo) - Este recurso está sujeito à disponibilidade da macro __FILE__ do compilador |
%fbase * | Nome do arquivo de origem (somente nome base) |
%line * | Número da linha de origem - Este recurso está sujeito à disponibilidade da macro __LINE__ de compilação |
%func * | Função de registro |
%loc * | Nome do arquivo de origem e número da linha de registro (separados por dois pontos) |
%msg | Mensagem de registro real |
% | Caractere de escape (por exemplo, %%level escreverá %level) |
__LINE__
, __FILE__
etc. Ir para o topo
Você pode personalizar o formato de data/hora usando os seguintes especificadores
Especificador | Substituído por |
---|---|
%d | Dia do mês (preenchido com zeros) |
%a | Dia da semana - curto (segunda, terça, quarta, quinta, sexta, sábado, domingo) |
%A | Dia da semana - longo (segunda, terça, quarta, quinta, sexta, sábado, domingo) |
%M | Mês (preenchido com zeros) |
%b | Mês - curto (janeiro, fevereiro, março, abril, maio, junho, julho, agosto, setembro, outubro, novembro, dezembro) |
%B | Mês - Longo (janeiro, fevereiro, março, abril, maio, junho, julho, agosto, setembro, outubro, novembro, dezembro) |
%y | Ano - Dois dígitos (13, 14 etc) |
%Y | Ano - Quatro dígitos (2013, 2014 etc) |
%h | Hora (formato de 12 horas) |
%H | Hora (formato de 24 horas) |
%m | Minuto (preenchido com zeros) |
%s | Segundo (preenchido com zeros) |
%g | Parte do subsegundo (a precisão é configurada por ConfigurationType::SubsecondPrecision) |
%F | Designação AM/PM |
% | Personagem de fuga |
Observe que a data/hora está limitada a no máximo 30
caracteres.
Ir para o topo
Você também pode especificar seus próprios especificadores de formato. Para fazer isso você pode usar el::Helpers::installCustomFormatSpecifier
. Um exemplo perfeito é %ip_addr
para aplicação de servidor TCP;
const char * getIp ( const el::LogMessage*) {
return " 192.168.1.1 " ;
}
int main ( void ) {
el::Helpers::installCustomFormatSpecifier ( el::CustomFormatSpecifier ( " %ip_addr " , getIp));
el::Loggers::reconfigureAllLoggers (el::ConfigurationType::Format, " %datetime %level %ip_addr : %msg " );
LOG (INFO) << " This is request from client " ;
return 0 ;
}
Ir para o topo
Em algumas partes do registro, você pode definir sinalizadores de registro; aqui estão os sinalizadores suportados:
Bandeira | Descrição |
---|---|
NewLineForContainer (1) | Garante que tenhamos uma nova linha para cada entrada de log do contêiner |
AllowVerboseIfModuleNotSpecified (2) | Garante que se -vmodule for usado e não especificar um módulo, então o registro detalhado será permitido por meio desse módulo. Digamos que o parâmetro era -vmodule=main*=3 e um log detalhado está sendo gravado a partir de um arquivo chamado Something.cpp, então, se este sinalizador estiver habilitado, o log será gravado, caso contrário, não será permitido. Nota: ter este propósito de derrota de -vmodule |
LogDetailedCrashReason (4) | Ao lidar com falhas por padrão, o motivo detalhado da falha também será registrado (desativado por padrão) (problema nº 90) |
DisableApplicationAbortOnFatalLog (8) | Permite desativar o aborto do aplicativo quando logado no nível FATAL. Observe que isso não se aplica aos manipuladores de travamento padrão, pois o aplicativo deve ser abortado após o sinal de travamento ser tratado. (Não adicionado por padrão) (edição nº 119) |
ImmediateFlush (16) | Libera o log com cada entrada de log (sensível ao desempenho) - Desabilitado por padrão |
StrictLogFileSizeCheck (32) | Garante que o tamanho do arquivo de log seja verificado em cada log |
ColoredTerminalOutput (64) | A saída do terminal será colorida se for suportada pelo terminal. |
MultiLoggerSupport (128) | Ativa o suporte para o uso de vários criadores de logs para registrar uma única mensagem. (Por exemplo, CLOG(INFO, "default", "network") << This will be logged using default and network loggers; ) |
DisablePerformanceTrackingCheckpointComparison (256) | Desativa a comparação de pontos de verificação |
DisableVModules (512) | Desativa o uso de vmodules |
DisableVModulesExtensions (1024) | Desativa a extensão vmodules. Isso significa que se você tiver um vmodule -vmodule=main*=4 ele cobrirá tudo começando com main, onde como se você não tivesse isso definido você será coberto para qualquer arquivo começando com main e terminando com uma das seguintes extensões; .h .c .cpp .cc .cxx .-inl-.h .hxx .hpp. Observe que o seguinte vmodule não está correto -vmodule=main.=4 com esta macro não definida porque isso verificará main..c, observe os pontos duplos. Se você deseja que isso seja válido, dê uma olhada no sinalizador de log acima: AllowVerboseIfModuleNotSpecified '?' e '' curingas são suportados |
HierarchicalLogging (2048) | Ativa o registro hierárquico. Isso não se aplica ao registro detalhado. |
CreateLoggerAutomatically (4096) | Cria o registrador automaticamente quando não está disponível. |
AutoSpacing (8192) | Adiciona espaços automaticamente. Por exemplo, LOG(INFO) << "DODGE" << "THIS!"; irá gerar "DODGE THIS!" |
FixedTimeFormat (16384) | Aplicável apenas ao acompanhamento de desempenho - isso evita o tempo de formatação. Por exemplo, 1001 ms serão registrados como estão, em vez de formatá-los como 1.01 sec |
IgnoreSigInt (32768) | Quando o aplicativo trava, ignore o sinal de interrupção |
Você pode definir/desativar esses sinalizadores usando static el::Loggers::addFlag
e el::Loggers::removeFlag
. Você pode verificar se determinado sinalizador está disponível usando el::Loggers::hasFlag
, todas essas funções usam enum fortemente digitado el::LoggingFlag
Você pode definir esses sinalizadores usando o argumento de linha de comando
--logging-flags
. Você precisa habilitar esta funcionalidade definindo a macroELPP_LOGGING_FLAGS_FROM_ARG
(você precisará usarSTART_EASYLOGGINGPP(argc, argv)
para configurar argumentos).
Você também pode definir sinalizadores padrão (iniciais) usando
ELPP_DEFAULT_LOGGING_FLAGS
e definir valores numéricos para sinalizadores iniciais
Ir para o topo
A tabela a seguir explicará todos os argumentos de linha de comando que você pode usar para definir determinado comportamento; Você precisará inicializar os argumentos do aplicativo usando START_EASYLOGGINGPP(argc, argv)
em sua função main(int, char**)
.
Argumento | Descrição |
---|---|
-v | Ativa verbosidade máxima |
--v=2 | Ativa verbosidade até nível detalhado 2 (intervalo válido: 0-9) |
--verbose | Ativa verbosidade máxima |
-vmodule=MODULE_NAME | Ativa o detalhamento para arquivos começando com main até o nível 1, o restante dos arquivos depende do sinalizador de registro AllowVerboseIfModuleNotSpecified Consulte a seção Sinalizadores de registro acima. Dois módulos podem ser separados por vírgula. Observe que os vmodules são os últimos em ordem de precedência de verificação de argumentos para registro detalhado, por exemplo, se tivermos -v nos argumentos do aplicativo antes dos vmodules, os vmodules serão ignorados. |
--logging-flags=3 | Define o sinalizador de registro. No exemplo ie, 3 , ele define o sinalizador de log como NewLineForContainer e AllowVerboseIfModuleNotSpecified . Consulte a seção de sinalizadores de registro acima para obter mais detalhes e valores. Consulte a seção de macros para desativar esta função. |
--default-log-file=FILE | Define o arquivo de log padrão para criadores de log existentes e futuros. Você pode considerar a definição de ELPP_NO_DEFAULT_LOG_FILE para evitar a criação de um arquivo de log vazio padrão durante o pré-processamento. Consulte a seção de macros para desativar esta função. |
Ir para o topo
Algumas das opções de log podem ser definidas por macros, esta é uma decisão cuidadosa, por exemplo, se tivermos ELPP_THREAD_SAFE
definido, todas as funcionalidades thread-safe serão habilitadas, caso contrário desabilitadas (certificando-se de que a sobrecarga da segurança do thread esteja junto). Para facilitar a memorização e evitar possíveis conflitos, todas as macros começam com ELPP_
NOTA: Todas as macros podem ser definidas de uma das seguintes maneiras:
Defina macros usando a opção -D
do compilador, por exemplo no caso de g++
você fará g++ source.cpp ... -DELPP_SYSLOG -DELPP_THREAD_SAFE ...
( maneira recomendada )
Defina macros dentro de "easylogging++.h"
(definir macros em outros arquivos não funcionará)
Nome da macro | Descrição |
---|---|
ELPP_DEBUG_ASSERT_FAILURE | Anula o aplicativo na primeira falha de asserção. Esta afirmação é devido a entrada inválida, por exemplo, arquivo de configuração inválido, etc. |
ELPP_UNICODE | Ativa o suporte Unicode durante o registro. Requer START_EASYLOGGINGPP |
ELPP_THREAD_SAFE | Ativa a segurança de thread - certifique-se de vincular -lpthread para Linux. |
ELPP_FORCE_USE_STD_THREAD | Força a usar a biblioteca padrão C++ para threading (Útil apenas ao usar ELPP_THREAD_SAFE |
ELPP_FEATURE_CRASH_LOG | Aplicável apenas ao GCC. Ativa o stacktrace em caso de falha do aplicativo |
ELPP_DISABLE_DEFAULT_CRASH_HANDLING | Desativa o tratamento de falhas padrão. Você pode usar el::Helpers::setCrashHandler para usar seu próprio manipulador. |
ELPP_DISABLE_LOGS | Desativa todos os logs - (pré-processamento) |
ELPP_DISABLE_DEBUG_LOGS | Desativa logs de depuração - (pré-processamento) |
ELPP_DISABLE_INFO_LOGS | Desativa registros de informações - (pré-processamento) |
ELPP_DISABLE_WARNING_LOGS | Desativa logs de aviso - (pré-processamento) |
ELPP_DISABLE_ERROR_LOGS | Desativa logs de erros - (pré-processamento) |
ELPP_DISABLE_FATAL_LOGS | Desativa logs fatais - (pré-processamento) |
ELPP_DISABLE_VERBOSE_LOGS | Desativa logs detalhados - (pré-processamento) |
ELPP_DISABLE_TRACE_LOGS | Desativa logs de rastreamento - (pré-processamento) |
ELPP_FORCE_ENV_VAR_FROM_BASH | Se a variável de ambiente não puder ser encontrada, force o uso do comando bash alternativo para encontrar o valor, por exemplo, whoami para nome de usuário. (NÃO USE ESTA MACRO COM LD_PRELOAD PARA BIBLIOTECAS QUE JÁ ESTÃO USANDO Easylogging++ OU VOCÊ ACABARÁ EM STACK OVERFLOW PARA PROCESSOS ( popen ) (veja a edição #87 para detalhes)) |
ELPP_DEFAULT_LOG_FILE | Nome completo do arquivo onde você deseja que os arquivos iniciais sejam criados. Você precisa incorporar o valor desta macro entre aspas, por exemplo, -DELPP_DEFAULT_LOG_FILE='"logs/el.gtest.log"' Observe as aspas duplas dentro das aspas simples, as aspas duplas são os valores para const char* e aspas simples especificam o valor de macro |
ELPP_NO_LOG_TO_FILE | Desative o registro no arquivo inicialmente |
ELPP_NO_DEFAULT_LOG_FILE | Se você não quiser inicializar a biblioteca com o arquivo de log padrão, defina esta macro. Isso registrará no dispositivo nulo para Unix e Windows. Em outras plataformas você pode receber erros e precisará usar ELPP_DEFAULT_LOG_FILE . (PR para dispositivos nulos de outras plataformas são muito bem-vindos) |
ELPP_FRESH_LOG_FILE | Nunca anexa o arquivo de log sempre que o arquivo de log for criado (use com cuidado, pois pode causar algum resultado inesperado para alguns usuários) |
ELPP_DEBUG_ERRORS | Se você deseja descobrir erros internos gerados pelo Easylogging++ que podem ser devido à configuração ou qualquer outra coisa, você pode habilitá-los definindo esta macro. Você receberá seus erros na saída padrão, ou seja, terminal ou prompt de comando. |
ELPP_DISABLE_CUSTOM_FORMAT_SPECIFIERS | Desativa à força especificadores de formato personalizado |
ELPP_DISABLE_LOGGING_FLAGS_FROM_ARG | Desativa à força a capacidade de definir sinalizadores de registro usando argumentos de linha de comando |
ELPP_DISABLE_LOG_FILE_FROM_ARG | Desativa à força a capacidade de definir o arquivo de log padrão a partir de argumentos de linha de comando |
ELPP_WINSOCK2 | No sistema Windows, force o uso de winsock2.h em vez de winsock.h quando WIN32_LEAN_AND_MEAN estiver definido |
ELPP_CUSTOM_COUT (avançado) | Resolve um valor, por exemplo, #define ELPP_CUSTOM_COUT qDebug() ou #define ELPP_CUSTOM_COUT std::cerr . Isso usará o valor da saída padrão (em vez de usar std::cout |
ELPP_CUSTOM_COUT_LINE (avançado) | Usado com ELPP_CUSTOM_COUT para definir como escrever uma linha de log com cout customizado. por exemplo, #define ELPP_CUSTOM_COUT_LINE(msg) QString::fromStdString(msg).trimmed() |
ELPP_NO_CHECK_MACROS | Não defina as macros CHECK |
ELPP_NO_DEBUG_MACROS | Não defina as macros DEBUG |
ELPP_UTC_DATETIME | Usa a hora UTC em vez da hora local (essencialmente usa gmtime em vez de localtime e funções familiares) |
ELPP_NO_GLOBAL_LOCK | Não bloqueie todo o armazenamento no envio. Isto deve ser usado com cuidado. Veja a edição nº 580 |
Ir para o topo
Se você deseja ler as configurações de determinado logger, você pode fazê-lo usando a função typedConfigurations()
na classe Logger.
el::Logger* l = el::Loggers::getLogger( " default " );
bool enabled = l-> typedConfigurations ()->enabled(el::Level::Info);
// Or to read log format/pattern
std::string format =
l-> typedConfigurations ()->logFormat(el::Level::Info).format();
Ir para o topo
O login no easylogging++ é feito usando uma coleção de macros. Isso torna mais fácil para o usuário e evita que ele conheça maiores detalhes desnecessários de como as coisas são feitas.
Você recebe duas macros básicas que podem ser usadas para gravar logs:
LOG(LEVEL)
CLOG(LEVEL, logger ID)
LOG
usa o criador de logs 'padrão' enquanto em CLOG (Custom LOG) você especifica o ID do criador de logs. Para NÍVEIS, consulte a seção Configurações - Níveis acima. Registradores diferentes podem ter configurações diferentes dependendo da sua necessidade. Você também pode escrever uma macro personalizada para acessar o registrador personalizado. Você também tem macros diferentes para registro detalhado, explicadas na seção abaixo. Aqui está um exemplo muito simples de uso dessas macros depois de inicializar o easylogging++.
LOG (INFO) << "This is info log";
CLOG (ERROR, " performance " ) << "This is info log using performance logger";
Existe outra maneira de usar a mesma macro, ou seja, LOG
(e macros associadas). Isto é que você define a macro ELPP_DEFAULT_LOGGER
e ELPP_DEFAULT_PERFORMANCE_LOGGER
com o ID do criador de logs que já está registrado, e agora quando você usa a macro LOG
, ele automaticamente usará o criador de logs especificado em vez do criador de logs default
. Observe que isso deve ser definido no arquivo de origem em vez do arquivo de cabeçalho. Isso ocorre para que, quando incluímos o cabeçalho, não usemos acidentalmente um registrador inválido.
Um exemplo rápido está aqui
# ifndef ELPP_DEFAULT_LOGGER
# define ELPP_DEFAULT_LOGGER " update_manager "
# endif
# ifndef ELPP_DEFAULT_PERFORMANCE_LOGGER
# define ELPP_DEFAULT_PERFORMANCE_LOGGER ELPP_DEFAULT_LOGGER
# endif
# include " easylogging++.h "
UpdateManager::UpdateManager {
_TRACE; // Logs using LOG(TRACE) provided logger is already registered - i.e, update_manager
LOG (INFO) << " This will log using update_manager logger as well " ;
}
# include " easylogging++.h "
UpdateManager::UpdateManager {
_TRACE; // Logs using LOG(TRACE) using default logger because no `ELPP_DEFAULT_LOGGER` is defined unless you have it in makefile
}
Você também pode escrever logs usando a classe
Logger
diretamente. Este recurso está disponível em compiladores que suportam modelos variados. Você pode explorar mais examinandosamples/STL/logger-log-functions.cpp
.
Ir para o topo
Easylogging++ fornece certos aspectos de registro, um desses aspectos é o registro condicional, ou seja, o registro será gravado somente se determinadas condições forem atendidas. Isso é muito útil em algumas situações. As macros auxiliares terminam com _IF;
LOG_IF(condition, LEVEL)
CLOG_IF(condition, LEVEL, logger ID)
LOG_IF (condition, INFO) << "Logged if condition is true";
LOG_IF ( false , WARNING) << "Never logged";
CLOG_IF ( true , INFO, " performance " ) << "Always logged (performance logger)"
As mesmas macros estão disponíveis para registro detalhado com V
no início, ou seja, VLOG_IF
e CVLOG_IF
. consulte a seção de registro detalhado abaixo para obter mais informações. Você pode ter condições tão complicadas quanto desejar, dependendo da sua necessidade.
Ir para o topo
O registro ocasional é outro aspecto útil do registro com Easylogging++. Isso significa que um log será gravado se for atingido em determinados momentos ou parte de determinados momentos, por exemplo, a cada 10º acerto ou 100º acerto ou 2º acerto. As macros auxiliares terminam com _EVERY_N
;
LOG_EVERY_N(n, LEVEL)
CLOG_EVERY_N(n, LEVEL, logger ID)
Existem algumas outras maneiras de registrar também com base nas contagens de ocorrências. Essas macros úteis são
LOG_AFTER_N(n, LEVEL)
; Somente registra quando atingimos contagens de acertos de n
LOG_N_TIMES(n, LEVEL)
; Registra n vezes for ( int i = 1 ; i <= 10 ; ++i) {
LOG_EVERY_N ( 2 , INFO) << " Logged every second iter " ;
}
// 5 logs written; 2, 4, 6, 7, 10
for ( int i = 1 ; i <= 10 ; ++i) {
LOG_AFTER_N ( 2 , INFO) << " Log after 2 hits; " << i;
}
// 8 logs written; 3, 4, 5, 6, 7, 8, 9, 10
for ( int i = 1 ; i <= 100 ; ++i) {
LOG_N_TIMES ( 3 , INFO) << " Log only 3 times; " << i;
}
// 3 logs writter; 1, 2, 3
As mesmas versões de macros estão disponíveis apenas para o modo
DEBUG
, essas macros começam comD
(para depuração) seguido do mesmo nome. por exemplo,DLOG
para registrar apenas no modo de depuração (ou seja, quando_DEBUG
é definido ouNDEBUG
é indefinido)
Ir para o topo
printf
como registro Para compiladores que suportam modelos variados do C++ 11, a capacidade de registrar como "printf" está disponível. Isso é feito usando a classe Logger
. Este recurso é seguro para thread e tipo (já que não usamos nenhuma macro como LOG(INFO)
etc)
Isso é feito em duas etapas:
el::Loggers::getLogger(<logger_id>);
A única diferença do printf
é que o log usando essas funções requer %v
para cada argumento (isso é para segurança de tipo); em vez de especificadores de formato personalizados. Você pode escapar disso por %%v
A seguir estão várias assinaturas de função:
info(const char*, const T&, const Args&...)
warn(const char*, const T&, const Args&...)
error(const char*, const T&, const Args&...)
debug(const char*, const T&, const Args&...)
fatal(const char*, const T&, const Args&...)
trace(const char*, const T&, const Args&...)
verbose(int vlevel, const char*, const T&, const Args&...)
// Use default logger
el::Logger* defaultLogger = el::Loggers::getLogger( " default " );
// STL logging (`ELPP_STL_LOGGING` should be defined)
std::vector< int > i;
i.push_back( 1 );
defaultLogger-> warn ( " My first ultimate log message %v %v %v " , 123 , 222 , i);
// Escaping
defaultLogger-> info ( " My first ultimate log message %% %%v %v %v " , 123 , 222 );
Os especificadores de formato
%file
,%func
%line
e%loc
não funcionarão comprintf
como registro.
Ir para o topo
Você pode enviar suas mensagens para a rede. Mas você terá que implementar sua própria maneira usando a API do log dispatcher. Escrevemos uma amostra totalmente funcional para esse propósito. Consulte o exemplo Enviar para rede
Ir para o topo
O registro detalhado é útil em todos os softwares para registrar mais informações do que o normal. Muito útil para solução de problemas. A seguir estão macros específicas de registro detalhado;
VLOG(verbose-level)
CVLOG(verbose-level, logger ID)
Ir para o topo
O registro detalhado também possui aspectos de registro condicional e ocasional, ou seja,
VLOG_IF(condition, verbose-level)
CVLOG_IF(condition, verbose-level, loggerID)
VLOG_EVERY_N(n, verbose-level)
CVLOG_EVERY_N(n, verbose-level, loggerID)
VLOG_AFTER_N(n, verbose-level)
CVLOG_AFTER_N(n, verbose-level, loggerID)
VLOG_N_TIMES(n, verbose-level)
CVLOG_N_TIMES(n, verbose-level, loggerID)
Ir para o topo
O nível detalhado é o nível de verbosidade que pode variar de 1 a 9. O nível detalhado não estará ativo a menos que você defina argumentos de aplicativo para ele. Leia a seção Argumentos do aplicativo para entender mais sobre o registro detalhado.
Para alterar o nível detalhado rapidamente, use a função Loggers::setVerboseLevel(base::type::VerboseLevel)
também conhecida como Loggers::setVerboseLevel(int)
. (Você pode verificar o nível detalhado atual por Loggers::verboseLevel()
Ir para o topo
Você pode usar uma macro VLOG_IS_ON(verbose-level)
para verificar se determinado log está ativado para o arquivo de origem para o nível detalhado especificado. Isso retorna um booleano que você pode incorporar à condição if.
if (VLOG_IS_ON( 2 )) {
// Verbosity level 2 is on for this file
}
Ir para o topo
VModule é uma funcionalidade para registro detalhado (conforme mencionado na tabela acima), onde você pode especificar o detalhamento por módulos/arquivo de origem. A seguir estão alguns exemplos com explicação; Qualquer um dos vmodules abaixo começa com -vmodule=
e o sinalizador LoggingFlag::DisableVModulesExtensions
não está definido. Vmodule pode ser completamente desativado adicionando o sinalizador LoggingFlag::DisableVModules
Exemplo com sinalizador LoggingFlag::AllowVerboseIfModuleNotSpecified
;
main=3,parser*=4
:
main{.h, .c, .cpp, .cc, .cxx, -inl.h, .hxx, .hpp}
parser{.h, .c, .cpp, .cc, .cxx, -inl.h, .hxx, .hpp}