Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Creating and Storing Log File on device in Android

Tags:

I am planning to automate the testing of an application by creating a log to store some results of execution of the app and latter on parse it using a piece of python code and plot a graph.

The application is a WiFi fingerprinter i.e it collects info such as mac id, rss(recieved signal strength and rank(normalized rss) about the wifi devices in the surrounding environment. So to test this application I would have to take it to the location and record the results(as of now manually). So logcat wouldn't serve the purpose.

Automation requires 1. Storing the log in the device 2. Access to the log file in the system through usb

Format of the Log file:

Snapshot: 1 Fingerprint: 1, Rank: 0.23424, Boolean: true Fingerprint: 2, Rank: 0.42344, Boolean: false Fingerprint: 3, Rank: 0.23425, Boolean: true  Snapshot: 2 Fingerprint: 1, Rank: 0.75654, Boolean: false Fingerprint: 2, Rank: 0.23456, Boolean: true Fingerprint: 3, Rank: 0.89423, Boolean: true   ................ 

Now I know there are basically 3 approaches for persistent storage(SharedPrefs wouldn't suit this scenario anyway). I tried Internal Storage, but even after setting the mode of the file as MODE_WORLD_READABLE it was impossible to read the file using Device File Explorer in Eclipse.

I am still wary of using external storage for storing the log. Any tutorial on how to write to a file in usb of the device will definitely help.

I thought of structuring the data to be stored so as to use SQLite for storage. But this establishing many unnecessary relations(foreign and domestic) between data and make it complex. If there is no way around, then here be dragons.

Basically I want to write to a file(easier I suppose) in the device and latter on read it in my system by connecting to it via usb. Any help on how to do it would be much appreciated.

like image 593
Primal Pappachan Avatar asked Apr 20 '11 06:04

Primal Pappachan


People also ask

How do I store log files?

Keep the logs in the most "raw" state, then process it and then create a tarball for each day. The only reason to aggregate would be to reduce the number of files. On some file systems, if you put more than N files in a directory, the performance decreases rapidly.

Is there a log file in Android?

Android allows collecting system logs using Logcat. Log messages can be viewed in a Logcat window in Android Studio, or you can use the command line tool to pull them. Several Android apps are also available in the Google Play store that allow easy access to these tools.

Where are Android logs stored?

To access the logging output, run the 'adb' executable with following arguments to capture the Android Enterprise related logging: Windows: C:\Users\[username]\AppData\Local\Android\sdk\platform-tools> adb logcat -G 32M; adb shell setprop persist. log.


2 Answers

Wary or not, External Storage still may be the only way to go. Without root access on the device, you can't really get at anything "Internal" unless you're going to be okay with reading within an application on the device. The docs provide pretty solid guidelines for where to create external files, and if you are using API Level 8 or higher, there are a couple of extra functions that can be used. I'm sure you know this page, but here it is anyway: http://developer.android.com/guide/topics/data/data-storage.html#filesExternal

If you're in need of any file io example code... I think I could dig some up...

EDIT - I would start by following the guidelines in the above docs to first confirm the state of the storage. I unfortunately don't have any experience with appending a file in Java, so someone else would definitely be more qualified to answer. This doesn't cover appending, but I have a backup routine in one of my personal apps that looks something like this.

    File backupPath = Environment.getExternalStorageDirectory();      backupPath = new File(backupPath.getPath() + "/Android/data/com.maximusdev.bankrecord/files");      if(!backupPath.exists()){         backupPath.mkdirs();     }      FileOutputStream fos;     try {         fos = new FileOutputStream(backupPath.getPath() + "/recordsbackup.txt");          if(okaytowrite){             for(int i = 0; i < count; ++i){                 entry = adapter.getItem(i);                 fos.write(entry.toString().getBytes());                 fos.write("\n".getBytes());                 fos.write(String.valueOf(entry.dateTime).getBytes());                 fos.write("\n".getBytes());                 fos.write(String.valueOf(entry.sign).getBytes());                 fos.write("\n".getBytes());                 fos.write(String.valueOf(entry.cleared).getBytes());                 fos.write("\n".getBytes());                 fos.write(String.valueOf(entry.transDate).getBytes());                 fos.write("\n".getBytes());                 fos.write(entry.category.getBytes());                 fos.write("\n".getBytes());             }         }         fos.close();          Toast.makeText(this, "Backup Complete", Toast.LENGTH_SHORT).show();      } catch (FileNotFoundException e) {          e.printStackTrace();          AlertDialog.Builder delmessagebuilder = new AlertDialog.Builder(this);          delmessagebuilder.setCancelable(false);          delmessagebuilder.setMessage("File Access Error");          delmessagebuilder.setNeutralButton("Okay", new DialogInterface.OnClickListener() {             public void onClick(DialogInterface dialog, int id) {                 dialog.dismiss();             }         });          delmessagebuilder.create().show();      } catch (IOException e) {          e.printStackTrace();          AlertDialog.Builder delmessagebuilder = new AlertDialog.Builder(this);          delmessagebuilder.setCancelable(false);          delmessagebuilder.setMessage("File Access Error");          delmessagebuilder.setNeutralButton("Okay", new DialogInterface.OnClickListener() {             public void onClick(DialogInterface dialog, int id) {                 dialog.dismiss();             }         });          delmessagebuilder.create().show();     } 

Once I'm ready to write, I'm pulling a custom object (entry) out of an ArrayAdapter (adapter) and converting field valuse to strings and using getBytes() to pass to the FileOutputStream write function. I've done some research and there are quite a few other options for file writing in Java/Android... the FileWriter Class for instance, so it bears further research.

like image 181
Maximus Avatar answered Oct 16 '22 09:10

Maximus


I used a very simple approach to write String messages to the log file by creating a FileWriter object.

    public static BufferedWriter out;         private void createFileOnDevice(Boolean append) throws IOException {                 /*                  * Function to initially create the log file and it also writes the time of creation to file.                  */                 File Root = Environment.getExternalStorageDirectory();                 if(Root.canWrite()){                      File  LogFile = new File(Root, "Log.txt");                      FileWriter LogWriter = new FileWriter(LogFile, append);                      out = new BufferedWriter(LogWriter);                      Date date = new Date();                      out.write("Logged at" + String.valueOf(date.getHours() + ":" + date.getMinutes() + ":" + date.getSeconds() + "\n"));                       out.close();              }         } 

Now the function to write a new message to the log file.

    public void writeToFile(String message){             try {                 out.write(message+"\n");                 out.close();             } catch (IOException e) {                 e.printStackTrace();             } 
like image 38
Primal Pappachan Avatar answered Oct 16 '22 10:10

Primal Pappachan