Informacje o logowaniu

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;

… If (DEBUG) { Log.v("FOO_TAG", "Extra debug logging."); }

.

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.

.