18103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackborn/* 28103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackborn * Copyright (C) 2012 The Android Open Source Project 38103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackborn * 48103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 58103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackborn * you may not use this file except in compliance with the License. 68103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackborn * You may obtain a copy of the License at 78103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackborn * 88103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 98103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackborn * 108103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackborn * Unless required by applicable law or agreed to in writing, software 118103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 128103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackborn * See the License for the specific language governing permissions and 148103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackborn * limitations under the License. 158103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackborn */ 168103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackborn 178103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackbornpackage com.android.internal.util; 188103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackborn 198103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackbornimport java.io.PrintWriter; 208103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackbornimport java.util.ArrayList; 218103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackborn 228103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackbornimport android.util.Slog; 2361e03292077343a4a3282f5ce513ee8f9152e255Kweku Adamsimport android.util.proto.ProtoOutputStream; 248103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackborn 258103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackborn/** 268103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackborn * Helper class for logging serious issues, which also keeps a small 278103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackborn * snapshot of the logged events that can be printed later, such as part 288103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackborn * of a system service's dumpsys output. 298103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackborn * @hide 308103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackborn */ 318103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackbornpublic class LocalLog { 328103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackborn private final String mTag; 338103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackborn private final int mMaxLines = 20; 348103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackborn private final ArrayList<String> mLines = new ArrayList<String>(mMaxLines); 358103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackborn 368103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackborn public LocalLog(String tag) { 378103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackborn mTag = tag; 388103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackborn } 398103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackborn 408103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackborn public void w(String msg) { 418103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackborn synchronized (mLines) { 428103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackborn Slog.w(mTag, msg); 438103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackborn if (mLines.size() >= mMaxLines) { 448103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackborn mLines.remove(0); 458103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackborn } 468103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackborn mLines.add(msg); 478103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackborn } 488103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackborn } 498103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackborn 508103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackborn public boolean dump(PrintWriter pw, String header, String prefix) { 518103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackborn synchronized (mLines) { 528103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackborn if (mLines.size() <= 0) { 538103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackborn return false; 548103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackborn } 558103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackborn if (header != null) { 568103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackborn pw.println(header); 578103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackborn } 588103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackborn for (int i=0; i<mLines.size(); i++) { 598103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackborn if (prefix != null) { 608103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackborn pw.print(prefix); 618103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackborn } 628103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackborn pw.println(mLines.get(i)); 638103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackborn } 648103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackborn return true; 658103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackborn } 668103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackborn } 6761e03292077343a4a3282f5ce513ee8f9152e255Kweku Adams 6861e03292077343a4a3282f5ce513ee8f9152e255Kweku Adams public void writeToProto(ProtoOutputStream proto, long fieldId) { 6961e03292077343a4a3282f5ce513ee8f9152e255Kweku Adams final long token = proto.start(fieldId); 7061e03292077343a4a3282f5ce513ee8f9152e255Kweku Adams 7161e03292077343a4a3282f5ce513ee8f9152e255Kweku Adams synchronized (mLines) { 7261e03292077343a4a3282f5ce513ee8f9152e255Kweku Adams for (int i = 0; i < mLines.size(); ++i) { 7361e03292077343a4a3282f5ce513ee8f9152e255Kweku Adams proto.write(LocalLogProto.LINES, mLines.get(i)); 7461e03292077343a4a3282f5ce513ee8f9152e255Kweku Adams } 7561e03292077343a4a3282f5ce513ee8f9152e255Kweku Adams } 7661e03292077343a4a3282f5ce513ee8f9152e255Kweku Adams 7761e03292077343a4a3282f5ce513ee8f9152e255Kweku Adams proto.end(token); 7861e03292077343a4a3282f5ce513ee8f9152e255Kweku Adams } 798103890a59de6ed4abaedaad80e66666ea59f9b5Dianne Hackborn} 80