Dlaczego warto używać Logger over print do rejestrowania danych aplikacji.
Jestem pewien, że wielu z was miało ten problem, gdy wkleiłeś trochę logowania do swojego kodu i nagle problem przestał się pojawiać, ponieważ zmieniłeś czas. Potrzebujesz bardzo szybkiego interfejsu rejestrowania, który ma minimalny wpływ na Twój kod. Kolejną rzeczą, którą powinieneś wziąć pod uwagę, jest prywatność.
Zunifikowany interfejs Apple Logging API, znany również jako os_log, ułatwia nam życie. Firma Apple wprowadziła os_log w 2016 r. i Logger w 2020 r. Jeśli urządzenie jest podłączone do komputera Mac, możesz przesyłać strumieniowo komunikaty dziennika w aplikacji Console. Jeśli Twoja aplikacja jest uruchamiana z Xcode, zobaczysz je również w konsoli Xcode. Możesz także zbierać dzienniki po zakończeniu działania aplikacji.
Pomoże ci to poprawić błąd, gdy nie możesz go odtworzyć
Gdy aplikacja rejestruje wiadomość, system operacyjny przechowuje ją na urządzeniu w postaci skompresowanej. Możesz użyć polecenia „log collect” na komputerze Mac, aby pobrać te dzienniki:
- Podłącz swoje urządzenie do komputera Mac
- Uruchom polecenie „log collect” z terminala z opcją urządzenia. Rozpocznij czas, od którego potrzebujesz dzienników, i podaj nazwę pliku do przechowywania dziennika.
- Otwórz plik dziennika w aplikacji konsoli. Tutaj możesz przeglądać i filtrować logi i zrozumieć, co było przyczyną błędu.
Tworząc Logger
strukturę, przypisz opcjonalny podsystem i ciąg kategorii, aby dodać kontekst do wszystkich rejestrowanych komunikatów. Podsystem odpowiada dużemu obszarowi funkcjonalnemu Twojej aplikacji, a kategoria odpowiada określonemu obszarowi w ramach określonego podsystemu. Podczas diagnozowania problemów użyj tych ciągów, aby odfiltrować niepowiązane komunikaty.
let logger = Logger(subsystem: "com.example.Wallet", category: "networking")
Możesz wybrać ważność swojej wiadomości z tych poziomów dziennika. Poziomy błędów i usterek są wyróżnione żółtymi i czerwonymi bąbelkami w aplikacji Console.
logger.log(level: .error, "Network error")
Debugowanie: nieutrwalone, co oznacza, że nie można ich odzyskać po zakończeniu wykonywania aplikacji.
Informacje: w większości nie są utrwalane, z wyjątkiem sytuacji, gdy są generowane na kilka chwil przed poleceniem zbierania dziennika.
Wiadomości rejestrowane na każdym innym poziomie są trwałe i można je odzyskać później.
Istnieje jednak limit przechowywania dotyczący liczby archiwizowanych wiadomości. Po przekroczeniu tego limitu starsze są usuwane i stają się niedostępne. Komunikaty poziomu błędu i błędu są utrzymywane nawet dłużej niż komunikaty poziomu powiadomienia. Zazwyczaj wiadomości będą przechowywane przez kilka dni. Zależy to jednak od miejsca w pamięci Twojego urządzenia.
Rzecz, o której powinieneś pamiętać: poziomy dziennika również wpływają na wydajność.
Mimo że logowanie ogólnie ma niski narzut, poziomy rejestrowania mają różną wydajność w stosunku do siebie. Poziomy, które są mniej ważne, są szybsze. Poziom błędu jest najwolniejszy, a poziom debugowania jest najbardziej wydajny.
Rejestrowanie na poziomie debugowania jest tak szybkie, ponieważ komunikaty debugowania w ogóle nie są utrwalane. Są odrzucane, gdy dzienniki nie są przesyłane strumieniowo. Ponadto kompilator Swift wykorzystuje wyrafinowane optymalizacje, aby zapewnić, że kod tworzący komunikaty nie zostanie wykonany nawet po odrzuceniu komunikatów debugowania. Oznacza to, że możesz rejestrować pełne komunikaty na poziomie debugowania i wywoływać drogie funkcje w celu konstruowania komunikatów. Twoi użytkownicy nie zapłacą za nie kosztów. Co jest naprawdę fajną rzeczą, nie musisz już martwić się o wydajność.
Prywatność
Możesz użyć opcji prywatności, aby kontrolować widoczność danych w logach. Naprawdę ważne jest, aby poważnie traktować prywatność zarejestrowanych danych. Dzieje się tak, ponieważ rejestrowanie odbywa się przez cały czas, nawet po wysłaniu aplikacji i znalezieniu się w rękach użytkowników. Logi może gromadzić każdy, kto ma fizyczny dostęp do urządzenia, a także jego hasło. Dlatego ważne jest, aby komunikaty dziennika nie oznaczały żadnych danych osobowych jako publicznych, co mogłoby je ujawnić w dziennikach. Możesz także wybrać .private z funkcją haszującą, która pomoże Ci zobaczyć, kiedy dwie wiadomości są równe, bez ujawniania ich wartości.
logger.log("Request: \(request.body, privacy: .private)")
logger.log("Account Number: \(accountNumber, privacy: .private(mask: .hash))")
Możesz rejestrować dane wykonawcze w wiadomości. W przeciwieństwie do drukowania, komunikat dziennika nie jest w pełni konwertowany na ciąg znaków, ponieważ byłoby to zbyt wolne. Zamiast tego kompilator i biblioteka rejestrowania współpracują ze sobą, aby stworzyć wysoce zoptymalizowaną reprezentację komunikatu dziennika, która wykorzystuje typ rejestrowanych danych. Dzięki zoptymalizowanej reprezentacji koszt konwersji na ciąg znaków ponosisz tylko wtedy, gdy komunikat dziennika jest faktycznie wyświetlany. Komunikaty dziennika mogą zawierać wiele różnych typów danych. Możesz rejestrować typy liczbowe, takie jak Int i Double, obiekty Objective-C, a także dowolny typ zgodny z protokołem Swift's CustomStringConvertible. Oznacza to, że aby dodać własny typ do komunikatu dziennika, wszystko, co musisz zrobić, to dostosować go do CustomStringConvertible.
Formatowanie
Możesz użyć opcjonalnych parametrów „format” i „align”, aby sformatować dane. Ponieważ formatowanie danych za pomocą interfejsów API rejestrowania nie zwiększa kosztu wywołania dziennika, możesz używać formatowania tak często, jak chcesz, aby Twoje dane wyglądały ładnie i były łatwe do zrozumienia.
Możesz zobaczyć pełen zakres opcji przy użyciu uzupełniania kodu Xcode, w tym formatowanie liczb jako szesnastkowe, ósemkowe, wykładnicze i inne.
Korzyści płynące z używania Logger over print to prywatność, interpolacja ciągów znaków, niski narzut związany z wydajnością, różne poziomy rejestrowania dla różnych zastosowań, formatowanie bez kosztów, łatwe filtrowanie i trwałość.