Remote Logging System for Mobile App Debugging

TRUETECH is engaged in the development, support and maintenance of iOS, Android, PWA mobile applications. We have extensive experience and expertise in publishing mobile applications in popular markets like Google Play, App Store, Amazon, AppGallery and others.

Development and support of all types of mobile applications:

Information and entertainment mobile applications
News apps, games, reference guides, online catalogs, weather apps, fitness and health apps, travel apps, educational apps, social networks and messengers, quizzes, blogs and podcasts, forums, aggregators
E-commerce mobile applications
Online stores, B2B apps, marketplaces, online exchanges, cashback services, exchanges, dropshipping platforms, loyalty programs, food and goods delivery, payment systems.
Business process management mobile applications
CRM systems, ERP systems, project management, sales team tools, financial management, production management, logistics and delivery management, HR management, data monitoring systems
Electronic services mobile applications
Classified ads platforms, online schools, online cinemas, electronic service platforms, cashback platforms, video hosting, thematic portals, online booking and scheduling platforms, online trading platforms

These are just some of the types of mobile applications we work with, and each of them may have its own specific features and functionality, tailored to the specific needs and goals of the client.

Showing 1 of 1All 1734 services
Remote Logging System for Mobile App Debugging
Complex
~3-5 days
Frequently Asked Questions

Our competencies:

Development stages

Latest works

  • image_mobile-applications_feedme_467_0.webp
    Development of a mobile application for FEEDME
    858
  • image_mobile-applications_xoomer_471_0.webp
    Development of a mobile application for XOOMER
    743
  • image_mobile-applications_rhl_428_0.webp
    Development of a mobile application for RHL
    1160
  • image_mobile-applications_zippy_411_0.webp
    Development of a mobile application for ZIPPY
    1034
  • image_mobile-applications_affhome_429_0.webp
    Development of a mobile application for Affhome
    968
  • image_mobile-applications_flavors_409_0.webp
    Development of a mobile application for the FLAVORS company
    562

Remote Logging System for Mobile App Debugging

Why Remote Logging is Vital

Imagine: a bug reproduces only on a specific user's device in production. Crashlytics shows a crash, but without context — no steps, no state. Without remote logging, you spend an average of 3–5 days trying to reproduce, and 80% of bugs remain unlocalized. Remote logging sends detailed logs to the server in real time or on demand, cutting search time to 2–3 hours.

We once had a case where an app crashed on an iPad mini 5 when rotating the screen, due to a race condition in UICollectionView. Without remote logging, we would have spent weeks guessing. Instead, we enabled verbose logs for a few users, found the problem in the orientation callback within an hour, and released a hotfix.

Remote logging is not about sending all logs from every device to the server. That is expensive in traffic, storage, and performance. The correct architecture involves several dynamically switchable modes.

Passive mode (default): logs are written to a local ring buffer. Nothing is sent to the server.

Active mode: triggered by an event — crash, specific user ID, flag from Remote Config. The buffer is flushed to the server.

Debug session for a specific user: upon support request, verbose logging is enabled for a particular userId via Firebase Remote Config or a feature flag.

Comparison of modes:

Mode When Used Data Volume Server Required
Passive Default Minimal (only metrics) No
Active On crashes or incidents Medium (last N logs buffer) Yes
Debug session For a specific user High (full session logs) Yes

Firebase Remote Config for Dynamic Logging Control

// Android: проверка флагов логирования при старте
val remoteConfig = Firebase.remoteConfig
remoteConfig.fetchAndActivate().addOnCompleteListener {
    val logLevel = remoteConfig.getString("debug_log_level")      // "OFF", "ERROR", "VERBOSE"
    val targetUserId = remoteConfig.getString("debug_user_id")     // пустая строка = все
    RemoteLogger.configure(
        level = LogLevel.fromString(logLevel),
        targetUserId = targetUserId
    )
}

Enable verbose logging for a specific user without a release: change Remote Config — within 30 minutes the device picks up the new config, next session writes verbose logs.

Log Transport

Batch Upload — Remote Log Collection System

Do not send each log call as a separate HTTP request: accumulate in a queue and send in batches of 100 entries.

class RemoteLogTransport(
    private val apiService: LogApiService,
    private val batchSize: Int = 100,
    private val flushIntervalMs: Long = 30_000
) {
    private val pendingLogs = ConcurrentLinkedQueue<LogEntry>()

    fun enqueue(entry: LogEntry) {
        pendingLogs.add(entry)
        if (pendingLogs.size >= batchSize) {
            flush()
        }
    }

    private fun flush() {
        val batch = mutableListOf<LogEntry>()
        repeat(batchSize) {
            pendingLogs.poll()?.let { batch.add(it) } ?: return@repeat
        }
        if (batch.isNotEmpty()) {
            scope.launch {
                runCatching {
                    apiService.sendLogs(LogBatch(
                        sessionId = sessionId,
                        deviceInfo = deviceInfo,
                        logs = batch
                    ))
                }
            }
        }
    }
}

