2012-09-27 19 views
8

Sé que este tema se ha hablado mucho, pero no en este sentido. Necesito almacenar los registros en un archivo .txt pero no puedo usar el log4j o cualquier otra clase, pero android.util.log Tengo esta solución, pero no es la mejor. Para tener la misma información que en: Log.i (TAG, "Un mensaje INFO"); tengo que escribir ...Cómo almacenar los registros en un archivo txt usando android.util.log

ERROR = logLevel < 3; 
WARNING = logLevel < 2; 
INFO = logLevel < 1; 
if (INFO){ 

    appendLog("LEVEL: I TIME: "+java.util.GregorianCalendar.DAY_OF_MONTH + 
         "-"+ java.util.GregorianCalendar.MONTH +" "+GregorianCalendar.HOUR_OF_DAY +":"+GregorianCalendar.MINUTE + 
         ":"+GregorianCalendar.SECOND +"."+GregorianCalendar.MILLISECOND + " PID: "+ 
         android.os.Process.myPid()+ " TID: "+android.os.Process.myTid()+ " Application: com.example.myapplication"+ 
         " TAG:" +TAG+ " TEXT: An INFO Message"); 
} 

y luego ...

public void appendLog(String text) {   
    File logFile = new File("sdcard/log.txt"); 
    if (!logFile.exists()) { 
     try { 
      logFile.createNewFile(); 
     }catch (IOException e){ 
      e.printStackTrace(); 
     } 
    } 
    try { 
     BufferedWriter buf = new BufferedWriter(new FileWriter(logFile, true)); 
     buf.append(text); 
     buf.newLine(); 
     buf.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

¿Alguien tiene una solución más elegante que esto? Gracias por ayudarme.

+0

Tome un vistazo a http://stackoverflow.com/a/3359857/1321873 – Rajesh

+0

Gracias Rajesh está muy cerca de lo que quería. – Alberto

Respuesta

2

Crea una clase contenedora que ajustará la clase Log de Android. Esta clase contenedora ampliará la funcionalidad de la clase Log al registrar el texto en un archivo.

Ejemplo:

public class MyLog{ 
    public static void i(String TAG, String message){ 

     // Printing the message to LogCat console 
     Log.i(TAG, message); 

     // Write the log message to the file 
     appendLog(message); 
    } 

    public static void d(String TAG, String message){ 
     Log.d(TAG, message); 
     appendLog(message); 
    } 

    // rest of log methods... 
} 

Entonces whould utilizar de esta manera:

MyLog.i("LEVEL 1", "Your log message here..."); 
+0

Pero no me da el tiempo, TID, PID, nombre de la aplicación ... solo me da el mensaje. Estoy pidiendo una solución en la que no tenga que escribir todos estos parámetros por mi cuenta. Por supuesto, si lo envuelvo en una clase, solo tendré que escribirlo una vez, pero todavía no se ve la mejor solución ... ¿Alguna otra solución? – Alberto

9

Aquí con Os adjunto sencilla definición de la clase Logger, se puede utilizar en la que es. Para almacenar la información de registro en el archivo Log.txt en SDCARD, use.

package com.clientname.projectname; 

import java.io.BufferedWriter; 
import java.io.File; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.util.logging.FileHandler; 

import android.os.Environment; 
import android.util.Log; 

/** 
* @author Rakesh.Jha 
* Date - 07/10/2013 
* Definition - Logger file use to keep Log info to external SD with the simple method 
*/ 

public class Logger { 

    public static FileHandler logger = null; 
    private static String filename = "ProjectName_Log"; 

    static boolean isExternalStorageAvailable = false; 
    static boolean isExternalStorageWriteable = false; 
    static String state = Environment.getExternalStorageState(); 

    public static void addRecordToLog(String message) { 

     if (Environment.MEDIA_MOUNTED.equals(state)) { 
      // We can read and write the media 
      isExternalStorageAvailable = isExternalStorageWriteable = true; 
     } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) { 
      // We can only read the media 
      isExternalStorageAvailable = true; 
      isExternalStorageWriteable = false; 
     } else { 
      // Something else is wrong. It may be one of many other states, but all we need 
      // to know is we can neither read nor write 
      isExternalStorageAvailable = isExternalStorageWriteable = false; 
     } 

     File dir = new File("/sdcard/Files/Project_Name");  
     if (Environment.MEDIA_MOUNTED.equals(state)) { 
      if(!dir.exists()) { 
       Log.d("Dir created ", "Dir created "); 
       dir.mkdirs(); 
      } 

      File logFile = new File("/sdcard/Files/Project_Name/"+filename+".txt"); 

      if (!logFile.exists()) { 
       try { 
        Log.d("File created ", "File created "); 
        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.write(message + "\r\n"); 
       //buf.append(message); 
       buf.newLine(); 
       buf.flush(); 
       buf.close(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

Ahora, una vez que ha creado este archivo, donde cada vez que desea almacenar un registro de información en el uso de archivos de código registro.txt a continuación. -

package com.clientname.projectname; 

import android.app.Activity; 
import android.media.MediaPlayer; 
import android.os.Bundle; 
import android.util.Log; 

/** 

* @author Rakesh.Jha 
* Date - 03/10/2013 
* Definition - //ToDO 

*/ 

public class MainActivity extends Activity { 

    private static final String TAG = null; 
    Logger logger; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Log.d("Testing  :","log"); // no need to do this line, use below line 
     logger.addRecordToLog("Testing  : log "); 

     logger.addRecordToLog("TAG MediaPlayer audio session ID: "); 

     MediaPlayer mediaPlayer = MediaPlayer.create(MainActivity.this, R.raw.test);//test is audio file, u have to keep in raw folder 

     logger.addRecordToLog("MediaPlayer audio session ID: " + mediaPlayer.getAudioSessionId()); 
     logger.addRecordToLog("Media Player started " + "Started !"); 

     mediaPlayer.start(); // no need to call prepare(); create() does that for you 
    } 

    private void prepareMediaServer() { } 
} 
Cuestiones relacionadas