diff options
Diffstat (limited to 'core/java/com/android/internal/logging/AndroidHandler.java')
-rw-r--r-- | core/java/com/android/internal/logging/AndroidHandler.java | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/core/java/com/android/internal/logging/AndroidHandler.java b/core/java/com/android/internal/logging/AndroidHandler.java new file mode 100644 index 0000000..a6a4c64 --- /dev/null +++ b/core/java/com/android/internal/logging/AndroidHandler.java @@ -0,0 +1,150 @@ +/* + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.internal.logging; + +import android.util.Log; + +import java.util.logging.Formatter; +import java.util.logging.Handler; +import java.util.logging.Level; +import java.util.logging.LogRecord; +import java.util.logging.SimpleFormatter; + +/** + * Implements a {@link java.util.Logger} handler that writes to the Android log. The + * implementation is rather straightforward. The name of the logger serves as + * the log tag. Only the log levels need to be converted appropriately. For + * this purpose, the following mapping is being used: + * + * <table> + * <tr> + * <th>logger level</th> + * <th>Android level</th> + * </tr> + * <tr> + * <td> + * SEVERE + * </td> + * <td> + * ERROR + * </td> + * </tr> + * <tr> + * <td> + * WARNING + * </td> + * <td> + * WARN + * </td> + * </tr> + * <tr> + * <td> + * INFO + * </td> + * <td> + * INFO + * </td> + * </tr> + * <tr> + * <td> + * CONFIG + * </td> + * <td> + * DEBUG + * </td> + * </tr> + * <tr> + * <td> + * FINE, FINER, FINEST + * </td> + * <td> + * VERBOSE + * </td> + * </tr> + * </table> + */ +public class AndroidHandler extends Handler { + /** + * Holds the formatter for all Android log handlers. + */ + private static final Formatter THE_FORMATTER = new SimpleFormatter(); + + /** + * Constructs a new instance of the Android log handler. + */ + public AndroidHandler() { + setFormatter(THE_FORMATTER); + } + + @Override + public void close() { + // No need to close, but must implement abstract method. + } + + @Override + public void flush() { + // No need to flush, but must implement abstract method. + } + + @Override + public void publish(LogRecord record) { + try { + int level = getAndroidLevel(record.getLevel()); + String tag = record.getLoggerName(); + + if (!Log.isLoggable(tag, level)) { + return; + } + + String msg; + try { + msg = getFormatter().format(record); + } catch (RuntimeException e) { + Log.e("AndroidHandler", "Error formatting log record", e); + msg = record.getMessage(); + } + Log.println(level, tag, msg); + } catch (RuntimeException e) { + Log.e("AndroidHandler", "Error publishing log record", e); + } + } + + /** + * Converts a {@link java.util.Logger} logging level into an Android one. + * + * @param level The {@link java.util.Logger} logging level. + * + * @return The resulting Android logging level. + */ + static int getAndroidLevel(Level level) + { + int value = level.intValue(); + + if (value >= Level.SEVERE.intValue()) { + return Log.ERROR; + } else if (value >= Level.WARNING.intValue()) { + return Log.WARN; + } else if (value >= Level.INFO.intValue()) { + return Log.INFO; + } else if (value >= Level.CONFIG.intValue()) { + return Log.DEBUG; + } else { + return Log.VERBOSE; + } + } + +} |