-->

[Kotlin] Local Storage에 logcat파일 만들기

 

Web Application은 서버에 로그가 남지만 Android 같은 경우에 테스트할 때가 아니면 각각의 디바이스 내에 로그가 생성되어 확인하기가 어렵다.

지금은 ADB를 이용한 Wifi logging이 가능하고 또 온라인 환경에서는 서버로 바로 로그를 보낼 수 있지만..

특히 오프라인 환경에는 더욱 에러트레이스 하기 어렵다.

따라서 앱이 기동되었을 때 로그 파일을 생성할 수 있도록 해보자.

 

1. AndroidManifest.xml

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
        tools:ignore="ScopedStorage" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.READ_LOGS"
        tools:ignore="ProtectedPermissions" />

세 개의 권한을 부여하자.

 

2. 함수 생성

fun setLogFile() {
        val date = Date(System.currentTimeMillis())
        val format = SimpleDateFormat("yyyyMMddhhmmss", Locale.KOREA)
        val time: String = format.format(date)

        when {
            isExternalStorageWritable -> {
                //read, write 둘다 가능
                val logDir =
                    File("data/data/com.minggu.myapp/logs")

                //logDirectory 폴더 없을 시 생성
                if (!logDir.exists())
                    logDir.mkdirs()

                val logFile = File(logDir, "log_$time.txt")
                Log.d(LoginActivity.TAG, "New Logging Start :: $logFile")

                //이전 logcat 을 지우고 파일에 새 로그을 씀
                try {
                    Runtime.getRuntime().exec("logcat -c")
                    Runtime.getRuntime().exec("logcat -f $logFile")
                } catch (e: IOException) {
                    e.printStackTrace()
                }

                //만약 한달 전 로그 있다면 삭제
                val deleteFileList = logDir.listFiles()
                val cal: Calendar = Calendar.getInstance()
                cal.time = Date()
                cal.add(Calendar.MONTH, -1)

                deleteFileList?.let {
                    for (file in deleteFileList) {
                        if (Date(file.lastModified()) < cal.time) {
                            Log.i(TAG, "Log File deleted : " + file.name)
                            file.delete()
                        }
                    }
                }

            }
            isExternalStorageReadable -> {
                //read 만 가능
                Log.e(LoginActivity.TAG, "Only Read!")
            }
            else -> {
                //접근 불가능
                Log.e(LoginActivity.TAG, "You can't access!")

            }
        }
    }

간단해보이지만 핵심 기능은 다 들어있다.

패키 지명을 가져오는 다양한 방법들이 있는데 원하는 방법을 선택하기로 하자. (난 샘플로 com.minggu.myapp으로 명명)

함수로 만들어두었으니 MainActivity 혹은 SplashActivity 혹은 LoginActivity에 넣어두면 된다.

 

 

안드로이드 스튜디오는 내장접근이 가능하니 저렇게 했지만 외부저장소로 빼려면

${Environment.getExternalStorageDirectory()}

을 사용하거나 서버로 바로 보내거나 바로 내보내기 기능을 구현하면 될 듯하다.

+ Recent posts