Seu aplicativo funciona perfeitamente? Vamos verificar
\n\nVocê já colocou um aplicativo Swift em produção e rezou para que ele não quebrasse? Eu sim. E toda vez que um usuário escrevia "travou", eu me sentia um gatinho cego. O registro e o monitoramento são os olhos e ouvidos que transformam o caos em ordem. Sem eles, você adivinha o que deu errado. Com eles, você vê cada passo.
\n\nNeste artigo, vamos abordar como configurar o monitoramento de aplicativos Swift para que você durma tranquilo. Nada de teoria seca — apenas código vivo, casos reais e truques que coletei ao longo dos anos. Vamos nessa!
\n\nPor que o registro em Swift não é apenas print()
\n\nO primeiro impulso de qualquer desenvolvedor é colocar print("aqui tudo quebrou") em cada esquina. E isso funciona... até você lançar o aplicativo. Em produção, o print desaparece no vazio, e o usuário fica sozinho com o bug. Precisamos de algo mais.
O registro moderno de aplicativos Swift são dados estruturados, níveis de importância e a capacidade de coleta remota. A Apple nos dá uma ferramenta poderosa — o OSLog. Ele é leve, rápido e integrado diretamente ao sistema. Vamos ver como domá-lo.
\n\nOSLog: nível básico
\n\nImportamos o framework e criamos um logger:
\n\nimport OSLog\n\nlet logger = Logger(\n subsystem: "com.pythonlib.monitoring",\n category: "network"\n)\n\nfunc fetchUserData() {\n logger.info("Iniciando carregamento dos dados do usuário")\n // ... código da requisição ...\n logger.debug("Resposta recebida: \\(response.statusCode)")\n}\n\nObserve o subsystem e o category. Essas são suas tags para filtragem. Quando você tem 50 módulos, consegue filtrar apenas os logs de rede ou apenas os logs do banco de dados — sem ruído extra.
Níveis de registro: quando gritar e quando sussurrar
\n\nO OSLog suporta seis níveis. Veja como usá-los:
\n\n- \n
debug— para desenvolvimento, desativado na versão final (a menos que ativado explicitamente). \n info— informações úteis que não poluem o console. \n notice— eventos importantes, como inicialização bem-sucedida. \n error— erros que podem ser tratados. \n fault— falhas críticas, após as quais o aplicativo pode travar. \n
Exemplo com um erro real:
\n\nfunc handleApiError(_ error: Error) {\n logger.error("Erro de API: \\(error.localizedDescription, privacy: .public)")\n // privacy: .public — para ver o texto nos logs, caso contrário, será ocultado\n}\n\nMonitoramento de aplicativos Swift: métricas e desempenho
\n\nLogs são o passado. O monitoramento de aplicativos Swift é o presente. Você quer saber o que está acontecendo agora: quanta memória seu código está consumindo, se a animação não está travando, se a taxa de quadros não está caindo.
\n\nA Apple fornece o MetricKit — um framework para coleta de diagnósticos nos dispositivos dos usuários. Ele coleta relatórios de crash, dados de bateria e métricas de inicialização. Mas para um monitoramento completo, geralmente são integrados serviços de terceiros.
\n\nIntegrando o Crashlytics (Firebase) — rápido e doloroso
\n\nO Crashlytics continua sendo o padrão da indústria. Veja a configuração mínima:
\n\nimport FirebaseCrashlytics\n\n// Em algum lugar na inicialização do aplicativo\nCrashlytics.crashlytics().setUserID("user_123")\nCrashlytics.crashlytics().setCustomValue(true, forKey: "is_premium")\n\n// Registrando erros não fatais\ndo {\n try riskyOperation()\n} catch {\n Crashlytics.crashlytics().record(error: error)\n logger.error("Erro não fatal: \\(error)")\n}\n\nUm ponto importante: não registre dados pessoais do usuário sem consentimento. Use setUserID apenas se você tiver um identificador anonimizado.