Na przykład mam wiele instrukcji logowania do debugowania.
Log.v(TAG, "Message here");
Log.w(TAG, " WARNING HERE");
podczas wdrażania tej aplikacji na telefonie urządzenia chcę wyłączyć szczegółowe rejestrowanie, z którego mogę włączyć / wyłączyć rejestrowanie.
Odpowiedzi:
Typowym sposobem jest utworzenie int o nazwie loglevel i zdefiniowanie jego poziomu debugowania w oparciu o loglevel.
Później możesz po prostu zmienić LOGLEVEL dla wszystkich poziomów wyjściowych debugowania.
źródło
Android Dokumentacja mówi o następujące poziomy rejestrowania :
Możesz więc rozważyć usunięcie z dziennika informacji o szczegółowym wylogowaniu, być może przy użyciu ProGuard, jak sugeruje inna odpowiedź .
Zgodnie z dokumentacją możesz skonfigurować logowanie na urządzeniu deweloperskim za pomocą Właściwości systemu. Nieruchomość do zestawu jest
log.tag.<YourTag>
i powinien być ustawiony na jedną z następujących wartości:VERBOSE
,DEBUG
,INFO
,WARN
,ERROR
,ASSERT
, lubSUPPRESS
. Więcej informacji na ten temat można znaleźć w dokumentacji programuisLoggable()
metody.Możesz tymczasowo ustawić właściwości za pomocą
setprop
polecenia. Na przykład:Alternatywnie możesz określić je w pliku „/data/local.prop” w następujący sposób:
Wydaje się, że późniejsze wersje Androida wymagają, aby plik /data/local.prop był tylko do odczytu . Ten plik jest odczytywany podczas rozruchu, więc po zaktualizowaniu należy go ponownie uruchomić. Jeśli
/data/local.prop
świat jest zapisywalny, prawdopodobnie zostanie zignorowany.Na koniec możesz ustawić je programowo za pomocą
System.setProperty()
metody .źródło
android.util.Config
wycofywanych stałych. Zakodowane wartości określone w dokumentacji API są bezużyteczne, ponieważ (podobno) różnią się w zależności od kompilacji. Stąd trasa ProGuard wydawała się dla nas najlepszym rozwiązaniem.Najłatwiejszym sposobem jest prawdopodobnie uruchomienie skompilowanego JARa przez ProGuard przed wdrożeniem, z konfiguracją taką jak:
Spowoduje to - poza wszystkimi innymi optymalizacjami ProGuard - usunięcie wszelkich szczegółowych instrukcji dziennika bezpośrednio z kodu bajtowego.
źródło
Obrałem prostą drogę - tworząc klasę opakowania, która również korzysta z list parametrów zmiennych.
źródło
Lepszym sposobem jest użycie SLF4J API + część jego implementacji.
W przypadku aplikacji na Androida możesz użyć:
źródło
logback-android
(ponieważlogback
właściwy jest niekompatybilny).logback-android-1.0.10-1.jar
to 429 KB, co nie jest takie złe, biorąc pod uwagę dostarczone funkcje, ale większość programistów i tak używałaby Proguard do optymalizacji swojej aplikacji.Powinieneś użyć
źródło
Usunięcie logowania za pomocą programu proguard (patrz odpowiedź od @Christopher) było łatwe i szybkie, ale powodowało, że ślady stosu z produkcji powodowały niezgodność źródła, jeśli w pliku było jakiekolwiek logowanie debugowania.
Zamiast tego mamy do czynienia z techniką, która wykorzystuje różne poziomy rejestrowania w rozwoju w porównaniu z produkcją, przy założeniu, że proguard jest używany tylko w produkcji. Rozpoznaje produkcję, sprawdzając, czy program proguard zmienił nazwę danej klasy (w tym przykładzie używam „com.foo.Bar” - należy ją zastąpić w pełni kwalifikowaną nazwą klasy, o której wiadomo, że zostanie zmieniona przez program proguard).
Ta technika wykorzystuje wspólne logowanie.
źródło
Log4j lub slf4j mogą być również używane jako struktury rejestrowania w systemie Android razem z logcat. Zobacz obsługę projektu android-logging-log4j lub log4j w systemie Android
źródło
Istnieje niewielki zamiennik standardowej klasy Android Log - https://github.com/zserge/log
Zasadniczo wszystko, co musisz zrobić, to zastąpić import z
android.util.Log
dotrikita.log.Log
. Następnie w swoimApplication.onCreate()
lub w jakimś statycznym inicjatorze sprawdź,BuilConfig.DEBUG
czy nie ma flagi lub innej flagi i użyjLog.level(Log.D)
lub,Log.level(Log.E)
aby zmienić minimalny poziom dziennika. Możesz użyć,Log.useLog(false)
aby w ogóle wyłączyć logowanie.źródło
Być może możesz zobaczyć tę klasę rozszerzenia dziennika: https://github.com/dbauduin/Android-Tools/tree/master/logs .
Umożliwia precyzyjną kontrolę dzienników. Możesz na przykład wyłączyć wszystkie dzienniki lub tylko dzienniki niektórych pakietów lub klas.
Ponadto dodaje kilka przydatnych funkcjonalności (na przykład nie musisz podawać tagu dla każdego dziennika).
źródło
Stworzyłem narzędzie / opakowanie, które rozwiązuje ten problem + inne typowe problemy związane z logowaniem.
Narzędzie do debugowania z następującymi funkcjami:
Jak używać?
Starałem się, aby dokumentacja była samowystarczalna.
Sugestie dotyczące ulepszenia tego narzędzia są mile widziane.
Do bezpłatnego użytku / udostępniania.
Pobierz go z GitHub .
źródło
Oto bardziej złożone rozwiązanie. Otrzymasz pełny ślad stosu, a metoda toString () zostanie wywołana tylko w razie potrzeby (Performance). Atrybut BuildConfig.DEBUG będzie miał wartość false w trybie produkcyjnym, więc wszystkie dzienniki śledzenia i debugowania zostaną usunięte. Kompilator punktu aktywnego ma szansę usunąć wywołania, ponieważ wyłącza końcowe właściwości statyczne.
użyj w ten sposób:
źródło
W bardzo prostym scenariuszu rejestrowania, w którym dosłownie po prostu próbujesz pisać na konsoli podczas programowania w celu debugowania, najłatwiej będzie po prostu przeprowadzić wyszukiwanie i zamianę przed kompilacją produkcyjną i skomentować wszystkie wywołania dziennika lub systemu. out.println.
Na przykład zakładając, że nie korzystałeś z „Dziennika”. Gdziekolwiek poza wywołaniem Log.d lub Log.e, itp., możesz po prostu znaleźć i zamienić w całym rozwiązaniu, aby zastąpić „Log”. z „// Log”. aby zakomentować wszystkie wywołania logowania lub w moim przypadku wszędzie używam System.out.println, więc przed przejściem do produkcji po prostu przeprowadzę pełne wyszukiwanie i zastąpię „System.out.println” i zastąpię ciągiem „//System.out.println”.
Wiem, że to nie jest idealne i byłoby miło, gdyby możliwość znajdowania i komentowania wywołań Log i System.out.println została wbudowana w Eclipse, ale dopóki to się nie stanie, najłatwiejszym, najszybszym i najlepszym sposobem na to jest do komentowania przez wyszukiwanie i zamianę. Jeśli to zrobisz, nie musisz się martwić o niezgodność numerów wierszy śledzenia stosu, ponieważ edytujesz kod źródłowy i nie dodajesz żadnych narzutów, sprawdzając konfigurację na poziomie dziennika itp.
źródło
W moich aplikacjach mam klasę, która otacza klasę Log, która ma statyczną zmienną logiczną o nazwie „stan”. W całym kodzie sprawdzam wartość zmiennej „stan” za pomocą metody statycznej, zanim zacznę pisać do dziennika. Następnie mam statyczną metodę ustawiania zmiennej „stan”, która zapewnia, że wartość jest wspólna dla wszystkich wystąpień utworzonych przez aplikację. Oznacza to, że mogę włączyć lub wyłączyć wszystkie rejestrowanie aplikacji w jednym wywołaniu - nawet gdy aplikacja jest uruchomiona. Przydatne w przypadku połączeń z pomocą techniczną ... Oznacza to, że podczas debugowania musisz trzymać się swojej broni i nie cofać się do korzystania ze standardowej klasy Log ...
Przydatne (wygodne) jest również to, że Java interpretuje zmienną logiczną jako fałsz, jeśli nie została przypisana wartość, co oznacza, że można ją pozostawić jako fałsz do momentu włączenia logowania :-)
źródło
Możemy użyć klasy
Log
w naszym komponencie lokalnym i zdefiniować metody jako v / i / e / d. W zależności od potrzeby możemy zadzwonić dalej.przykład pokazano poniżej.
tutaj komunikat jest dla
string
iargs
jest wartością, którą chcesz wydrukować.źródło
Dla mnie często przydatna jest możliwość ustawienia różnych poziomów dziennika dla każdego TAG.
Używam tej bardzo prostej klasy opakowującej:
Teraz po prostu ustaw poziom dziennika na TAG na początku każdej klasy:
źródło
Innym sposobem jest użycie platformy logowania, która ma możliwość otwierania i zamykania logów. Może to zapewnić dużą elastyczność czasami nawet w aplikacji produkcyjnej, w której dzienniki powinny być otwarte, a które zamknięte w zależności od problemów, na przykład:
źródło