FileLogger.java revision c8e4352ea6cfa67f15140512e84af8ccede222d2
16ec99cf64b1651ac0c2386d68a35e3e8fec6c3e5Marc Blank/* 26ec99cf64b1651ac0c2386d68a35e3e8fec6c3e5Marc Blank * Copyright (C) 2009 The Android Open Source Project 36ec99cf64b1651ac0c2386d68a35e3e8fec6c3e5Marc Blank * 46ec99cf64b1651ac0c2386d68a35e3e8fec6c3e5Marc Blank * Licensed under the Apache License, Version 2.0 (the "License"); 56ec99cf64b1651ac0c2386d68a35e3e8fec6c3e5Marc Blank * you may not use this file except in compliance with the License. 66ec99cf64b1651ac0c2386d68a35e3e8fec6c3e5Marc Blank * You may obtain a copy of the License at 76ec99cf64b1651ac0c2386d68a35e3e8fec6c3e5Marc Blank * 86ec99cf64b1651ac0c2386d68a35e3e8fec6c3e5Marc Blank * http://www.apache.org/licenses/LICENSE-2.0 96ec99cf64b1651ac0c2386d68a35e3e8fec6c3e5Marc Blank * 106ec99cf64b1651ac0c2386d68a35e3e8fec6c3e5Marc Blank * Unless required by applicable law or agreed to in writing, software 116ec99cf64b1651ac0c2386d68a35e3e8fec6c3e5Marc Blank * distributed under the License is distributed on an "AS IS" BASIS, 126ec99cf64b1651ac0c2386d68a35e3e8fec6c3e5Marc Blank * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136ec99cf64b1651ac0c2386d68a35e3e8fec6c3e5Marc Blank * See the License for the specific language governing permissions and 146ec99cf64b1651ac0c2386d68a35e3e8fec6c3e5Marc Blank * limitations under the License. 156ec99cf64b1651ac0c2386d68a35e3e8fec6c3e5Marc Blank */ 166ec99cf64b1651ac0c2386d68a35e3e8fec6c3e5Marc Blank 1777424af660458104b732bdcb718874b17d0cab3aMarc Blankpackage com.android.exchange.utility; 1877424af660458104b732bdcb718874b17d0cab3aMarc Blank 1977424af660458104b732bdcb718874b17d0cab3aMarc Blankimport android.content.Context; 20b7456eb509b95016d55b676aaf56340cc87530b3Marc Blankimport android.os.Environment; 2177424af660458104b732bdcb718874b17d0cab3aMarc Blank 2277424af660458104b732bdcb718874b17d0cab3aMarc Blankimport java.io.FileWriter; 2377424af660458104b732bdcb718874b17d0cab3aMarc Blankimport java.io.IOException; 241403386ebffa1b6093a506a6a24db4523acdc315Marc Blankimport java.io.PrintWriter; 25c8e4352ea6cfa67f15140512e84af8ccede222d2Marc Blankimport java.util.Date; 2677424af660458104b732bdcb718874b17d0cab3aMarc Blank 2777424af660458104b732bdcb718874b17d0cab3aMarc Blankpublic class FileLogger { 2877424af660458104b732bdcb718874b17d0cab3aMarc Blank private static FileLogger LOGGER = null; 29f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank private static FileWriter sLogWriter = null; 30b7456eb509b95016d55b676aaf56340cc87530b3Marc Blank public static String LOG_FILE_NAME = 31b7456eb509b95016d55b676aaf56340cc87530b3Marc Blank Environment.getExternalStorageDirectory() + "/emaillog.txt"; 3277424af660458104b732bdcb718874b17d0cab3aMarc Blank 3377424af660458104b732bdcb718874b17d0cab3aMarc Blank public synchronized static FileLogger getLogger (Context c) { 3477424af660458104b732bdcb718874b17d0cab3aMarc Blank LOGGER = new FileLogger(); 3577424af660458104b732bdcb718874b17d0cab3aMarc Blank return LOGGER; 3677424af660458104b732bdcb718874b17d0cab3aMarc Blank } 3777424af660458104b732bdcb718874b17d0cab3aMarc Blank 386ec99cf64b1651ac0c2386d68a35e3e8fec6c3e5Marc Blank private FileLogger() { 391403386ebffa1b6093a506a6a24db4523acdc315Marc Blank try { 40f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank sLogWriter = new FileWriter(LOG_FILE_NAME, true); 411403386ebffa1b6093a506a6a24db4523acdc315Marc Blank } catch (IOException e) { 421403386ebffa1b6093a506a6a24db4523acdc315Marc Blank // Doesn't matter 4377424af660458104b732bdcb718874b17d0cab3aMarc Blank } 4477424af660458104b732bdcb718874b17d0cab3aMarc Blank } 4577424af660458104b732bdcb718874b17d0cab3aMarc Blank 4677424af660458104b732bdcb718874b17d0cab3aMarc Blank static public synchronized void close() { 47f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank if (sLogWriter != null) { 4877424af660458104b732bdcb718874b17d0cab3aMarc Blank try { 49f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank sLogWriter.close(); 5077424af660458104b732bdcb718874b17d0cab3aMarc Blank } catch (IOException e) { 5177424af660458104b732bdcb718874b17d0cab3aMarc Blank // Doesn't matter 5277424af660458104b732bdcb718874b17d0cab3aMarc Blank } 53f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank sLogWriter = null; 5477424af660458104b732bdcb718874b17d0cab3aMarc Blank } 5577424af660458104b732bdcb718874b17d0cab3aMarc Blank } 5677424af660458104b732bdcb718874b17d0cab3aMarc Blank 571403386ebffa1b6093a506a6a24db4523acdc315Marc Blank static public synchronized void log(Exception e) { 58f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank if (sLogWriter != null) { 591403386ebffa1b6093a506a6a24db4523acdc315Marc Blank log("Exception", "Stack trace follows..."); 60f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank PrintWriter pw = new PrintWriter(sLogWriter); 611403386ebffa1b6093a506a6a24db4523acdc315Marc Blank e.printStackTrace(pw); 621403386ebffa1b6093a506a6a24db4523acdc315Marc Blank pw.flush(); 631403386ebffa1b6093a506a6a24db4523acdc315Marc Blank } 641403386ebffa1b6093a506a6a24db4523acdc315Marc Blank } 651403386ebffa1b6093a506a6a24db4523acdc315Marc Blank 66c8e4352ea6cfa67f15140512e84af8ccede222d2Marc Blank @SuppressWarnings("deprecation") 676ec99cf64b1651ac0c2386d68a35e3e8fec6c3e5Marc Blank static public synchronized void log(String prefix, String str) { 6877424af660458104b732bdcb718874b17d0cab3aMarc Blank if (LOGGER == null) { 6977424af660458104b732bdcb718874b17d0cab3aMarc Blank LOGGER = new FileLogger(); 7077424af660458104b732bdcb718874b17d0cab3aMarc Blank log("Logger", "\r\n\r\n --- New Log ---"); 7177424af660458104b732bdcb718874b17d0cab3aMarc Blank } 72c8e4352ea6cfa67f15140512e84af8ccede222d2Marc Blank Date d = new Date(); 73c8e4352ea6cfa67f15140512e84af8ccede222d2Marc Blank int hr = d.getHours(); 74c8e4352ea6cfa67f15140512e84af8ccede222d2Marc Blank int min = d.getMinutes(); 75c8e4352ea6cfa67f15140512e84af8ccede222d2Marc Blank int sec = d.getSeconds(); 7677424af660458104b732bdcb718874b17d0cab3aMarc Blank 776ec99cf64b1651ac0c2386d68a35e3e8fec6c3e5Marc Blank // I don't use DateFormat here because (in my experience), it's much slower 7877424af660458104b732bdcb718874b17d0cab3aMarc Blank StringBuffer sb = new StringBuffer(256); 7977424af660458104b732bdcb718874b17d0cab3aMarc Blank sb.append('['); 8077424af660458104b732bdcb718874b17d0cab3aMarc Blank sb.append(hr); 8177424af660458104b732bdcb718874b17d0cab3aMarc Blank sb.append(':'); 8277424af660458104b732bdcb718874b17d0cab3aMarc Blank if (min < 10) 8377424af660458104b732bdcb718874b17d0cab3aMarc Blank sb.append('0'); 8477424af660458104b732bdcb718874b17d0cab3aMarc Blank sb.append(min); 8577424af660458104b732bdcb718874b17d0cab3aMarc Blank sb.append(':'); 8677424af660458104b732bdcb718874b17d0cab3aMarc Blank if (sec < 10) { 8777424af660458104b732bdcb718874b17d0cab3aMarc Blank sb.append('0'); 8877424af660458104b732bdcb718874b17d0cab3aMarc Blank } 8977424af660458104b732bdcb718874b17d0cab3aMarc Blank sb.append(sec); 9077424af660458104b732bdcb718874b17d0cab3aMarc Blank sb.append("] "); 9177424af660458104b732bdcb718874b17d0cab3aMarc Blank if (prefix != null) { 9277424af660458104b732bdcb718874b17d0cab3aMarc Blank sb.append(prefix); 9377424af660458104b732bdcb718874b17d0cab3aMarc Blank sb.append("| "); 9477424af660458104b732bdcb718874b17d0cab3aMarc Blank } 9577424af660458104b732bdcb718874b17d0cab3aMarc Blank sb.append(str); 9677424af660458104b732bdcb718874b17d0cab3aMarc Blank sb.append("\r\n"); 9777424af660458104b732bdcb718874b17d0cab3aMarc Blank String s = sb.toString(); 9877424af660458104b732bdcb718874b17d0cab3aMarc Blank 99f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank if (sLogWriter != null) { 1001403386ebffa1b6093a506a6a24db4523acdc315Marc Blank try { 101f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank sLogWriter.write(s); 102f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank sLogWriter.flush(); 1031403386ebffa1b6093a506a6a24db4523acdc315Marc Blank } catch (IOException e) { 104f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank // Something might have happened to the sdcard 105f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) { 106f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank // If the card is mounted and we can create the writer, retry 107f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank LOGGER = new FileLogger(); 108f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank if (sLogWriter != null) { 10910ac6ef35c65773d64d0513dc4fd9e4651c112ccMarc Blank try { 11010ac6ef35c65773d64d0513dc4fd9e4651c112ccMarc Blank log("FileLogger", "Exception writing log; recreating..."); 11110ac6ef35c65773d64d0513dc4fd9e4651c112ccMarc Blank log(prefix, str); 11210ac6ef35c65773d64d0513dc4fd9e4651c112ccMarc Blank } catch (Exception e1) { 11310ac6ef35c65773d64d0513dc4fd9e4651c112ccMarc Blank // Nothing to do at this point 11410ac6ef35c65773d64d0513dc4fd9e4651c112ccMarc Blank } 115f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank } 116f4fe042ce1aabc105e5e9b78c3f85bc15f41e7a7Marc Blank } 11777424af660458104b732bdcb718874b17d0cab3aMarc Blank } 11877424af660458104b732bdcb718874b17d0cab3aMarc Blank } 11977424af660458104b732bdcb718874b17d0cab3aMarc Blank } 12077424af660458104b732bdcb718874b17d0cab3aMarc Blank} 121