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