Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to configure java.util.logging.logger in android to use a logging properties file placed on the sdcard?

I have been trying to use java.util.logging.logger to log stuff on to a file on sdcard. Now, I want the logger to use a logging configuration/properties file that I will provide on the sdcard.

One way that I have been trying is:-

I have been trying to use logmanager and java.util.prefs.preferences, but I get the BackingStoreException-->AccessPermission Exception perculating down to an error message that .java/.userprefs/path represented by str/prefs.xml was not found.

private void setLoggingProperties(File logProperties) throws Exception {
    try {
    if(logProperties!=null && logProperties.isFile() && logProperties.exists()) {
        String str = logProperties.getAbsolutePath();
        MyLogger.v(TAG,"Log Properties file path: " + str);
        if(str!=null && str.length()>=0) {
            Preferences logPropPref = Preferences.userNodeForPackage(SSCService.class);

            if(logPropPref!=null) {
                String path = logPropPref.get(LOG_CONFIG_FILE_KEY,"");
                if(path.equals(str)) {
                    SirfLogger.v(TAG,"No need to set config for log");
                    return;
                }
                MyLogger.v(TAG,"Setting log properties: " + str);
                logPropPref.put(LOG_CONFIG_FILE_KEY, str);
                logPropPref.flush();
            }
            LogManager lManager = LogManager.getLogManager();
            if(lManager!=null) {
                lManager.readConfiguration();
            }

        }   

    } 
    } catch(Exception ex) {
        MyLogger.v(TAG, "Exception setting log properties: " + ex.toString() + " , ignoring" );
    }

}

May anyone provide some insight please?

-Robin

like image 551
Robin Avatar asked Jun 04 '12 11:06

Robin


1 Answers

After going through the available documentation and doing some hit and trials. This is how it works:-

        static final String LOGGER_NAME = "com.robin.mylogger"
        LogManager lManager = LogManager.getLogManager();
        FileInputStream is = new FileInputStream(logProperties);
        if(lManager!=null) {
            lManager.readConfiguration(is);

        }
        mLoggerInstance = Logger.getLogger(LOGGER_NAME);
         if(mLoggerInstance!=null)
             LogManager.getLogManager().addLogger(mLoggerInstance);

logging.properties

               ############################################################
               #    Default Logging Configuration File
#
# You can use a different file by specifying a filename
# with the java.util.logging.config.file system property.  
# For example java -Djava.util.logging.config.file=myfile
############################################################

############################################################
#   Global properties
############################################################

# "handlers" specifies a comma separated list of log Handler 
# classes.  These handlers will be installed during VM startup.
# Note that these classes must be on the system classpath.
# By default we only configure a ConsoleHandler, which will only
# show messages at the INFO and above levels.
#handlers= java.util.logging.ConsoleHandler

# To also add the FileHandler, use the following line instead.
handlers= java.util.logging.FileHandler, com.android.internal.logging.AndroidHandler

# Default global logging level.
# This specifies which kinds of events are logged across
# all loggers.  For any given facility this global level
# can be overriden by a facility specific level
# Note that the ConsoleHandler also has a separate level
# setting to limit messages printed to the console.
.level= FINEST

############################################################
# Handler specific properties.
# Describes specific configuration info for Handlers.
############################################################

# default file output is in user's home directory.
java.util.logging.FileHandler.pattern = /mnt/sdcard/csr/logs/test.log
java.util.logging.FileHandler.limit = 5000000
java.util.logging.FileHandler.count = 1
java.util.logging.FileHandler.level = FINEST
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter

# Limit the message that are printed on the console to INFO and above.
#java.util.logging.ConsoleHandler.level = FINEST
#java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

com.android.internal.logging.AndroidHandler.level = FINEST
com.android.internal.logging.AndroidHandler.formatter = java.util.logging.SimpleFormatter


############################################################
# Facility specific properties.
# Provides extra control for each logger.
############################################################

# For example, set the com.xyz.foo logger to only log SEVERE
# messages:
#com.robin.mylogger.level = FINEST

Please note that there are two handlers being used in the logging.properties here. One is filehandler, which logs on to the file, and the other one is com.android.internal.logging.AndroidHandler(which is responsible for displaying the logs properly in logcat). The addition of com.android.internal.logging.AndroidHandler is necessary if you want to see the logs in logcat as well. If you will not add this handler in the logging properties, all the logs will be thrown on logcat as sys.err (warn level).

like image 82
Robin Avatar answered Nov 15 '22 07:11

Robin