Android การเขียนบันทึกเป็นไฟล์ข้อความ


130

ฉันกำลังพยายามเขียนบันทึกลงในไฟล์ Log.txt ที่กำหนดเองบนไฟล์ Android โดยใช้รหัสของ Mine แต่วิธีนี้จะสร้างไฟล์ แต่ไม่มีอะไรเลย โดยพื้นฐานแล้วฉันต้องการอ่านเนื้อหาก่อนหน้าของไฟล์แล้วต่อท้ายข้อมูลของฉันด้วยเนื้อหาที่มีอยู่

จรรยาบรรณมีดังนี้:

public static void write(String str) 
    {
        InputStream fileInputStream = null;
        FileOutputStream fileOutpurStream = null;
        try
        { 
            fileInputStream = new FileInputStream(file);
            fileOutpurStream = new FileOutputStream(file);
            if(file.exists())
            {
                int ch = 0;
                int current = 0;
                StringBuffer buffer = new StringBuffer();
                while((ch = fileInputStream.read()) != -1)
                {
                    buffer.append((char) ch);
                    current++;
                }
                byte data[]=new byte[(int)file.length()];
                fileInputStream.read(data);   
                fileOutpurStream.write(data);
                fileOutpurStream.write(str.getBytes(),0,str.getBytes().length);
                fileOutpurStream.flush();
            } 
            else
            {   
                file.createNewFile();
                fileOutpurStream.write(str.getBytes(),0,str.getBytes().length);
                fileOutpurStream.flush();
            }
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        finally
        {
            try
            {
                fileInputStream.close();
                fileOutpurStream.flush();
                fileOutpurStream.close();
                fileOutpurStream = null;
                fileInputStream = null;
            }
            catch (IOException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

คำตอบ:


249

หวังว่านี่จะช่วยได้ ...

public void appendLog(String text)
{       
   File logFile = new File("sdcard/log.file");
   if (!logFile.exists())
   {
      try
      {
         logFile.createNewFile();
      } 
      catch (IOException e)
      {
         // TODO Auto-generated catch block
         e.printStackTrace();
      }
   }
   try
   {
      //BufferedWriter for performance, true to set append to file flag
      BufferedWriter buf = new BufferedWriter(new FileWriter(logFile, true)); 
      buf.append(text);
      buf.newLine();
      buf.close();
   }
   catch (IOException e)
   {
      // TODO Auto-generated catch block
      e.printStackTrace();
   }
}

83
อย่าลืมเพิ่มสิทธิ์ในการเขียน _external_storage ใน Manifest!
virusss8

5
ฉันจำเป็นต้องเพิ่ม buf.flush (); beforebuf.close (); แต่ฟังก์ชัน tjis คือสิ่งที่ฉันต้องการ ขอบคุณ
Csabi

1
ฉันควรเรียกใช้ฟังก์ชันนี้จากที่ไหนเพื่อให้มันเขียนไฟล์ล็อกอินของแอปพลิเคชันทั้งหมด ???
uniruddh

10
ฉันอยากจะแนะนำให้ปรับโครงสร้างโค้ดเพื่อให้buf.close()อยู่ในfinallyบล็อก
William Price

2
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />แน่นอนว่า @ virusss8 หมายถึงอะไร
Bengt

29

สำหรับผู้ที่ยังไม่คุ้นเคยกับการบันทึก Java โดยทั่วไปและการบันทึก Android

  1. Log4jเป็นการใช้งาน java logging ทั่วไปและตอนนี้เป็นโครงการของ Apache software foundation ไม่ใช่เฉพาะ Android และมีความเข้ากันไม่ได้กับ Android
  2. SL4J ไม่ใช่การใช้งานการบันทึก แต่เป็นเลเยอร์นามธรรม ช่วยหลีกเลี่ยงสถานการณ์เช่นการพึ่งพาไลบรารีของบุคคลที่สามแต่ละโครงการโดยพยายามใช้การใช้งานการบันทึกของตัวเองเช่น Log4j แหล่ง

ตัวเลือกบางอย่างสำหรับการเข้าสู่ระบบ txt ใน Android อยู่ด้านล่าง

  1. ใช้logcat -fเป็นคำตอบนี้เพื่อเข้าสู่ไฟล์ โปรดทราบว่าจาก Android 4.2 การอนุญาต READ_LOGS จะไม่มีผลกระทบใด ๆ และทุกแอปพลิเคชัน (เว้นแต่โทรศัพท์จะรูท) สามารถอ่านบันทึกของตัวเองได้เท่านั้น ข้อเสียคือ logcat บัฟเฟอร์เป็นวงกลมและมีขนาด จำกัด คุณอาจไม่ได้รับบันทึกก่อนหน้านี้
  2. ใช้microlog4android (เขียนสำหรับอุปกรณ์มือถือเช่น Android) ในขณะที่ก่อนหน้านี้คำตอบ อาจมีวิธีหนึ่ง แต่ฉันคิดไม่ออกว่าจะใช้ microlog4Android เพื่อบันทึกไปยังที่เก็บข้อมูลภายในของแอปพลิเคชันอย่างไร ตัวเลือกเดียวสำหรับเส้นทางบันทึกคือที่เก็บข้อมูลภายนอกเช่น sdcard ดังนั้นฉันจึงไม่สามารถใช้งานได้
  3. ใช้Log4jกับหุ่นยนต์เข้าสู่ระบบ-log4j android-logging-log4j ทำอะไร? ทำให้ Log4j ใช้งานง่ายขึ้นใน Android โดยให้สองฟังก์ชัน

    • ตัวเลือกในการส่งบันทึกไปยัง logcat นอกเหนือจากการบันทึกไฟล์
    • วิธีง่ายๆในการตั้งค่าตัวเลือกการกำหนดค่า Log4j เช่นเส้นทางไฟล์ขนาดไฟล์สูงสุดจำนวนการสำรองข้อมูล ฯลฯ โดยจัดเตรียมคลาส LogConfigurator

    ตัวอย่างง่ายๆด้านล่าง สังเกตว่าloggerวัตถุในตัวอย่างด้านล่างเป็นวัตถุ Log4j ที่ส่งคืนและไม่ใช่คลาส android-logging-log4j ดังนั้น android-logging-log4j จึงใช้สำหรับกำหนดค่า Log4j เท่านั้น

  4. แต่จะลองLogBack LogBack ได้รับการพัฒนาโดยบุคคลเดียวกับที่สร้างไลบรารี Log4J 1.x และ SL4J ไม่เกี่ยวข้องกับ Log4j 2.x แม้ว่า

ขั้นตอนในการใช้ Log4j ใน Android

  1. เพิ่มทั้งlog4j-1.2.x.jarและandroid-logging-log4j-1.0.3.jarลงในโฟลเดอร์ libs

  2. เพิ่มสิทธิ์เฉพาะเมื่อใช้ที่เก็บข้อมูลภายนอก
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

  3. เขียนLog4jคลาสผู้ช่วย

    package com.example.logger;
    
    import android.os.Environment;
    import de.mindpipe.android.logging.log4j.LogConfigurator;
    
    public class Log4jHelper {
        private final static LogConfigurator mLogConfigrator = new LogConfigurator();
    
        static {
            configureLog4j();
        }
    
        private static void configureLog4j() {
            String fileName = Environment.getExternalStorageDirectory() + "/" + "log4j.log";
            String filePattern = "%d - [%c] - %p : %m%n";
            int maxBackupSize = 10;
            long maxFileSize = 1024 * 1024;
    
            configure( fileName, filePattern, maxBackupSize, maxFileSize );
        }
    
        private static void configure( String fileName, String filePattern, int maxBackupSize, long maxFileSize ) {
            mLogConfigrator.setFileName( fileName );
            mLogConfigrator.setMaxFileSize( maxFileSize );
            mLogConfigrator.setFilePattern(filePattern);
            mLogConfigrator.setMaxBackupSize(maxBackupSize);
            mLogConfigrator.setUseLogCatAppender(true);
            mLogConfigrator.configure();
    
        }
    
        public static org.apache.log4j.Logger getLogger( String name ) {
            org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger( name );
            return logger;
        }
    }
  4. ในชั้นเรียนกิจกรรม

    org.apache.log4j.Logger log= Log4jHelper.getLogger( "YourActivity" );
    log.error("Error");
    log.info("Info");
    log.warn("Warn");

ตัวอย่างที่มา โปรดทราบว่า log4j 2.x (ฟังก์ชันที่ได้รับการปรับปรุง) ที่เขียนใหม่ตั้งแต่เริ่มต้นจะไม่สามารถทำงานร่วมกับ log4j 1.x ได้ ดังนั้นคุณต้องใช้ log4j 1.2.x jar กับโถ android-logging-log4j ฉันสามารถเข้าสู่ไฟล์ภายในของแอปพลิเคชันและส่งไฟล์ทางอีเมลในภายหลังด้วยsetReadable(true, false)


24

microlog4android ใช้งานได้สำหรับฉัน แต่เอกสารประกอบค่อนข้างแย่ สิ่งที่พวกเขาต้องเพิ่มคือนี่คือบทช่วยสอนเริ่มต้นอย่างรวดเร็วกวดวิชา

นี่คือบทแนะนำสั้น ๆ ที่ฉันพบ

  1. เพิ่มตัวแปรคงที่ต่อไปนี้ในกิจกรรมหลักของคุณ:

    private static final Logger logger = LoggerFactory.getLogger();
  2. เพิ่มสิ่งต่อไปนี้ในonCreate()วิธีของคุณ:

    PropertyConfigurator.getConfigurator(this).configure();
  3. สร้างไฟล์ที่ตั้งชื่อmicrolog.propertiesและเก็บไว้ในassetsไดเร็กทอรี

  4. แก้ไขmicrolog.propertiesไฟล์ดังนี้:

    microlog.level=DEBUG
    microlog.appender=LogCatAppender;FileAppender
    microlog.formatter=PatternFormatter
    microlog.formatter.PatternFormatter.pattern=%c [%P] %m %T
  5. เพิ่มคำสั่งการบันทึกเช่นนี้:

    logger.debug("M4A");

สำหรับแต่ละคลาสคุณสร้างอ็อบเจ็กต์คนตัดไม้ตามที่ระบุใน 1)

6. คุณอาจได้รับอนุญาตต่อไปนี้:

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

นี่คือแหล่งที่มาของการกวดวิชา


4
FileAppender จะสร้างไฟล์ "microlog.txt" บน sdcard ของคุณ (เส้นทางแบบเต็มในกรณีของฉันคือ "/sdcard/microlog.txt)
Ruslan Yanchyshyn

2
บทช่วยสอนฉบับย่อนี้ควรเป็นส่วนหนึ่งของเอกสารอย่างเป็นทางการของ Microlog4Android
Johan Karlsson

ข้อผิดพลาด: Android Dex: [project] com.android.dex.DexException: ไฟล์ dex หลายไฟล์กำหนด Lcom / google / code / microlog4android / Level; ?

10

คำเตือน: ฉันอาจเข้าใจคุณผิดทั้งหมด แต่ถ้าสิ่งที่คุณต้องการคือไฟล์บันทึกทำไมต้องเหงื่อ?

ใส่สิ่งนี้ไว้ในไฟล์ bat (เปลี่ยนเส้นทางไปยังไดเร็กทอรี tools ของคุณและ yourappname เป็นชื่อแอปของคุณ):

cd "C:\devAndroid\Software\android-sdk-windows-1.6_r1\android-sdk-windows-1.6_r1\tools"
adb logcat -v time   ActivityManager:W  yourappname:D  *:W >"C:\devAndroid\log\yourappname.log"

จากนั้นในโค้ดของคุณให้ทำสิ่งที่คล้ายกับสิ่งนี้:

Log.d("yourappname", "Your message");

ในการสร้างบันทึกให้เชื่อมต่อสาย USB และเรียกใช้ไฟล์ค้างคาวของคุณ

ความนับถือ


อย่าลืมนำเข้า android.util.Log
Spidey

มันส่งคืน "ข้อผิดพลาด: มากกว่าหนึ่งอุปกรณ์และโปรแกรมจำลอง - กำลังรออุปกรณ์ -" และไม่มีอะไรเพิ่มเติม มีอะไรผิดปกติ?
eros

20
วิธีนี้จะทำงานอย่างไรหากคุณไม่ได้อยู่ใกล้พีซีขณะใช้งานแอปพลิเคชัน
DDSports

@DDSports มันไม่ได้ แต่เขาไม่เข้าใจสาระสำคัญของคำถาม
Ewoks

@DDSports คุณสามารถใช้ adb ผ่าน wifi
Daniel F

8

ใช้slf4android lib
ใช้งานslf4j api ได้ง่ายๆโดยใช้ android java.util.logging *

คุณสมบัติ:

  • เข้าสู่ระบบไฟล์นอกกรอบ
  • เข้าสู่ปลายทางอื่นโดย LoggerConfiguration.configuration().addHandlerToLogger
  • เขย่าอุปกรณ์ของคุณเพื่อส่งบันทึกพร้อมภาพหน้าจอทางอีเมล
  • เล็กมากใช้เวลาเพียง ~ 55kB

slf4android ดูแลโดย@miensol เป็นหลัก

อ่านเพิ่มเติมเกี่ยวกับ slf4android ในบล็อกของเรา:


7

คุณควรดูที่ microlog4android พวกเขามีโซลูชันพร้อมที่จะเข้าสู่ไฟล์

http://code.google.com/p/microlog4android/


12
ดูเหมือนห้องสมุดที่ดี แต่เอกสารแย่มาก ฉันคิดไม่ออกว่าจะทำให้มันใช้งานได้อย่างไรและลงเอยด้วยการรวบรวมบางสิ่งเข้าด้วยกัน
Paul Lammertsma

@PaulLammertsma: ฉันคิดว่าคงจะดีที่คุณมีส่วนร่วมใน Microlog4Android แทน FYI: มี API เดียวกันกับ Log4j ขออภัยเกี่ยวกับเอกสารที่ไม่ดี
Johan Karlsson

@ Paul Lammertsma อะไรจะดีได้อย่างไรถ้าเอกสารมันแย่ขนาดนั้นคุณไม่สามารถใช้มันได้? ถ้าคุณไม่สามารถใช้งานได้มันเป็นเรื่องไร้สาระ
เหลือเชื่อ

7

อาจจะสายไป แต่หวังว่านี่อาจช่วยได้.. ลองดู ....

public void writefile()
    {
        File externalStorageDir = Environment.getExternalStorageDirectory();
        File myFile = new File(externalStorageDir , "yourfilename.txt");

        if(myFile.exists())
        {
           try
           {

        FileOutputStream fostream = new FileOutputStream(myFile);
        OutputStreamWriter oswriter = new OutputStreamWriter(fostream); 
        BufferedWriter bwriter = new BufferedWriter(oswriter);   
        bwriter.write("Hi welcome ");
        bwriter.newLine();            
        bwriter.close(); 
        oswriter.close(); 
        fostream.close();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
        else
        {
            try {
                myFile.createNewFile();
            }
            catch (IOException e) 
            {
                e.printStackTrace();
            }
        }

ที่นี่bfwritter.newlineเขียนข้อความของคุณลงในไฟล์ และเพิ่มสิทธิ์

 <uses-permission android:name = "android.permission.WRITE_EXTERNAL_STORAGE"/>

ในไฟล์รายการของคุณโดยไม่ล้มเหลว


6

ฉันแก้ไขปัญหานี้ด้วยโค้ดต่อไปนี้ในบรรทัดคำสั่ง:

File outputFile = new File("pathToFile"); 
Runtime.getRuntime().exec("logcat -c");
Runtime.getRuntime().exec("logcat -v time -f " + outputFile.getAbsolutePath())

โดยที่ตัวเลือก "เวลา" จะเพิ่มรายละเอียดฟิลด์ข้อมูลเมตาสำหรับวันที่เวลาในการร้องขอลำดับความสำคัญ / แท็กและ PID ของกระบวนการที่ออกข้อความ

จากนั้นในรหัสของคุณให้ทำสิ่งที่คล้ายกับสิ่งนี้ (โดยใช้ android.util.Log):

Log.d("yourappname", "Your message");

4
ทำงานได้ดีเมื่อadbเชื่อมต่อ แต่ไม่ทำงานเมื่ออุปกรณ์อยู่ในโหมดสแตนด์อโลน ฉันจะไม่ใช้มันในการผลิต แต่เป็นวิธีง่ายๆในโหมดดีบัก
Julien Kronegg

2

โดยทั่วไปคุณต้องมีที่จับไฟล์ก่อนที่จะเปิดสตรีม คุณมีตัวจัดการ fileOutputStream ก่อน createNewFile () ในบล็อกอื่น สตรีมจะไม่สร้างไฟล์หากไม่มีอยู่

ไม่ใช่เฉพาะ Android แต่เป็น IO จำนวนมากสำหรับจุดประสงค์นี้ จะเกิดอะไรขึ้นถ้าคุณดำเนินการ "เขียน" หลายรายการทีละรายการ? คุณจะอ่านเนื้อหาทั้งหมดและเขียนเนื้อหาทั้งหมดใช้เวลาและที่สำคัญกว่านั้นคืออายุการใช้งานแบตเตอรี่

ฉันขอแนะนำให้ใช้ java.io.RandomAccessFile ค้นหา () 'ing ไปยังจุดสิ้นสุดจากนั้น writeChars () เพื่อต่อท้าย มันจะเป็นโค้ดที่สะอาดกว่าและน่าจะเร็วกว่ามาก


2

ฉันได้สร้างคลาสที่เรียบง่ายและมีน้ำหนักเบา (ประมาณ 260 LoC) ที่ขยายการใช้งาน android.util.Log มาตรฐานด้วยการบันทึกตามไฟล์:
ทุกข้อความบันทึกจะบันทึกผ่าน android.util.Log และยังเขียนลงในไฟล์ข้อความบนอุปกรณ์

คุณสามารถค้นหาได้ใน github:
https://github.com/volkerv/FileLog


1
อย่าทำสิ่งที่เราต้องการเพื่อให้แน่ใจว่าการทำงานของไฟล์ไม่ได้ทำบนเธรด UI ในกรณีที่เรามีการบันทึกไฟล์จำนวนมาก?
Jayshil Dave

2

หลังจากการตรวจสอบเป็นเวลานานฉันพบว่า:

  • android.util.Log โดยใช้ค่าเริ่มต้น java.util.logging.Logger
  • LogCat ใช้loggerกับชื่อ""เพื่อรับอินสแตนซ์ของการใช้งานLogManager.getLogManager().getLogger("")
  • อุปกรณ์ Android เพิ่มลงในloggerอินสแตนซ์LogCat com.android.internal.logging.AndroidHandlerหลังจากเรียกใช้แอปดีบัก
  • แต่!!! com.android.internal.logging.AndroidHandlerพิมพ์ข้อความไปยัง logcat เฉพาะที่มีระดับมากกว่านั้นjava.util.logging.Level.INFOเช่น ( Level.INFO, Level.WARNING, Level.SEVERE, Level.OFF)

ดังนั้นในการเขียนบันทึกลงในไฟล์เพียงแค่rootLogger "" เพิ่ม a java.util.logging.FileHandler:

  class App : Application{
    override fun onCreate() {
      super.onCreate()
      Log.d(TAG, printLoggers("before setup"))

      val rootLogger = java.util.logging.LogManager.getLogManager().getLogger("")
      val dirFile = destinationFolder
      val file = File(dirFile,"logFile.txt")
      val handler = java.util.logging.FileHandler(file.absolutePath, 5* 1024 * 1024/*5Mb*/, 1, true)
      handler.formatter = AndroidLogFormatter(filePath = file.absolutePath)

      rootLogger?.addHandler(handler)

      Log.d(TAG, printLoggers("after setup"))
    }
  }

val destinationFolder: File
        get() {
            val parent = 
                Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).absoluteFile
            val destinationFolder = File(parent, "MyApp")
            if (!destinationFolder.exists()) {
                destinationFolder.mkdirs()
                destinationFolder.mkdir()
            }
            return destinationFolder
        }
class AndroidLogFormatter(val filePath: String = "", var tagPrefix: String = "") : Formatter() {

    override fun format(record: LogRecord): String {
        val tag = record.getTag(tagPrefix)
        val date = record.getDate()
        val level = record.getLogCatLevel()
        val message = record.getLogCatMessage()
        return "$date $level$tag: $message\n"
    }
}

fun LogRecord.getTag(tagPrefix: String): String {
    val name = loggerName
    val maxLength = 30
    val tag = tagPrefix + (if (name.length > maxLength) name.substring(name.length - maxLength) else name)
    return tag
}

fun LogRecord.getDate(): String? {
    return Date(millis).formatedBy("yyyy-MM-dd HH:mm:ss.SSS")
}

fun Date?.formatedBy(dateFormat: String): String? {
    val date = this
    date ?: return null
    val writeFormat = SimpleDateFormat(dateFormat, Locale.getDefault()) //MM в HH:mm
    return writeFormat.format(date)
}

fun LogRecord.getLogCatMessage(): String {
    var message = message

    if (thrown != null) {
        message += Log.getStackTraceString(thrown)
    }
    return message
}

fun Int.getAndroidLevel(): Int {
    return when {
        this >= Level.SEVERE.intValue() -> { // SEVERE
            Log.ERROR
        }
        this >= Level.WARNING.intValue() -> { // WARNING
            Log.WARN
        }
        this >= Level.INFO.intValue() -> { // INFO
            Log.INFO
        }
        else -> {
            Log.DEBUG
        }
    }
}

fun LogRecord.getLogCatLevel(): String {
    return when (level.intValue().getAndroidLevel()) {
        Log.ERROR -> { // SEVERE
            "E/"
        }
        Log.WARN -> { // WARNING
            "W/"
        }
        Log.INFO -> { // INFO
            "I/"
        }
        Log.DEBUG -> {
            "D/"
        }
        else -> {
            "D/"
        }
    }
}

fun getLoggerLevel(level: Int): Level {
    return when (level) {
        Log.ERROR -> { // SEVERE
            Level.SEVERE
        }
        Log.WARN -> { // WARNING
            Level.WARNING
        }
        Log.INFO -> { // INFO
            Level.INFO
        }
        Log.DEBUG -> {
            Level.FINE
        }
        else -> {
            Level.FINEST
        }
    }
}

ในการพิมพ์คนตัดไม้ทั้งหมดที่แอปของคุณให้ใช้:

Log.e(TAG, printLoggers("before setup"))

 private fun printLoggers(caller: String, printIfEmpty: Boolean = true): String {
        val builder = StringBuilder()
        val loggerNames = LogManager.getLogManager().loggerNames
        builder.appendln("--------------------------------------------------------------")
        builder.appendln("printLoggers: $caller")
        while (loggerNames.hasMoreElements()) {
            val element = loggerNames.nextElement()
            val logger = LogManager.getLogManager().getLogger(element)
            val parentLogger: Logger? = logger.parent
            val handlers = logger.handlers
            val level = logger?.level
            if (!printIfEmpty && handlers.isEmpty()) {
                continue
            }
            val handlersNames = handlers.map {
                val handlerName = it.javaClass.simpleName
                val formatter: Formatter? = it.formatter
                val formatterName = if (formatter is AndroidLogFormatter) {
                    "${formatter.javaClass.simpleName}(${formatter.filePath})"
                } else {
                    formatter?.javaClass?.simpleName
                }
                "$handlerName($formatterName)"
            }
            builder.appendln("level: $level logger: \"$element\" handlers: $handlersNames parentLogger: ${parentLogger?.name}")
        }
        builder.appendln("--------------------------------------------------------------")
        return builder.toString()
    }

สวัสดี ประโยชน์ของการใช้คนตัดไม้ "" นี้คืออะไร ฉันไม่เห็นความแตกต่างกับคนตัดไม้แบบกำหนดเอง หรือฉันขาดอะไรไป?
Abins Shaji

1

ตัวแปรนี้สั้นกว่ามาก

ลอง {
    เส้นทางไฟล์สุดท้าย = ไฟล์ใหม่ (
            Environment.getExternalStorageDirectory (), "DBO_logs5");
    ถ้า (! path.exists ()) {
        path.mkdir ();
    }
    Runtime.getRuntime (). exec (
            "logcat -d -f" + path + File.separator
                    + "dbo_logcat"
                    + ".txt");
} catch (IOException จ) {
    e.printStackTrace ();
}

1

คุณสามารถใช้ห้องสมุดที่ฉันเขียนขึ้น ใช้งานง่ายมาก:

เพิ่มการอ้างอิงนี้ให้กับไฟล์ gradle ของคุณ:

dependencies {
    compile 'com.github.danylovolokh:android-logger:1.0.2'
}

เริ่มต้นไลบรารีในคลาส Application:

File logsDirectory = AndroidLogger.getDefaultLogFilesDirectory(this);
    int logFileMaxSizeBytes = 2 * 1024 * 1024; // 2Mb
    try {
        AndroidLogger.initialize(
                this,
                logsDirectory,
                "Log_File_Name",
                logFileMaxSizeBytes,
                false
                );
    } catch (IOException e) {
        // Some error happened - most likely there is no free space on the system
    }

นี่คือวิธีที่คุณใช้ห้องสมุด:

AndroidLogger.v("TAG", "Verbose Message");

และนี่คือวิธีการดึงข้อมูลบันทึก:

AndroidLogger.processPendingLogsStopAndGetLogFiles(new AndroidLogger.GetFilesCallback() {
        @Override
        public void onFiles(File[] logFiles) {
            // get everything you need from these files
            try {
                AndroidLogger.reinitAndroidLogger();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    });

นี่คือลิงค์ไปยังหน้า github พร้อมข้อมูลเพิ่มเติม: https://github.com/danylovolokh/AndroidLogger

หวังว่าจะช่วยได้


1

เวอร์ชันก่อนหน้านี้จำนวนมากบน log4j ไม่ทำงานในขณะนี้ (05/2019) แต่คุณสามารถใช้ Hyperlog ได้ - ฉันยืนยันได้ว่าใช้ได้

  1. เพิ่มบรรทัดนี้ในการอ้างอิงและโครงการซิงค์ของคุณ

    implementation 'com.hypertrack:hyperlog:0.0.10'
  2. สร้างคลาสแอปพลิเคชันใหม่ (สร้างคลาส java ใหม่และขยายแอปพลิเคชัน) จากนั้นในเมธอด onCreate ให้เพิ่มบรรทัดเหล่านี้:

    HyperLog.initialize(this);
    HyperLog.setLogLevel(Log.VERBOSE);
    
    HyperLog.getDeviceLogsInFile(this);
  3. เปลี่ยนไฟล์ manifest เพื่อกำหนดไฟล์แอ็พพลิเคชัน

    <application
        android:name=".AppClass"
        .....
  4. วิธีต่างๆในการบันทึก:

    HyperLog.d(TAG,"debug");
    HyperLog.i(TAG,"information");
    HyperLog.e(TAG,"error");
    HyperLog.v(TAG,"verbose");
    HyperLog.w(TAG,"warning");
    HyperLog.a(TAG,"assert");
    HyperLog.exception(TAG,"exception",throwable);
  5. ค้นหาไฟล์บันทึกของคุณ นำทางไปยัง

    RootFolder/android/data/"appPackageName/LogFiles/

ฉันลองใช้ไลบรารีนี้ในไฟล์ที่สร้างด้วย HyperLog.getDeviceLogsInFile (นี้); มีเพียงบันทึกที่สร้างล่าสุดเท่านั้น
mad_greasemonkey
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.