android

androidアプリ作成時のメモです。

834 views

自作ログクラス

import android.os.Looper
import java.io.File
import java.io.FileOutputStream
import java.io.FileWriter
import java.time.LocalDateTime
import java.time.format.DateTimeFormatter
import java.util.concurrent.locks.ReentrantLock
import kotlin.concurrent.withLock

object MyLog {
    private val lock = ReentrantLock()
    private val logDir = "出力先ディレクトリ/logs/"
    private val logPath1 = logDir + "trace0.log"
    private val logPath2 = logDir + "trace1.log"
    private val maxLogSize = 10 * 1024 * 1024
    private val logs = arrayOf(logPath1, logPath2)

    init {
        val dir = File(logDir)
        if(!dir.exists()) {
            dir.mkdirs()
        }
    }

    private fun rotate():String {
        var retIndex = 0
        var find = false
        for(i in 0 until logs.size) {
            val logFile = File(logs[i])
            if((logFile.exists()) and (logFile.length() < maxLogSize)) {
                //ファイルが存在して上限サイズより小さい
                retIndex = i
                find = true
                break
            }
            else if(!logFile.exists()) {
                //まだファイルが作成されていない
                retIndex = i
                find = true
                break
            }
        }

        if(!find) {
            //どちらもファイルの上限が超えていた場合は日付が古いほうを消す
            var oldLogFile = File(logs[0])
            var tmpAccessTime = oldLogFile.lastModified()
            for(i in 0 until logs.size) {
                val logFile = File(logs[i])
                if (tmpAccessTime > logFile.lastModified()) {
                    tmpAccessTime = logFile.lastModified()
                    oldLogFile = logFile

                }
            }

            //ファイルをクリアする
            oldLogFile.delete()
        }

        return logs[retIndex]
    }

    trace(level:String, msg:String) {
        //時刻生成
        val current = LocalDateTime.now()
        val formatter = DateTimeFormatter.ofPattern("YYYY-MM-dd HH:mm:ss")
        val dateTime = current.format(formatter)

        //Looperのスレッド(メインスレッド)
        val mainThreadId = Looper.getMainLooper().thread.id

        //スレッドID取得
        val myThreadId = Thread.currentThread().id

        //コール元関数名
        val fromMethod = Throwable().stackTrace

        //ログメッセージ
        val logMsg = "${level} ${dateTime} ${mainThreadId}-${myThreadId} ${fromMethod} ${msg}\n"


        lock.withLock {
            //ログファイルの決定
            val logFileName = rotate()
            FileWriter(logFileName,true).use {
                it.write(logMsg)
            }
        }
    }
}

呼び出すときは

MyLog.trace("aiueo”)

出力先は”出力先ディレクトリ/logs"の下にtrace0.log、trace1.logが出力される。
スレッド対応済み。

Page 12 of 19.

前のページ 次のページ



[添付ファイル]


お問い合わせ

プロフィール

マッスル

自己紹介

本サイトの作成者。
趣味:プログラム/水耕栽培/仮想通貨/激辛好き
プログラムは趣味と勉強を兼ねて、のんびり本サイトを作っています。
フレームワークはdjango。
仮想通貨はNEMが好き。
水耕栽培は激辛好きが高じて、キャロライナ・リーパーの栽培にチャレンジ中。

サイト/ブログ

https://www.osumoi-stdio.com/pyarticle/

ツイッター

@darkimpact0626