Você deve fazer logon do código da biblioteca?

38

Se estou desenvolvendo uma biblioteca Java, é uma boa prática emitir instruções de log de dentro do código da biblioteca?

A criação de log na biblioteca tornará a depuração e a solução de problemas mais transparentes. No entanto, por outro lado, não gosto de encher meu código de biblioteca com instruções de log. Também há implicações de desempenho a serem consideradas?

dinamarquês
fonte

Respostas:

33

Sim você deveria. O uso de uma fachada de registro como o SLF4J oferece flexibilidade sem sobrecarregar os usuários com uma estrutura de registro específica.

Os autores de componentes e bibliotecas amplamente distribuídos podem codificar na interface SLF4J para evitar a imposição de uma estrutura de log no usuário final do componente ou biblioteca. Portanto, o usuário final pode escolher a estrutura de log desejada no momento da implantação, inserindo a ligação slf4j correspondente no caminho da classe, que pode ser alterada posteriormente substituindo uma ligação existente por outra no caminho da classe e reiniciando o aplicativo. Essa abordagem provou ser simples e muito robusta.

Além disso, se seus usuários não incluírem um jar SLF4J (no guia do usuário ):

No SLF4J versão 1.6.0, se nenhuma ligação for encontrada no caminho da classe, o slf4j-api assumirá o padrão de uma implementação sem operação descartando todas as solicitações de log.

Se você estiver preocupado com as implicações de desempenho do log, consulte esta entrada do SLF4J FAQ . A idéia é que você forneça parâmetros para registrar instruções em vez de adicioná-las a uma sequência de caracteres:

As duas linhas a seguir produzirão exatamente a mesma saída. No entanto, o segundo formulário superará o primeiro por um fator de pelo menos 30, no caso de uma instrução de log desativada.

logger.debug("The new entry is "+entry+".");
logger.debug("The new entry is {}.", entry);

O SLF4J é mais uma fachada de exploração?

SLF4J é conceitualmente muito semelhante ao JCL. Como tal, pode ser pensado como mais uma fachada de madeira. No entanto, o SLF4J é muito mais simples em design e sem dúvida mais robusto. Em poucas palavras, o SLF4J evita os problemas do carregador de classes que afetam [Jakarta Commons Logging].

Mike Partridge
fonte
Existe uma boa biblioteca de código aberto que faça logon no código da biblioteca que você pode apontar? para que possamos ver como é feito?
user1870400
A estrutura do Spring é uma biblioteca Java bastante conhecida que faz isso; no caso deles, eles escolheram a JCL.
Mike Partridge
17

Sim , você deve fazer logon no código da sua biblioteca. Isso não apenas ajuda você a se desenvolver, mas as pessoas que usam a biblioteca a acharão útil. Lembre-se de que você sempre pode definir os níveis de log para mostrar apenas as instruções de log necessárias - e elas podem fazer o mesmo.

Recentemente, eu estava usando o Mybatis , uma ferramenta ORM de código aberto. Eu estava depurando um problema em que uma consulta que achava que deveria estar correta não retornava resultados. Era uma consulta parametrizada e, como o Mybatis possui registro em seu código de biblioteca, eu pude ativá-lo e ver a consulta real sendo executada. Era fácil dizer que troquei dois parâmetros. Sem fazer login na biblioteca, eu não poderia ter encontrado o problema tão rapidamente.

Michael K
fonte