Estou tendo muitas instruções de log para depuração, por exemplo.
Log.v(TAG, "Message here");
Log.w(TAG, " WARNING HERE");
ao implantar esse aplicativo no telefone do dispositivo, desejo desativar o log detalhado de onde posso ativar / desativar o log.
Respostas:
Uma maneira comum é criar um int chamado loglevel e definir seu nível de depuração com base no loglevel.
Mais tarde, você pode simplesmente alterar o LOGLEVEL para todo o nível de saída de depuração.
fonte
A documentação do Android diz o seguinte sobre os níveis de log :
Portanto, você pode considerar retirar as instruções de log de log detalhado, possivelmente usando o ProGuard, conforme sugerido em outra resposta .
De acordo com a documentação, você pode configurar o log em um dispositivo de desenvolvimento usando as Propriedades do sistema. A propriedade de conjunto é
log.tag.<YourTag>
e deve ser definido para um dos seguintes valores:VERBOSE
,DEBUG
,INFO
,WARN
,ERROR
,ASSERT
, ouSUPPRESS
. Mais informações sobre isso estão disponíveis na documentação doisLoggable()
método.Você pode definir propriedades temporariamente usando o
setprop
comando Por exemplo:Como alternativa, você pode especificá-los no arquivo '/data/local.prop' da seguinte maneira:
Versões posteriores do Android parecem exigir que /data/local.prop seja somente leitura . Esse arquivo é lido no momento da inicialização, portanto, você precisará reiniciar após a atualização. Se
/data/local.prop
for gravável no mundo, provavelmente será ignorado.Finalmente, você pode configurá-los por meio de programação usando o
System.setProperty()
método .fonte
android.util.Config
constantes obsoletas. Os valores codificados especificados nos documentos da API são inúteis, pois eles (supostamente) variam de acordo com a compilação. Portanto, a rota ProGuard parecia a melhor solução para nós.A maneira mais fácil é provavelmente executar o JAR compilado através do ProGuard antes da implantação, com uma configuração como:
Isso - além de todas as outras otimizações do ProGuard - removerá quaisquer instruções de log detalhadas diretamente do bytecode.
fonte
Peguei uma rota simples - criando uma classe de wrapper que também utiliza listas de parâmetros variáveis.
fonte
A melhor maneira é usar a API SLF4J + parte de sua implementação.
Para aplicativos Android, você pode usar o seguinte:
fonte
logback-android
(já que ologback
adequado é incompatível).logback-android-1.0.10-1.jar
tem 429 KB, o que não é muito ruim, considerando os recursos fornecidos, mas a maioria dos desenvolvedores usaria o Proguard para otimizar seu aplicativo de qualquer maneira.Você deveria usar
fonte
Retirar o log com proguard (ver resposta de @Christopher) foi fácil e rápido, mas fez com que os rastreamentos de pilha da produção não correspondessem à origem se houvesse algum log de depuração no arquivo.
Em vez disso, aqui está uma técnica que usa diferentes níveis de registro no desenvolvimento versus produção, supondo que o proguard seja usado apenas na produção. Ele reconhece a produção vendo se proguard renomeou o nome de uma determinada classe (no exemplo, eu uso "com.foo.Bar" - você a substitui por um nome de classe totalmente qualificado que você sabe que será renomeado por proguard).
Essa técnica utiliza o log comum.
fonte
Log4j ou slf4j também podem ser usados como estruturas de log no Android, juntamente com o logcat. Veja o projeto android-logging-log4j ou log4j support no android
fonte
Há um pequeno substituto para a classe Log padrão do Android - https://github.com/zserge/log
Basicamente, tudo o que você precisa fazer é substituir as importações de
android.util.Log
paratrikita.log.Log
. Em seguida, no seuApplication.onCreate()
ou em algum inicializador estático, verifique oBuilConfig.DEBUG
sinalizador ou qualquer outro sinalizador e useLog.level(Log.D)
ouLog.level(Log.E)
para alterar o nível mínimo de log. Você pode usarLog.useLog(false)
para desativar o log.fonte
Talvez você possa ver esta classe de extensão de log: https://github.com/dbauduin/Android-Tools/tree/master/logs .
Ele permite que você tenha um controle preciso dos logs. Você pode, por exemplo, desativar todos os logs ou apenas os logs de alguns pacotes ou classes.
Além disso, ele adiciona algumas funcionalidades úteis (por exemplo, você não precisa passar uma tag para cada log).
fonte
Eu criei um utilitário / wrapper que resolve esse problema + outros problemas comuns em relação ao log.
Um utilitário de depuração com os seguintes recursos:
Como usar?
Eu tentei tornar a documentação auto-suficiente.
Sugestões para melhorar este utilitário são bem-vindas.
Livre para usar / compartilhar.
Faça o download no GitHub .
fonte
Aqui está uma solução mais complexa. Você obterá o rastreamento completo da pilha e o método toString () será chamado apenas se necessário (Desempenho). O atributo BuildConfig.DEBUG será falso no modo de produção, para que todos os logs de rastreamento e depuração sejam removidos. O compilador de hot spot tem a chance de remover as chamadas devido às propriedades estáticas finais.
use assim:
fonte
Em um cenário de log muito simples, no qual você está literalmente tentando gravar no console durante o desenvolvimento para fins de depuração, pode ser mais fácil fazer uma pesquisa e substituir antes da produção produzir e comentar todas as chamadas para Log ou System. out.println.
Por exemplo, supondo que você não usou o "Log". em qualquer lugar fora de uma chamada para Log.d ou Log.e, etc, você pode simplesmente encontrar e substituir toda a solução para substituir "Log". com "// Log". para comentar todas as suas chamadas de log ou, no meu caso, estou apenas usando System.out.println em todos os lugares, portanto, antes de iniciar a produção, basta fazer uma pesquisa completa e substituir por "System.out.println" e substituir por "// System.out.println".
Eu sei que isso não é o ideal, e seria bom se a capacidade de encontrar e comentar chamadas para Log e System.out.println fosse incorporada ao Eclipse, mas até que isso aconteça, a maneira mais fácil, rápida e melhor de fazer isso é para comentar pesquisando e substituindo. Se você fizer isso, não precisará se preocupar com números de linhas de rastreamento de pilha incompatíveis, porque está editando seu código-fonte e não está adicionando nenhuma sobrecarga verificando algumas configurações no nível do log etc.
fonte
Nos meus aplicativos, tenho uma classe que agrupa a classe Log, que possui uma var booleana estática chamada "state". Em todo o meu código, verifico o valor da variável "state" usando um método estático antes de realmente escrever no Log. Em seguida, tenho um método estático para definir a variável "state" que garante que o valor seja comum em todas as instâncias criadas pelo aplicativo. Isso significa que posso ativar ou desativar todos os registros do aplicativo em uma chamada - mesmo quando o aplicativo estiver em execução. Útil para chamadas de suporte ... Isso significa que você precisa manter suas armas durante a depuração e não voltar a usar a classe Log padrão ...
Também é útil (conveniente) que o Java interprete uma var booleana como falsa se não tiver sido atribuído um valor, o que significa que ela pode ser deixada como falsa até que você precise ativar o log :-)
fonte
Podemos usar a classe
Log
em nosso componente local e definir os métodos como v / i / e / d. Com base na necessidade de podermos fazer mais ligações.exemplo é mostrado abaixo.
aqui a mensagem é para
string
eeargs
é o valor que você deseja imprimir.fonte
Para mim, geralmente é útil poder definir níveis de log diferentes para cada TAG.
Estou usando esta classe de invólucro muito simples:
Agora basta definir o nível de log por TAG no início de cada classe:
fonte
Outra maneira é usar uma plataforma de registro que tenha os recursos de abrir e fechar registros. Às vezes, isso pode dar muita flexibilidade, mesmo em um aplicativo de produção, quais logs devem ser abertos e quais fechados, dependendo de quais problemas você tem, por exemplo:
fonte