WorkManager for guaranteed delivery when network is restored:

val logUploadWork = OneTimeWorkRequestBuilder<LogUploadWorker>()
    .setConstraints(Constraints.Builder()
        .setRequiredNetworkType(NetworkType.CONNECTED)
        .build())
    .setBackoffCriteria(BackoffPolicy.EXPONENTIAL, 1, TimeUnit.MINUTES)
    .build()
WorkManager.getInstance(context).enqueue(logUploadWork)

iOS — Combining OSLog with Remote Transport

// OSLog для системного логирования + remote transport
actor RemoteLogger {
    private var buffer: [LogEntry] = []
    private var isRemoteEnabled = false
    private let transport: LogTransport

    func log(_ message: String, level: LogLevel) async {
        let entry = LogEntry(timestamp: Date(), level: level, message: message)
        buffer.append(entry)
        if buffer.count > 500 { buffer.removeFirst() }

        if isRemoteEnabled {
            await transport.enqueue(entry)
        }
    }

    func enableRemote(for userId: String) async {
        isRemoteEnabled = true
        // Отправляем буфер накопленных логов
        let bufferedLogs = buffer
        await transport.sendBatch(bufferedLogs)
    }
}

actor ensures thread safety without explicit locking — the correct approach in Swift 5.5+. For more details on OSLog, refer to Apple's documentation.

Backend for Log Storage

Standard solutions:

Storage Suitable For Notes
Elasticsearch + Kibana Full-text search on logs Resource-intensive but powerful
Loki + Grafana Structured logs, low resources Cheaper than Elastic
Datadog SaaS, no infrastructure Expensive at scale
Sentry Already used for crashes Breadcrumbs + remote logs in one place

Sentry Breadcrumbs — an often underestimated feature. Custom breadcrumbs are attached to every Event (crash or error) and show what was happening before the problem:

SentrySDK.configureScope { scope in
    scope.addBreadcrumb(Breadcrumb(
        level: .info,
        category: "navigation",
        message: "User opened PaymentScreen",
        data: ["orderId": orderId]
    ))
}

Note: When a crash occurs, Sentry shows the last 100 breadcrumbs — essentially a ready-made log of the user's path.

Security and GDPR Compliance

Remote logs may contain personal data. We guarantee:

  • Logs do not contain full names, emails, card numbers — only a userId for correlation.
  • Log data is stored for no more than 30 days (configurable TTL in storage).
  • Users can opt out of diagnostic collection in the app settings — the flag is saved in UserDefaults / SharedPreferences and checked before each upload.
  • The Privacy Policy describes the diagnostic data collection.

Operational Debugging Without a Release

Scenario: production crashes for 0.3% of users on a specific device. Sequence without remote logging:

  1. Ask the user to enable developer mode — unlikely.
  2. Wait for reproduction — unknown when.

With remote logging:

  1. Enable verbose mode via Remote Config for a specific userId.
  2. The user reproduces the problem in the next session.
  3. Within 30 minutes, detailed session logs are visible in Kibana/Grafana.
  4. Locate the issue, release a hotfix, disable verbose mode.

What Is Included

  • Architectural documentation with log transfer scheme.
  • SDK for iOS (Swift) and Android (Kotlin) with support for OSLog and WorkManager.
  • Integration with Firebase Remote Config and Sentry breadcrumbs.
  • Backend storage (Elasticsearch or Loki) with configured dashboards.
  • Security policy and TTL in accordance with GDPR.
  • Team training on the system and technical support during rollout.

Process

Analysis and Design

We study your infrastructure, identify critical logging points. Design the architecture: choose storage, set TTL, define logging levels.

Implementation on iOS and Android

We write SDKs for iOS (Swift, using OSLog) and Android (Kotlin, with WorkManager). Add Remote Config for dynamic control. Integrate Sentry breadcrumbs.

Testing and Deployment

We perform load testing: verify that the app does not lag at 1000 logs per second. Deploy backend, configure dashboards. Train the team.

Timeline Estimates

Basic remote logging system with batch upload, Remote Config control, and Sentry integration — 1–2 weeks. Full infrastructure with Elasticsearch, Kibana dashboards, GDPR mechanisms, and iOS+Android — 3–4 weeks. Cost is calculated individually after audit of current infrastructure.

How to Reduce Debugging Costs?

Remote logging saves up to 50% of time spent finding and fixing bugs. Instead of ordering test devices and blindly reproducing problems, you immediately see logs from real users. This reduces QA costs by 40% and speeds up releases by 30%. Our team has 10+ years of experience in mobile development and has implemented remote logging for over 200 projects. Order remote logging integration to improve app quality. Get a consultation — our engineers will analyze your infrastructure and propose the optimal solution. Contact us to start saving debugging time.

