1a8ec8fcf6982ef158daf897faaab3e45285d0bf1Ronghua Wu/* 2a8ec8fcf6982ef158daf897faaab3e45285d0bf1Ronghua Wu** 3a8ec8fcf6982ef158daf897faaab3e45285d0bf1Ronghua Wu** Copyright 2015, The Android Open Source Project 4a8ec8fcf6982ef158daf897faaab3e45285d0bf1Ronghua Wu** 5a8ec8fcf6982ef158daf897faaab3e45285d0bf1Ronghua Wu** Licensed under the Apache License, Version 2.0 (the "License"); 6a8ec8fcf6982ef158daf897faaab3e45285d0bf1Ronghua Wu** you may not use this file except in compliance with the License. 7a8ec8fcf6982ef158daf897faaab3e45285d0bf1Ronghua Wu** You may obtain a copy of the License at 8a8ec8fcf6982ef158daf897faaab3e45285d0bf1Ronghua Wu** 9a8ec8fcf6982ef158daf897faaab3e45285d0bf1Ronghua Wu** http://www.apache.org/licenses/LICENSE-2.0 10a8ec8fcf6982ef158daf897faaab3e45285d0bf1Ronghua Wu** 11a8ec8fcf6982ef158daf897faaab3e45285d0bf1Ronghua Wu** Unless required by applicable law or agreed to in writing, software 12a8ec8fcf6982ef158daf897faaab3e45285d0bf1Ronghua Wu** distributed under the License is distributed on an "AS IS" BASIS, 13a8ec8fcf6982ef158daf897faaab3e45285d0bf1Ronghua Wu** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14a8ec8fcf6982ef158daf897faaab3e45285d0bf1Ronghua Wu** See the License for the specific language governing permissions and 15a8ec8fcf6982ef158daf897faaab3e45285d0bf1Ronghua Wu** limitations under the License. 16a8ec8fcf6982ef158daf897faaab3e45285d0bf1Ronghua Wu*/ 17a8ec8fcf6982ef158daf897faaab3e45285d0bf1Ronghua Wu 18a8ec8fcf6982ef158daf897faaab3e45285d0bf1Ronghua Wu//#define LOG_NDEBUG 0 19a8ec8fcf6982ef158daf897faaab3e45285d0bf1Ronghua Wu#define LOG_TAG "ServiceLog" 20a8ec8fcf6982ef158daf897faaab3e45285d0bf1Ronghua Wu#include <utils/Log.h> 21a8ec8fcf6982ef158daf897faaab3e45285d0bf1Ronghua Wu 22a8ec8fcf6982ef158daf897faaab3e45285d0bf1Ronghua Wu#include <time.h> 23a8ec8fcf6982ef158daf897faaab3e45285d0bf1Ronghua Wu 24a8ec8fcf6982ef158daf897faaab3e45285d0bf1Ronghua Wu#include "ServiceLog.h" 25a8ec8fcf6982ef158daf897faaab3e45285d0bf1Ronghua Wu 26a8ec8fcf6982ef158daf897faaab3e45285d0bf1Ronghua Wustatic const size_t kDefaultMaxNum = 100; 27a8ec8fcf6982ef158daf897faaab3e45285d0bf1Ronghua Wu 28a8ec8fcf6982ef158daf897faaab3e45285d0bf1Ronghua Wunamespace android { 29a8ec8fcf6982ef158daf897faaab3e45285d0bf1Ronghua Wu 30022ed72e650f756288492ac7a10a7b41e0b14f82Ronghua WuServiceLog::ServiceLog() : mMaxNum(kDefaultMaxNum), mLogs(mMaxNum) {} 31022ed72e650f756288492ac7a10a7b41e0b14f82Ronghua WuServiceLog::ServiceLog(size_t maxNum) : mMaxNum(maxNum), mLogs(mMaxNum) {} 32a8ec8fcf6982ef158daf897faaab3e45285d0bf1Ronghua Wu 33a8ec8fcf6982ef158daf897faaab3e45285d0bf1Ronghua Wuvoid ServiceLog::add(const String8 &log) { 34a8ec8fcf6982ef158daf897faaab3e45285d0bf1Ronghua Wu Mutex::Autolock lock(mLock); 35a8ec8fcf6982ef158daf897faaab3e45285d0bf1Ronghua Wu time_t now = time(0); 36a8ec8fcf6982ef158daf897faaab3e45285d0bf1Ronghua Wu char buf[64]; 37a8ec8fcf6982ef158daf897faaab3e45285d0bf1Ronghua Wu strftime(buf, sizeof(buf), "%m-%d %T", localtime(&now)); 38022ed72e650f756288492ac7a10a7b41e0b14f82Ronghua Wu mLogs.add(String8::format("%s %s", buf, log.string())); 39a8ec8fcf6982ef158daf897faaab3e45285d0bf1Ronghua Wu} 40a8ec8fcf6982ef158daf897faaab3e45285d0bf1Ronghua Wu 41022ed72e650f756288492ac7a10a7b41e0b14f82Ronghua WuString8 ServiceLog::toString(const char *linePrefix) const { 42a8ec8fcf6982ef158daf897faaab3e45285d0bf1Ronghua Wu Mutex::Autolock lock(mLock); 43a8ec8fcf6982ef158daf897faaab3e45285d0bf1Ronghua Wu String8 result; 44022ed72e650f756288492ac7a10a7b41e0b14f82Ronghua Wu for (const auto& log : mLogs) { 45022ed72e650f756288492ac7a10a7b41e0b14f82Ronghua Wu addLine(log.string(), linePrefix, &result); 46022ed72e650f756288492ac7a10a7b41e0b14f82Ronghua Wu } 47022ed72e650f756288492ac7a10a7b41e0b14f82Ronghua Wu if (mLogs.size() == mMaxNum) { 48022ed72e650f756288492ac7a10a7b41e0b14f82Ronghua Wu addLine("...", linePrefix, &result); 49022ed72e650f756288492ac7a10a7b41e0b14f82Ronghua Wu } else if (mLogs.size() == 0) { 50022ed72e650f756288492ac7a10a7b41e0b14f82Ronghua Wu addLine("[no events yet]", linePrefix, &result); 51a8ec8fcf6982ef158daf897faaab3e45285d0bf1Ronghua Wu } 52a8ec8fcf6982ef158daf897faaab3e45285d0bf1Ronghua Wu return result; 53a8ec8fcf6982ef158daf897faaab3e45285d0bf1Ronghua Wu} 54a8ec8fcf6982ef158daf897faaab3e45285d0bf1Ronghua Wu 55022ed72e650f756288492ac7a10a7b41e0b14f82Ronghua Wuvoid ServiceLog::addLine(const char *log, const char *prefix, String8 *result) const { 56022ed72e650f756288492ac7a10a7b41e0b14f82Ronghua Wu if (prefix != NULL) { 57022ed72e650f756288492ac7a10a7b41e0b14f82Ronghua Wu result->append(prefix); 58022ed72e650f756288492ac7a10a7b41e0b14f82Ronghua Wu } 59022ed72e650f756288492ac7a10a7b41e0b14f82Ronghua Wu result->append(log); 60022ed72e650f756288492ac7a10a7b41e0b14f82Ronghua Wu result->append("\n"); 61022ed72e650f756288492ac7a10a7b41e0b14f82Ronghua Wu} 62022ed72e650f756288492ac7a10a7b41e0b14f82Ronghua Wu 63a8ec8fcf6982ef158daf897faaab3e45285d0bf1Ronghua Wu} // namespace android 64