Ten artykuł opisuje proces logowania, w tym standardy logów, wskazówki dotyczące poziomów klas, celów i przybliżeń wieloskładowych.
Standardy logów
Logowanie się na urządzeniu z Androidem jest skomplikowane ze względu na połączenie standardów, które są stosowane
logcat
łącznie. Poniżej przedstawiamy główne używane standardy:
Źródło | Przykłady | Wskazówki na poziomie stosu |
---|---|---|
RFC 5424 (standardowe: syslog ) |
Jądro Linuksa, wiele aplikacji Unix | Jądro, demony systemowe |
android.util.Log |
Platforma Androida i logowanie aplikacji | platforma Androida i aplikacja systemowa |
java.util.logging.Level |
Ogólne logowanie w Javie | aplikacja niesystemowa |
Rysunek 1. Standardy poziomów logu.
Chociaż każdy z tych standardów ma podobną konstrukcję, różnią się szczegółowość danych. Przybliżone odpowiedniki tych standardów są następujące:
RFC 5424 – poziom | Poziom ważności RFC 5424 | Opis RFC 5424 | android.util.Log | java.util.logging.Level |
---|---|---|---|---|
0 | Alarmowe | System jest bezużyteczny | Log.e / Log.wtf |
SEVERE |
1 | Alert | Działanie należy podjąć natychmiast | Log.e / Log.wtf |
SEVERE |
2 | Krytyczny | Warunki krytyczne | Log.e / Log.wtf |
SEVERE |
3 | Błąd | Warunki błędu | Log.e |
SEVERE |
4 | Upomnienie | Warunki ostrzeżenia | Log.w |
WARNING |
5 | Uwaga | Normalne, ale istotne | Log.w |
WARNING |
6 | Informacje | Komunikaty informacyjne | Log.i |
INFO |
7 | Debuguj | Komunikaty na poziomie debugowania | Log.d |
CONFIG , FINE |
- | - | Szczegółowe komunikaty | Log.v |
FINER /FINEST |
Rysunek 2. Poziomy rejestrowania danych syslog
, Androida i Javy.
Wytyczne dotyczące poziomu rejestrowania
Dla każdego standardu logów istnieją wytyczne. Wybrany wpis
jest zgodny z odpowiednim używanym standardem, takim jak syslog
do tworzenia jądra systemu operacyjnego.
Zamówienia na poziomie logu (od najmniej do największej liczby) są przedstawione na 3 poniższych ilustracjach:
ERROR |
Te dzienniki są zawsze przechowywane. |
WARN |
Te dzienniki są zawsze przechowywane. |
INFO |
Te dzienniki są zawsze przechowywane. |
DEBUG |
Logi są kompilowane, ale nieaktualne w czasie działania. |
VERBOSE |
Dzienniki te nie są kompilowane w aplikację z wyjątkiem przypadków, w Google Cloud. |
Rysunek 3. android.util.Log
CONFIG |
Poziom komunikatów w przypadku statycznych komunikatów konfiguracji |
FINE |
Poziom wiadomości dostarczający informacje umożliwiające śledzenie |
FINER |
Wskazuje dość szczegółowy komunikat śledzący |
FINEST |
Wskazuje bardzo szczegółowy komunikat śledzenia |
INFO |
Poziom wiadomości informacyjnych |
SEVERE |
Poziom komunikatu wskazujący poważną awarię |
WARNING |
Poziom wiadomości wskazujący potencjalny problem |
Rysunek 4. java.util.Logging.Level
0 | Alarmowe | System jest bezużyteczny |
1 | Alert | Działanie należy podjąć natychmiast |
2 | Krytyczny | Warunki krytyczne |
3 | Błąd | Warunki błędu |
4 | Upomnienie | Warunki ostrzeżenia |
5 | Uwaga | Stan normalny, ale istotny |
6 | Informacyjne | Komunikaty informacyjne |
7 | Debuguj | Komunikaty na poziomie debugowania |
Rysunek 5. RFC 5424
– Sekcja
6.2.1.
Logowanie aplikacji
Logowanie selektywne jest wykonywane przez klasę TAG
przez android.util.Log
przy użyciu Log#isLoggable
,
jak poniżej:
if (Log.isLoggable("FOO_TAG", Log.VERBOSE)) { Log.v("FOO_TAG", "Message for logging."); } |
---|
Logi można dostroić w czasie działania, aby zapewnić wybór odpowiedniego poziomu rejestrowania poniżej:
adb shell setprop log.tag.FOO_TAG VERBOSE |
---|
Właściwości log.tag.*
są resetowane po ponownym uruchomieniu. Istnieją
trwałe warianty, które również nie ulegną zmianie po ponownym uruchomieniu. Zobacz poniżej:
adb shell setprop persist.log.tag.FOO_TAG VERBOSE |
---|
Kontrole Log#isLoggable
zostawiają ślady logu w kodzie aplikacji. Wartość logiczna
Flagi DEBUG
pomijają logi czasu przy użyciu optymalizacji kompilatora ustawionego na
false
, jak pokazano poniżej:
private final static boolean DEBUG = false; |
---|
Logowanie można usunąć dla poszczególnych plików APK za pomocą zestawów reguł ProGuard na stronie R8
czas kompilowania. W przykładzie poniżej usunięto wszystkie elementy poniżej poziomu INFO
logowanie dla android.util.Log
:
# This allows proguard to strip isLoggable() blocks containing only <=INFO log # code from release builds. -assumenosideeffects class android.util.Log { static *** i(...); static *** d(...); static *** v(...); static *** isLoggable(...); } -maximumremovedandroidloglevel 4 |
---|
Przydaje się to do obsługi wielu typów kompilacji aplikacji (na (np. kompilacje rozwojowe i wersje), w których bazowym kodem jest powinny być takie same, ale dozwolone poziomy logowania są inne. Bezpośrednio zasady muszą być skonfigurowane i przestrzegane w przypadku aplikacji (zwłaszcza aplikacji), aby określić wpływ typów kompilacji i oczekiwań dotyczących wersji na dziennik. dane wyjściowe.
Logowanie systemowe w środowisku wykonawczym Androida (ART)
Istnieje kilka klas dostępnych dla systemu Aplikacje i usługi:
Zajęcia | Cel |
---|---|
android.telephony.Rlog |
Rejestrowanie radiowe |
android.util.Log |
Ogólne rejestrowanie aplikacji |
android.util.EventLog |
Rejestrowanie zdarzeń diagnostycznych integratora systemów |
android.util.Slog |
Logowanie platformy platformy |
Rysunek 6. Dostępne klasy i cele dzienników systemowych
Mimo że android.util.Log
i android.util.Slog
używają tego samego poziomu logowania
standardem Slog
jest klasa @hide
, której można używać tylko na platformie. EventLog
poziomy są mapowane na wpisy w event.logtags
w folderze /system/etc/event-log-tags
.
Logowanie natywne
Logowanie w C/C++ jest zgodne ze standardem syslog
, a zasada syslog
(2) odpowiada
jądro Linuksa syslog
, które steruje buforem printk
, oraz syslog
(3)
odpowiadające ogólnemu rejestratorowi systemowemu. Android używa: liblog
do ogólnego rejestrowania systemu.
liblog
udostępnia kod dla grup logów podrzędnych przy użyciu tego makra
formularz:
[Sublog Buffer ID] LOG [Log Level ID] |
Na przykład RLOGD
odpowiada [Radio log buffer ID] LOG [Debug Level]
.
Główne kody towarzyszące liblog
są takie:
Zajęcia tworzenia kodu | Przykładowe funkcje |
---|---|
log_main.h |
ALOGV , ALOGW |
log_radio.h |
RLOGD , RLOGE |
log_system.h |
SLOGI , SLOGW |
Rysunek 7. Kody typu liblog
.
Android ma wyższe interfejsy logowania, faworyzowane w porównaniu z bezpośrednimi
Wykorzystanie usługi liblog
widoczne poniżej:
Biblioteka | Wykorzystanie |
---|---|
async_safe |
Biblioteka tylko do logowania w środowiskach bezpiecznych dla sygnałów asynchronicznych |
libbase |
Biblioteka Logging zapewniająca interfejs strumienia C++ do logowania, podobny do
Logowanie w stylu Google (glog). Projektu libbase można używać w obu projektach zewnętrznych
i jest dostępny w aplikacjach używających libbase_ndk . |
Rysunek 8. Biblioteki logów wyższego poziomu
Przybliżenia stosu wieloskładnikowego
Ze względu na różnice w stopniu szczegółowości i zamiarach poziomu nie można jednoznacznie
dopasowania dokładnego do różnych standardów logowania. Na przykład parametr
Poziomy java.util.logging.Level
i android.util.Log
logów błędów nie są
Mecz 1:1:
java.util.Logging.Level | android.util.Log |
---|---|
LICZBA | Log.wtf |
LICZBA | Log.e |
Rysunek 9. Poziom błędów w standardowym logowaniu w języku Java i w Androidzie logowanie.
W takich przypadkach należy użyć indywidualnego standardu, aby określić, który poziom
zastosuj.
Podczas tworzenia systemu z użyciem wielu komponentów na poziomie stosu postępuj zgodnie z Rysunek 1, który pokazuje, którego standardu należy użyć w przypadku każdego komponentu. Aby uzyskać przybliżoną przewodnika po komunikatach na różnych poziomach, rys. 2.
Prywatność i bezpieczeństwo
Nie zapisuj informacji umożliwiających identyfikację. Ten zawiera m.in.:
- Adresy e-mail
- numery telefonów;
- imiona i nazwiska,
Podobnie pewne szczegóły są uznawane za poufne, nawet jeśli nie są jednoznacznie umożliwiających identyfikację.
Na przykład informacje o strefie czasowej nie są uznawane za umożliwiające identyfikację,
wskazuje przybliżoną lokalizację użytkownika.
Zasady dotyczące logów i akceptowane szczegóły muszą być traktowane jako część zabezpieczeń weryfikacji prywatności przed publikacją.
Dzienniki urządzenia
Dostęp do wszystkich dzienników urządzenia, w tym do korzystania
android.permission.READ_LOGS
jest ograniczony:
- Jeśli aplikacja działająca w tle poprosi o dostęp do wszystkich dzienników urządzenia, żądanie zostanie wysłane automatycznie. odmowa, chyba że aplikacja:
- Udostępnia identyfikator UID systemu.
- Wykorzystuje natywny proces systemu (
UID
<APP_UID
). - Używana strefa czasowa:
DropBoxManager
. - Uzyskuje dostęp tylko do bufora dziennika zdarzeń.
- Używa interfejsu API
EventLog
. - Wykorzystuje testy instrumentowane.
- Jeśli aplikacja na pierwszym planie z funkcją
READ_LOGS
prosi o dostęp do dzienników urządzenia, funkcja prosi użytkownika o zatwierdzenie lub odrzucenie prośby o dostęp.