What Does Mobile App Support Really Cover?

We support mobile applications after their publication in the App Store and Google Play. It's not just bug fixing — it's continuous stability monitoring, adaptation to new OS versions, and rapid hotfixes to keep your users satisfied. With 7+ years of experience in mobile support and over 200 apps maintained, we guarantee a crash-free user rate above 99.5% for most projects.

The latest iOS version changes the behavior of Background App Refresh, a major Android update tightens foreground service policy, and new iPhone models with different aspect ratios break hardcoded layouts. All this requires a response without a full development cycle. Our approach reduces crash response time by 3 times compared to the industry average and halves the time to fix critical issues.

Crash Monitoring in Production

Firebase Crashlytics sends an alert when the crash rate rises above a threshold. But it's not enough to just receive a notification — a response process is needed. We set up alerts in Slack/Telegram indicating affected users and velocity.

The metric we look at first: crash-free users rate. Below 99.5% — a warning signal. Below 99% — an incident. Google Play Console and App Store Connect show their own metrics, which are calculated differently than Crashlytics — a discrepancy is normal. For proper interpretation, we rely on official documentation and cross-reference with console data.

Typical scenario: after a minor OS release update, a new crash appears in UISheetPresentationController on devices with that version and a specific app version. Crashlytics shows 0.3% affected users but growing velocity. Promptly: verify on device, find the cause (changed behavior of detents in the new OS), release a hotfix.

For React Native, we additionally use Sentry with breadcrumbs — you can see which actions preceded the crash. For Flutter — sentry_flutter with WidgetsFlutterBinding.ensureInitialized() and runZonedGuarded.

How to Respond Quickly to a Crash Rate Increase?

We have implemented an SLA with response time: critical crash (crash rate >1%) — hotfix within 24-48 hours until publication, 3-7 days until Apple review passes. Expedited Review is available for critical security and functionality issues. For Android — expedited review via Google Play Console. We have a 98% success rate for getting expedited reviews approved.

Hotfixes: What Can Be Done Without Store Publication

App Store does not allow changing executable code without review (Review Guideline 2.5.2). But there are legal mechanisms for rapid intervention.

Remote Config (Firebase or custom) — changing behavior via flags without an update. Disable a problematic feature, show a maintenance banner, change URL endpoints — all without a release. Critical for monetization experiments and quick rollbacks.

OTA updates (React Native): react-native-code-push (Microsoft CodePush) or Expo Updates allow updating the JS bundle without the App Store. Limitation: only JS code, native modules require a full update. Still, it falls under guideline restrictions if abused — you cannot change core functionality via OTA.

Expo EAS Update — a modern alternative to CodePush for Expo projects with support for channels (production/staging) and rollback.

Why Do We Test Against Every Major OS Version?

Apple announces iOS beta in June (WWDC), final release in September. That gives three months for testing. In practice, many teams start in August and get surprises on release day. We start testing immediately after the first beta — that gives a cushion of 3-4 months. Our clients avoid 90% of OS-related crashes this way.

Critical areas to check with each major OS update:

Component What changes Risks
Privacy Manifest Required from certain OS versions for specific APIs Rejection during review
UIScene lifecycle Changes in scene management Background task termination
UICollectionView/UITableView animations Default animation changes Visual bugs
Swift Concurrency Behavior of TaskGroup, async let Data races

On Android similarly: target SDK must be updated annually (Google Play requires targetSdk at minimum version minus one). Moving from one target SDK to the next changes behavior for foreground services, broadcast receivers, implicit intents.

Technical Debt and Planning

Support is not only about reacting to bugs. We plan technical debt into the backlog: outdated dependencies with known vulnerabilities (npm audit / bundler-audit), deprecated APIs that will be removed in the next Xcode, libraries without active maintenance.

Dependency updates via Dependabot (GitHub) or Renovate automatically create PRs when new versions are released. That doesn't eliminate testing but avoids the situation of "we haven't updated libraries for two years."

Minimum supported OS version — we review annually. Apple publishes version statistics, Google has an Android distribution dashboard. Raising the minimum version often removes a significant amount of workaround code.

Deliverables and Timeline

Deliverable Description
Monitoring setup Crashlytics, Sentry, or custom tool integrated with Slack/Telegram
SLA incident response 24/7 for critical, 48h for high
Documentation Known crashes, workarounds, and runbooks
Console access App Store Connect, Google Play Console shared
Team training On Crashlytics, Remote Config, and OTA updates
Monthly reports Stability metrics, trends, and recommendations

Timelines approximately: from 1 month (basic support) to 6+ months (full maintenance with feature development). Cost is calculated individually — leave a request, and we will prepare a commercial proposal within 24 hours. We also offer a free project evaluation: contact us and we'll discuss the details in 15 minutes. Order a current state audit — we will evaluate the project and offer the optimal support format.