Rust 로그를 Android Logcat에 출력하는 방법

배경

Rust에서 println!을 사용해 로그를 출력하면 표준 출력(stdout)으로 전송됩니다. 그러나 Android Logcat은 애플리케이션 로그 정보를 처리하고 표시하는 전용 시스템으로, Android 환경에서는 표준 출력 구현이 재정의됩니다. 따라서 Rust 로그가 Logcat에 나타나지 않는 문제가 발생합니다.

android_logger는 Android의 로깅 시스템과 직접 연동되어 로그 정보가 Logcat에 올바르게 표시되도록 합니다.

설정

android_logger의 사용 방법은 다음과 같습니다. (이 예제에서는 버전 0.11.0을 사용하며, 최신 버전 사용 시 API가 변경될 수 있습니다.)

cargo.toml에 다음 의존성을 추가합니다:

[dependencies]
log = "0.4"

[target.'cfg(target_os = "android")'.dependencies]
android_logger = "0.11.0"

log를 함께 추가하는 이유:

  • log는 로그 메시지 기록을 위한 통합 인터페이스(info!, warn!, error! 등)를 제공하는 추상 라이브러리입니다. android_logger는 Android 플랫폼을 위한 구체적인 구현체입니다.
  • android_logger가 내부적으로 log에 의존하지만, log::LevelFilterlog::Level::Debug와 같은 항목은 여전히 log 라이브러리를 명시적으로 참조해야 합니다.

초기화

#[cfg(target_os = "android")]
fn init_logging() {
    android_logger::init_once(
        android_logger::Config::default()
            .with_min_level(log::Level::Debug)
            .with_tag("flutter"),
    );
}

with_min_level의 레벨을 주의하세요. Debug로 설정하면 Debug 이상의 레벨만 출력되며, Info 레벨은 Logcat에 표시되지 않습니다.

사용

Rust 파일에서 다음과 같이 선언합니다:

extern crate android_logger;

로그 출력 예제:

impl PlatformTextureWithProvider for BoxedPixelData {
    fn create_texture(
        engine_handle: i64,
        payload_provider: Arc<dyn PayloadProvider<Self>>,
    ) -> Result<PlatformTexture<BoxedPixelData>> {
        // 사용 예시
        log::debug!("2222222223 create_texture");
        log::debug!("this is a debug {}", "raynor");

        PlatformTexture::new(engine_handle, Some(payload_provider))
    }
}

Android 기기를 연결하고 flutter run을 실행하면 Logcat 출력이 다음과 같이 나타납니다:

√ Built build\app\outputs\flutter-apk\app-debug.apk
Installing build\app\outputs\flutter-apk\app-debug.apk...           6.3s
W/FlutterAnimationAdvance( 3237): FlutterAnimationAdvance getInstance()
D/flutter ( 3237): irondash_texture::platform::platform_impl: 2222222223 create_texture
D/flutter ( 3237): irondash_texture::platform::platform_impl: this is a debug raynor

참고사항

매 실행마다 라이브러리가 다시 컴파일되므로, Rust에서 로그를 수정한 후 매번 cargo clean을 실행할 필요가 없습니다. 플랫폼 지원 명령어(예: Flutter의 경우 flutter run)를 직접 실행하면 수정된 로그가 반영되어 출력됩니다.

태그: Rust Android Flutter Logcat android_logger

7월 29일 20:43에 게시됨