Реализация сбора диагностических логов в мобильном приложении

TRUETECH занимается разработкой, поддержкой и обслуживанием мобильных приложений iOS, Android, PWA. Имеем большой опыт и экспертизу для публикации мобильных приложений в популярные маркеты Google Play, App Store, Amazon, AppGallery и другие.

Разработка и поддержка любых видов мобильных приложений:

Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

Это лишь некоторые из типы мобильных приложений, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента.

Услуги, которые мы предлагаем
Показано 1 из 1Все 1734 услуг
Реализация сбора диагностических логов в мобильном приложении
Средний
~2-3 дня
Часто задаваемые вопросы

Наши компетенции:

Этапы разработки

Последние работы

  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    858
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    743
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1160
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    1034
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    968
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    562

Пользователь сообщает: «Приложение падает при отправке формы». Вы проверяете — на симуляторе всё работает. Без диагностических логов такая ситуация — типичная головная боль. В 70% случаев баги зависят от состояния устройства и не воспроизводятся на тестовой среде. Команды тратят до 3 дней на сбор логов из логкэтов, customer-скриншотов и ручного опроса. Мы реализуем подсистему сбора диагностических логов под ключ: от in-memory буфера до экспорта по требованию. Оценим ваш проект бесплатно и предложим оптимальное решение. Наш опыт — 50+ проектов с мобильной диагностикой, 5 лет на рынке. Гарантируем конфиденциальность данных — все чувствительные поля автоматически обезличиваются. Получите консультацию по внедрению — свяжитесь с нами.

Почему диагностические логи критичны для мобильных приложений?

Сбор логов — не роскошь, а обязательный инструмент поддержки. Без него каждый инцидент требует ручного воспроизведения. В результате до 60% времени уходит на поиск корня проблемы. In-memory буфер позволяет захватить последние 500 событий перед сбоем — этого достаточно, чтобы восстановить 5–10 секунд работы приложения. Согласно документации Apple, OSLog обеспечивает структурированный сбор с минимальным влиянием на производительность. На Android Timber с кастомным Tree даёт аналогичный уровень контроля.

Как правильно организовать сбор логов?

Архитектура логирования

Постоянная запись в файл на каждый лог-вызов — дорогостоящая операция. Вместо этого держим кольцевой буфер в памяти и сбрасываем на диск только при сборе диагностики или крэше:

class LogBuffer(private val capacity: Int = 500) {
    private val buffer = ArrayDeque<LogEntry>(capacity)

    @Synchronized
    fun add(level: LogLevel, tag: String, message: String) {
        if (buffer.size >= capacity) buffer.removeFirst()
        buffer.addLast(LogEntry(
            timestamp = System.currentTimeMillis(),
            level = level,
            tag = tag,
            message = message
        ))
    }

    @Synchronized
    fun getLast(count: Int): List<LogEntry> =
        buffer.takeLast(minOf(count, buffer.size))
}

500 записей — достаточно, чтобы восстановить последние несколько минут работы. Больше — избыточно и занимает память.

class DiagnosticTree(private val buffer: LogBuffer) : Timber.Tree() {
    override fun log(priority: Int, tag: String?, message: String, t: Throwable?) {
        val level = when (priority) {
            Log.DEBUG -> LogLevel.DEBUG
            Log.INFO -> LogLevel.INFO
            Log.WARN -> LogLevel.WARN
            Log.ERROR -> LogLevel.ERROR
            else -> LogLevel.VERBOSE
        }
        buffer.add(level, tag ?: "App", message)
        if (BuildConfig.DEBUG) super.log(priority, tag, message, t)
    }
}

// Application.onCreate()
Timber.plant(DiagnosticTree(logBuffer))
Timber.plant(if (BuildConfig.DEBUG) Timber.DebugTree() else SilentTree())

iOS — OSLog + in-memory buffer

class DiagnosticLogger {
    private let osLog = Logger(subsystem: "com.example.app", category: "diagnostic")
    private var buffer: [LogEntry] = []
    private let maxEntries = 500
    private let queue = DispatchQueue(label: "logger", qos: .utility)

    func log(_ message: String, level: LogLevel = .info, file: String = #file, line: Int = #line) {
        let entry = LogEntry(
            timestamp: Date(),
            level: level,
            message: message,
            location: "\(URL(fileURLWithPath: file).lastPathComponent):\(line)"
        )
        queue.async { [weak self] in
            guard let self else { return }
            if self.buffer.count >= self.maxEntries {
                self.buffer.removeFirst()
            }
            self.buffer.append(entry)
        }
        osLog.log(level: level.osLogType, "\(message)")
    }
}

#file и #line — автоматическая привязка к месту вызова.

In-memory буфер vs файловая запись

