1a3f6ff4c2175d8fe93cc3826e1b1f96c9044a9acA. Unique TensorFlower/* Copyright 2015 The TensorFlow Authors. All Rights Reserved. 2854f49bd43588c062b046384f239f64a3d819702Manjunath Kudlur 3854f49bd43588c062b046384f239f64a3d819702Manjunath KudlurLicensed under the Apache License, Version 2.0 (the "License"); 4854f49bd43588c062b046384f239f64a3d819702Manjunath Kudluryou may not use this file except in compliance with the License. 5854f49bd43588c062b046384f239f64a3d819702Manjunath KudlurYou may obtain a copy of the License at 6854f49bd43588c062b046384f239f64a3d819702Manjunath Kudlur 7854f49bd43588c062b046384f239f64a3d819702Manjunath Kudlur http://www.apache.org/licenses/LICENSE-2.0 8854f49bd43588c062b046384f239f64a3d819702Manjunath Kudlur 9854f49bd43588c062b046384f239f64a3d819702Manjunath KudlurUnless required by applicable law or agreed to in writing, software 10854f49bd43588c062b046384f239f64a3d819702Manjunath Kudlurdistributed under the License is distributed on an "AS IS" BASIS, 11854f49bd43588c062b046384f239f64a3d819702Manjunath KudlurWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12854f49bd43588c062b046384f239f64a3d819702Manjunath KudlurSee the License for the specific language governing permissions and 13854f49bd43588c062b046384f239f64a3d819702Manjunath Kudlurlimitations under the License. 14854f49bd43588c062b046384f239f64a3d819702Manjunath Kudlur==============================================================================*/ 15854f49bd43588c062b046384f239f64a3d819702Manjunath Kudlur 16f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurpackage org.tensorflow.demo.env; 17f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 18f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurimport android.util.Log; 19f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 20f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurimport java.util.HashSet; 21f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurimport java.util.Set; 22f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 23f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur/** 24f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur * Wrapper for the platform log function, allows convenient message prefixing and log disabling. 25f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur */ 26f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurpublic final class Logger { 27f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur private static final String DEFAULT_TAG = "tensorflow"; 28f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur private static final int DEFAULT_MIN_LOG_LEVEL = Log.DEBUG; 29f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 30f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // Classes to be ignored when examining the stack trace 31f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur private static final Set<String> IGNORED_CLASS_NAMES; 32f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 33f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur static { 34f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur IGNORED_CLASS_NAMES = new HashSet<String>(3); 35f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur IGNORED_CLASS_NAMES.add("dalvik.system.VMStack"); 36f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur IGNORED_CLASS_NAMES.add("java.lang.Thread"); 37f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur IGNORED_CLASS_NAMES.add(Logger.class.getCanonicalName()); 38f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 39f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 40f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur private final String tag; 41f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur private final String messagePrefix; 42f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur private int minLogLevel = DEFAULT_MIN_LOG_LEVEL; 43f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 44f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur /** 45f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur * Creates a Logger using the class name as the message prefix. 46f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur * 47f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur * @param clazz the simple name of this class is used as the message prefix. 48f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur */ 49f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur public Logger(final Class<?> clazz) { 50f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur this(clazz.getSimpleName()); 51f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 52f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 53f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur /** 54f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur * Creates a Logger using the specified message prefix. 55f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur * 56f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur * @param messagePrefix is prepended to the text of every message. 57f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur */ 58f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur public Logger(final String messagePrefix) { 59f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur this(DEFAULT_TAG, messagePrefix); 60f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 61f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 62f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur /** 63f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur * Creates a Logger with a custom tag and a custom message prefix. If the message prefix 64f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur * is set to <pre>null</pre>, the caller's class name is used as the prefix. 65f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur * 66f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur * @param tag identifies the source of a log message. 67f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur * @param messagePrefix prepended to every message if non-null. If null, the name of the caller is 68f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur * being used 69f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur */ 70f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur public Logger(final String tag, final String messagePrefix) { 71f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur this.tag = tag; 72f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur final String prefix = messagePrefix == null ? getCallerSimpleName() : messagePrefix; 73f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur this.messagePrefix = (prefix.length() > 0) ? prefix + ": " : prefix; 74f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 75f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 76f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur /** 77f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur * Creates a Logger using the caller's class name as the message prefix. 78f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur */ 79f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur public Logger() { 80f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur this(DEFAULT_TAG, null); 81f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 82f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 83f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur /** 84f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur * Creates a Logger using the caller's class name as the message prefix. 85f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur */ 86f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur public Logger(final int minLogLevel) { 87f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur this(DEFAULT_TAG, null); 88f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur this.minLogLevel = minLogLevel; 89f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 90f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 91f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur public void setMinLogLevel(final int minLogLevel) { 92f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur this.minLogLevel = minLogLevel; 93f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 94f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 95f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur public boolean isLoggable(final int logLevel) { 96f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur return logLevel >= minLogLevel || Log.isLoggable(tag, logLevel); 97f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 98f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 99f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur /** 100f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur * Return caller's simple name. 101f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur * 102f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur * Android getStackTrace() returns an array that looks like this: 103f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur * stackTrace[0]: dalvik.system.VMStack 104f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur * stackTrace[1]: java.lang.Thread 105f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur * stackTrace[2]: com.google.android.apps.unveil.env.UnveilLogger 106f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur * stackTrace[3]: com.google.android.apps.unveil.BaseApplication 107f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur * 108f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur * This function returns the simple version of the first non-filtered name. 109f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur * 110f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur * @return caller's simple name 111f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur */ 112f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur private static String getCallerSimpleName() { 113f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // Get the current callstack so we can pull the class of the caller off of it. 114f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur final StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); 115f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 116f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur for (final StackTraceElement elem : stackTrace) { 117f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur final String className = elem.getClassName(); 118f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur if (!IGNORED_CLASS_NAMES.contains(className)) { 119f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur // We're only interested in the simple name of the class, not the complete package. 120f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur final String[] classParts = className.split("\\."); 121f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur return classParts[classParts.length - 1]; 122f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 123f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 124f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 125f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur return Logger.class.getSimpleName(); 126f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 127f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 128f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur private String toMessage(final String format, final Object... args) { 129f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur return messagePrefix + (args.length > 0 ? String.format(format, args) : format); 130f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 131f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 132f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur public void v(final String format, final Object... args) { 133f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur if (isLoggable(Log.VERBOSE)) { 134f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Log.v(tag, toMessage(format, args)); 135f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 136f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 137f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 138f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur public void v(final Throwable t, final String format, final Object... args) { 139f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur if (isLoggable(Log.VERBOSE)) { 140f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Log.v(tag, toMessage(format, args), t); 141f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 142f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 143f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 144f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur public void d(final String format, final Object... args) { 145f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur if (isLoggable(Log.DEBUG)) { 146f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Log.d(tag, toMessage(format, args)); 147f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 148f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 149f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 150f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur public void d(final Throwable t, final String format, final Object... args) { 151f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur if (isLoggable(Log.DEBUG)) { 152f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Log.d(tag, toMessage(format, args), t); 153f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 154f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 155f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 156f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur public void i(final String format, final Object... args) { 157f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur if (isLoggable(Log.INFO)) { 158f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Log.i(tag, toMessage(format, args)); 159f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 160f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 161f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 162f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur public void i(final Throwable t, final String format, final Object... args) { 163f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur if (isLoggable(Log.INFO)) { 164f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Log.i(tag, toMessage(format, args), t); 165f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 166f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 167f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 168f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur public void w(final String format, final Object... args) { 169f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur if (isLoggable(Log.WARN)) { 170f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Log.w(tag, toMessage(format, args)); 171f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 172f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 173f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 174f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur public void w(final Throwable t, final String format, final Object... args) { 175f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur if (isLoggable(Log.WARN)) { 176f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Log.w(tag, toMessage(format, args), t); 177f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 178f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 179f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 180f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur public void e(final String format, final Object... args) { 181f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur if (isLoggable(Log.ERROR)) { 182f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Log.e(tag, toMessage(format, args)); 183f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 184f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 185f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur 186f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur public void e(final Throwable t, final String format, final Object... args) { 187f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur if (isLoggable(Log.ERROR)) { 188f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur Log.e(tag, toMessage(format, args), t); 189f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 190f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur } 191f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur} 192