Boost.Log: nome do arquivo de suporte e número da linha
Estou tentando fazer minha equipe se afastarlog4cxx
e tente usarBoost.Log v2
em vez de. Nossa atualpadrão log4cxx é bastante simples:
log4cxx::helpers::Properties prop;
prop.setProperty("log4j.rootLogger","DEBUG, A1");
prop.setProperty("log4j.appender.A1","org.apache.log4j.ConsoleAppender");
prop.setProperty("log4j.appender.A1.layout","org.apache.log4j.PatternLayout");
prop.setProperty("log4j.appender.A1.layout.ConversionPattern","%d{ABSOLUTE} %-5p [%c] %m%n");
log4cxx::PropertyConfigurator::configure(prop);
No entanto, não consegui encontrar uma solução para suportar a impressão de nome de arquivo e número de linha. Eu encontrei até agora umpost antigo, mas não há uma solução clara (nenhuma solução aceita). Eu olhei para usar aquelesBOOST_LOG_NAMED_SCOPE
mas eles são muito feios, pois tornam impossível imprimir o número de linha correto quando vários deles são usados na mesma função.
Eu também encontrei uma solução direta mais simples,aqui. Mas isso também parece feio, pois imprimirá o caminho completo, em vez de apenas o nome da base (não é configurável). Portanto, o caminho completo e o número da linha são sempre impressos em um local fixo (antes deexpr::smessage
)
Eu encontrei também issopostar, que parece uma solução antiga.
E, finalmente, a solução mais promissora que encontrei foiaqui. No entanto, nem sequer compila para mim.
Portanto, minha pergunta é simples: como posso usar o Boost.Log v2 para imprimir o nome do arquivo (não o caminho completo) e o número da linha com o mínimoflexibilidade do formatador (nenhuma solução comMACRO
e__FILE__
/ __LINE__
aceito, por favor). Eu apreciaria uma solução que não envolvaBOOST_LOG_NAMED_SCOPE
, como descritoaqui:
Se, em vez disso, você deseja ver os números de linha de registros de log específicos, a melhor maneira é definir uma macro personalizada que você usará para gravar logs. Nessa macro, você pode adicionar o nome do arquivo e o número da linha como atributos ao registro (você pode usar manipuladores para isso). Observe que, nesse caso, você não poderá usar esses atributos nos filtros, mas provavelmente não precisará disso.