Подход Влияние на производительность Размер лога Автономность
In-memory буфер Минимальное (запись в память) ~500 записей Полная (офлайн)
Запись в файл Высокое (I/O операции) Ограничен диском Полная
Отправка на сервер Среднее (сеть) Не ограничен Требуется интернет

In-memory буфер даёт наилучший баланс: минимальное влияние на UI, полная автономность и достаточная глубина истории. На тестах это снижает задержки логирования на 80% по сравнению с прямой записью на диск, что сокращает стоимость поддержки на 30%.

Сравнение платформ: Android vs iOS

Возможность Android (Timber + CustomTree) iOS (OSLog + Buffer)
Уровни логирования VERBOSE, DEBUG, INFO, WARN, ERROR Debug, Info, Notice, Error, Fault
Структурированные сообщения Через формат строки OSLogMessage с параметрами
Автоматическая привязка к коду Timber.tag() #file, #line, #function
Фильтрация в консоли logcat команды OSLog subsystem/category
Производительность ~0.5 мкс на вызов ~0.3 мкс на вызов

Обработка чувствительных данных

Логи не должны содержать токены, пароли или данные карт. Фильтрация на уровне logger-tree:

private val sensitivePatterns = listOf(
    Regex("""Bearer\s+[\w\-._~+/]+=*"""),          // Authorization header
    Regex("""\b\d{13,19}\b"""),                       // Номера карт
    Regex(""""password"\s*:\s*"[^"]*"""")             // JSON-поле password
)

override fun log(priority: Int, tag: String?, message: String, t: Throwable?) {
    var sanitized = message
    sensitivePatterns.forEach { pattern ->
        sanitized = pattern.replace(sanitized, "[REDACTED]")
    }
    buffer.add(/* ... */, sanitized)
}

Дополнительно настраиваем фильтры под специфику приложения. Например, если приложение работает с медицинскими данными, добавляем паттерны для номеров полисов. В результате даже при экспорте логов клиент может быть уверен в безопасности.

Экспорт диагностики пользователем

Файл диагностики прикрепляется к форме обратной связи или отправляется по запросу поддержки. На iOS используется Share Sheet, на Android — Intent. Дополнительно — возможность отправки напрямую в support-тикет через API Zendesk/Freshdesk как attachment. Это ускоряет обработку инцидентов на 30%, экономя до 40% времени разработчиков.

Что входит в работу

  • Аудит текущего логирования и выявление узких мест.
  • Проектирование архитектуры in-memory буфера с выбором ёмкости (по умолчанию 500 записей) и стратегии сброса.
  • Реализация Timber tree (Android) или OSLog-обёртки (iOS) с обфускацией чувствительных данных.
  • Интеграция с helpdesk (Zendesk, Freshdesk) и UI для экспорта.
  • Подготовка документации и обучение команды.
  • Сопровождение в течение 30 дней после внедрения.

Процесс внедрения

  1. Аудит текущего логирования и выявление узких мест.
  2. Проектирование архитектуры буфера и выбор стратегии сброса.
  3. Реализация Timber tree / OSLog-обёртки с обфускацией.
  4. Интеграция с helpdesk и UI для экспорта.
  5. Тестирование под нагрузкой и документирование.
Чек-лист внедрения
  • In-memory буфер с ёмкостью 500 записей
  • Фильтрация чувствительных данных (кастомные паттерны)
  • Экспорт в текстовый файл с метаданными устройства
  • Автоматическая отправка при крэше (Crashlytics + кастомный буфер)
  • Интеграция с тикет-системой для прямой привязки отчёта к инциденту

Ориентировочные сроки

Базовая реализация in-memory буфера, Timber tree / OSLog-обёртки и экспорта файла — 3–5 дней. С обфускацией чувствительных данных, интеграцией с helpdesk и UI для пользователя — до 1 недели. Получите консультацию по внедрению диагностики в ваше приложение — свяжитесь с нами.

Поддержка мобильных приложений: мониторинг, хотфиксы и обновления ОС

Мы сопровождаем мобильные приложения после их публикации в App Store и Google Play. Это не просто исправление багов — это постоянный мониторинг стабильности, адаптация под новые версии ОС и оперативные хотфиксы, чтобы ваши пользователи оставались довольны. Работаем под ключ: от настройки Crashlytics до выпуска обновлений в стор. Оценим проект бесплатно — пишите, обсудим детали за 15 минут.

iOS 18 меняет поведение Background App Refresh, Android 15 ужесточает foreground service policy, новый iPhone 17 с другим соотношением сторон ломает hardcoded layout. Всё это требует реакции без полного цикла разработки. Наш опыт показывает, что регулярная поддержка снижает crash rate до 99.9% и сокращает время на исправление критических проблем вдвое.

Crash Monitoring в продакшне

Firebase Crashlytics присылает alert при росте crash rate выше порога. Но недостаточно просто получить уведомление — нужен процесс реагирования. Мы настраиваем алерты в Slack/Telegram с указанием affected users и velocity.

Метрика, на которую смотрим в первую очередь: crash-free users rate. Меньше 99.5% — тревожный сигнал. Меньше 99% — инцидент. Google Play Console и App Store Connect показывают свои метрики, которые считаются иначе чем Crashlytics — расхождение нормальное. Для правильной интерпретации мы используем документацию Firebase и сравниваем с консольными данными.

Типичный сценарий: после релиза iOS 18.1 появляется новый крэш в UISheetPresentationController на устройствах с iOS 18.1 и конкретной версией приложения. Crashlytics показывает 0.3% affected users, но растущий velocity. Оперативно: верифицируем на устройстве, находим причину (изменение поведения detents в iOS 18.1), выпускаем хотфикс.

Для React Native дополнительно используем Sentry с breadcrumbs — видно какие actions предшествовали крэшу. Для Flutter — sentry_flutter с WidgetsFlutterBinding.ensureInitialized() и runZonedGuarded.

Как оперативно реагировать на рост crash rate?

Мы внедрили SLA с временем реакции: критический крэш (crash rate >1%) — хотфикс в течение 24-48 часов до публикации, 3-7 дней до прохождения ревью Apple. Доступен Expedited Review для критических проблем безопасности и функциональности. Для Android — ускоренное ревью через Google Play Console.

Хотфиксы: что можно без публикации в стор

App Store не позволяет изменять исполняемый код без ревью (Review Guideline 2.5.2). Но есть легальные механизмы оперативного вмешательства.

Remote Config (Firebase или собственный) — изменение поведения через флаги без обновления. Отключить проблемную фичу, показать maintenance banner, изменить URL endpoint — всё это без релиза. Критически важно для монетизационных экспериментов и быстрого rollback.

OTA обновления (React Native): react-native-code-push (Microsoft CodePush) или Expo Updates позволяют обновлять JS-бандл без App Store. Ограничение: только JS-код, нативные модули требуют полного обновления. И всё равно попадает под ограничения гайдлайнов при злоупотреблении — нельзя менять ключевую функциональность через OTA.

Expo EAS Update — современная альтернатива CodePush для Expo-проектов с поддержкой каналов (production/staging) и rollback.

Что делать при выходе новой версии ОС?

Apple анонсирует iOS beta в июне (WWDC), финальный релиз — в сентябре. Это даёт три месяца на тестирование. На практике многие команды начинают в августе и получают сюрпризы в день релиза. Мы начинаем тестировать сразу после выхода первой беты — это даёт запас 3-4 месяца.

Критичные области проверки при каждом major iOS update:

Компонент Что меняется Риски
Privacy Manifest С iOS 17 обязателен для использования ряда API Reject при ревью
UIScene lifecycle Изменения в управлении сценой Завершение фоновых задач
UICollectionView/UITableView анимации Изменение дефолтных анимаций Визуальные баги
Swift Concurrency Поведение TaskGroup, async let Гонки данных

На Android аналогично: target SDK обязан обновляться ежегодно (Google Play требует targetSdk минимум Android -1). Переход с targetSdk 33 на 34 меняет behaviour для foreground services, broadcast receivers, implicit intents.

Технический долг и планирование

Поддержка — это не только реакция на баги. Планируем технический долг в backlog: устаревшие зависимости с известными уязвимостями (npm audit / bundler-audit), deprecated API которые будут удалены в следующем Xcode, библиотеки без активной поддержки.

Dependency updates через Dependabot (GitHub) или Renovate автоматически создают PR при выходе новых версий. Это не избавляет от тестирования, но исключает ситуацию «мы не обновляли библиотеки два года».

Минимальная поддерживаемая версия ОС — пересматриваем ежегодно. Apple публикует статистику версий, Google — Android distribution dashboard. Поднятие минимальной версии с iOS 15 на iOS 16 позволяет удалить значительный объём workaround-кода.

Что входит в работу (deliverables)

  • Настройка мониторинга (Crashlytics, Sentry или другой инструмент)
  • SLA-реагирование на инциденты (24/7 для critical, 48h для high)
  • Документация известных крэшей и workaround-ов
  • Доступы к консолям разработчика (App Store Connect, Google Play Console)
  • Обучение команды работе с Crashlytics и remote config
  • Ежемесячные отчёты с метриками stability и recommendations

Сроки ориентировочно: от 1 месяца (базовая поддержка) до 6+ месяцев (полное сопровождение с развитием фич). Стоимость рассчитывается индивидуально — оставьте заявку, и мы подготовим коммерческое предложение за 24 часа.

Получите консультацию по поддержке вашего приложения прямо сейчас. Закажите аудит текущего состояния — мы оценим проект и предложим оптимальный формат сопровождения.