Presumo que a maioria de vocês conheça android.util.Log Todos os métodos de registro aceitam 'String tag' como primeiro argumento.
E minha pergunta é como você geralmente marca seus logs em seus aplicativos? Eu vi alguns hardcode como este:
public class MyActivity extends Activity {
private static final String TAG = "MyActivity";
//...
public void method () {
//...
Log.d(TAG, "Some logging");
}
}
Isso não parece bom por vários motivos:
- Você pode me dizer que este código não tem hardcode, mas tem.
- Meu aplicativo pode ter qualquer número de classes em pacotes diferentes com o mesmo nome. Portanto, seria difícil ler o log.
- Não é flexível. Você sempre colocou um campo TAG privado em sua classe.
Existe alguma maneira legal de obter um TAG para uma aula?
Respostas:
Eu uso um TAG, mas inicializo-o assim:
Dessa forma, quando eu refatorar meu código, a tag também mudará de acordo.
fonte
"MyActivity.class.getName();"
. Sempre pensei que "TAG" era apenas um marcador de posição em exemplos do Google, etc ... não umaStatic
variável real ! Esta é uma solução muito melhor, obrigado :)this.getClass().getName()
-la para torná-la mais genérica?Eu geralmente crio uma
App
classe que fica em um pacote diferente e contém métodos estáticos úteis. Um dos métodos é umgetTag()
método, dessa forma posso obter o TAG em qualquer lugar.App
classe se parece com isto:EDITAR : Melhorado por comentário do br mob (Obrigado :))
E quando eu quiser usar:
A saída do
getTag
método é o nome da classe do chamador (com o nome do pacote) e o número da linha de onde ogetTag
é chamado, para facilitar a depuração.fonte
getStackTrace()
funciona. Mas eu não vou usá-lo porque é caroVá para Android Studio -> preferência -> Modelos ao vivo -> AndroidLog e selecione Log.d (TAG, String) .
No texto do modelo substituir
android.util.Log.d(TAG, "$METHOD_NAME$: $content$");
com
android.util.Log.d("$className$", "$METHOD_NAME$: $content$");
Em seguida, clique em Editar variáveis e insira className () na coluna Expressão ao lado da coluna Nome da classe .
Agora, quando você digitar o atalho,
logd
ele colocaráVocê não precisa mais definir um TAG.
fonte
Eu gosto de melhorar a resposta do Yaniv se você tiver o log neste formato (nome do arquivo.java:XX) x número da linha você pode vincular o atalho da mesma forma que fica vinculado quando há um erro, desta forma posso ir direto para a linha em questão apenas clicando no logcat
Eu coloquei isso dentro do meu aplicativo estendido para que possa usar em todos os outros arquivos
Captura de tela:
fonte
O AndroidStudio tem um
logt
modelo por padrão (você pode digitarlogt
e pressionar tab para expandi-lo para um conjunto de código). Eu recomendo usar isso para evitar copiar e colar a definição de TAG de outra classe e esquecer de alterar a classe à qual você está se referindo. O modelo se expande por padrão paraprivate static final String TAG = "$CLASS_NAME$"
Para evitar o uso do nome da classe antiga após a refatoração, você pode alterá-lo para
private static final String TAG = $CLASS_NAME$.class.getSimpleName();
Lembre-se de marcar o botão "Editar variáveis" e certifique-se de que a
CLASS_NAME
variável está definida para usar aclassName()
Expressão e que a opção "Ignorar se definida" está marcada.fonte
Eu criei uma classe de variáveis estáticas, métodos e classes denominadas como
S
.A seguir está o método de registro:
Ele é chamado em qualquer classe, pois
S.L(this, whaterver_object);
ThegetClass().getName()
também acrescenta o nome do pacote, portanto, estou removendo-o para evitar tornar a tag desnecessariamente longa.Vantagens:
Log.d(TAG,
toString
Log.d
já que eu só tenho que deletar o método e os locais de todos os logs ficam marcados em vermelho.CCC
(uma string curta e fácil de digitar) para que seja fácil listar apenas seus logs no monitor do Android no Android Studio. Às vezes, você está executando serviços ou outras classes simultaneamente. Se você tiver que pesquisar apenas pelo nome da atividade, não poderá ver exatamente quando uma resposta de serviço foi obtida e uma ação de sua atividade ocorreu. Um prefixo como CCC ajuda, pois fornece registros cronologicamente com a atividade em que ocorreufonte
Context ctx
porObject ctx
ectx.getClass().getName().replace(ctx.getPackageName(), "")
porctx.getClass().getSimpleName()
. Dessa forma, posso ligar paraS.L(Object, Object)
qualquer lugar (inclusive emFragment
s que não se estendemContext
, por exemplo).Você pode usar
this.toString()
para obter um identificador único para a classe específica na qual imprime no log.fonte
toString()
fizer.À custa de atualizar essas strings quando movo o código entre métodos ou renomeio métodos, gosto de fazer o seguinte. Filosoficamente, também parece ser melhor manter "localização" ou "contexto" na tag, não na mensagem.
A vantagem aqui é que você pode filtrar um único método, mesmo se o conteúdo não for estático, por exemplo
A única desvantagem é que, quando mudo o nome
f()
parag()
, preciso manter essa string em mente. Além disso, a refatoração automática de IDE não os pegará.Por um tempo, fui fã de usar o nome curto da classe, quero dizer
LOG_TAG = MyClass.class.getSimpleName()
. Achei mais difícil filtrá-los nos logs porque havia menos para continuar.fonte
É uma pergunta muito antiga, mas mesmo com uma resposta atualizada para julho de 2018 é mais preferível usar Madeira. Para registrar o registro correto, erros e avisos podem ser enviados a bibliotecas de falhas de terceiros, como Firebase ou Crashlytics.
Na classe que implementa o aplicativo, você deve adicionar o seguinte:
Não se esqueça da dependência de madeira.
fonte
Para os usuários que visitam esta questão:
fonte
eles usam o Timber para o aplicativo IOsched 2019 para mostrar informações de depuração:
implementation 'com.jakewharton.timber:timber:4.7.1'
uso
observe que isso torna os Logs disponíveis apenas durante o estado DEBUG e facilita a tarefa de removê-los manualmente para o lançamento no Google Play -
confira este artigo https://medium.com/mindorks/better-logging-in-android-using-timber-72e40cc2293d
fonte
Eu normalmente uso o nome do método como a tag, mas do Thread
Isso evita a nova exceção.
fonte
fonte
RuntimeException
apenas para obter o nome da classe atual? Muito mal.this.getClass().getName()
embora fosse necessário remover o escopo estático doTAG