10175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn/* 20175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn * Copyright (C) 2012-2014 The Android Open Source Project 30175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn * 40175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn * Licensed under the Apache License, Version 2.0 (the "License"); 50175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn * you may not use this file except in compliance with the License. 60175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn * You may obtain a copy of the License at 70175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn * 80175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn * http://www.apache.org/licenses/LICENSE-2.0 90175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn * 100175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn * Unless required by applicable law or agreed to in writing, software 110175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn * distributed under the License is distributed on an "AS IS" BASIS, 120175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn * See the License for the specific language governing permissions and 140175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn * limitations under the License. 150175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn */ 160175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn 170175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn#ifndef _LOGD_LOG_BUFFER_ELEMENT_H__ 180175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn#define _LOGD_LOG_BUFFER_ELEMENT_H__ 190175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn 20f7c0f75275d0fde2d8b7614f1501f0ad0cd3a01cMark Salyzyn#include <stdatomic.h> 21ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn#include <stdlib.h> 2297c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn#include <sys/types.h> 2397c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn 24aeaaf81c2cc8366ac4f66eb3d2fc85f9b8194982Mark Salyzyn#include <log/log.h> 250175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn#include <sysutils/SocketClient.h> 260175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn 2721fb7e0b753b2251369bfaa1c6f6a09e58e64437Mark Salyzynclass LogBuffer; 2821fb7e0b753b2251369bfaa1c6f6a09e58e64437Mark Salyzyn 29501c373916e292764400dbae735f44b33378400fMark Salyzyn#define EXPIRE_HOUR_THRESHOLD 24 // Only expire chatty UID logs to preserve 30501c373916e292764400dbae735f44b33378400fMark Salyzyn // non-chatty UIDs less than this age in hours 31501c373916e292764400dbae735f44b33378400fMark Salyzyn#define EXPIRE_THRESHOLD 10 // A smaller expire count is considered too 32501c373916e292764400dbae735f44b33378400fMark Salyzyn // chatty for the temporal expire messages 33501c373916e292764400dbae735f44b33378400fMark Salyzyn#define EXPIRE_RATELIMIT 10 // maximum rate in seconds to report expiration 34833a9b1e38ce65f2cdf3ebd095aaa99a92eb9467Mark Salyzyn 3574e74f96a75209379facaf9d46f424c571b484a8Christopher Ferrisclass __attribute__((packed)) LogBufferElement { 36b6bee33182cedea49199eb2252b3f3b442899c6dMark Salyzyn friend LogBuffer; 37b6bee33182cedea49199eb2252b3f3b442899c6dMark Salyzyn 3860636fa872382a8cde0440b72cdfc9032b5fa7d0Mark Salyzyn // sized to match reality of incoming log packets 3960636fa872382a8cde0440b72cdfc9032b5fa7d0Mark Salyzyn const uint32_t mUid; 4060636fa872382a8cde0440b72cdfc9032b5fa7d0Mark Salyzyn const uint32_t mPid; 4160636fa872382a8cde0440b72cdfc9032b5fa7d0Mark Salyzyn const uint32_t mTid; 4260636fa872382a8cde0440b72cdfc9032b5fa7d0Mark Salyzyn log_time mRealTime; 43501c373916e292764400dbae735f44b33378400fMark Salyzyn char* mMsg; 44ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn union { 4574e74f96a75209379facaf9d46f424c571b484a8Christopher Ferris const uint16_t mMsgLen; // mDropped == false 4674e74f96a75209379facaf9d46f424c571b484a8Christopher Ferris uint16_t mDroppedCount; // mDropped == true 47ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn }; 4860636fa872382a8cde0440b72cdfc9032b5fa7d0Mark Salyzyn const uint8_t mLogId; 4974e74f96a75209379facaf9d46f424c571b484a8Christopher Ferris bool mDropped; 5060636fa872382a8cde0440b72cdfc9032b5fa7d0Mark Salyzyn 51f7c0f75275d0fde2d8b7614f1501f0ad0cd3a01cMark Salyzyn static atomic_int_fast64_t sequence; 520175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn 5374e74f96a75209379facaf9d46f424c571b484a8Christopher Ferris // assumption: mDropped == true 54501c373916e292764400dbae735f44b33378400fMark Salyzyn size_t populateDroppedMessage(char*& buffer, LogBuffer* parent, 55b5b879678522882e6dbb02511379518d2b7b545dMark Salyzyn bool lastSame); 56501c373916e292764400dbae735f44b33378400fMark Salyzyn 57501c373916e292764400dbae735f44b33378400fMark Salyzyn public: 58501c373916e292764400dbae735f44b33378400fMark Salyzyn LogBufferElement(log_id_t log_id, log_time realtime, uid_t uid, pid_t pid, 59501c373916e292764400dbae735f44b33378400fMark Salyzyn pid_t tid, const char* msg, unsigned short len); 60501c373916e292764400dbae735f44b33378400fMark Salyzyn LogBufferElement(const LogBufferElement& elem); 6174e74f96a75209379facaf9d46f424c571b484a8Christopher Ferris ~LogBufferElement(); 620175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn 6360636fa872382a8cde0440b72cdfc9032b5fa7d0Mark Salyzyn bool isBinary(void) const { 6460636fa872382a8cde0440b72cdfc9032b5fa7d0Mark Salyzyn return (mLogId == LOG_ID_EVENTS) || (mLogId == LOG_ID_SECURITY); 6560636fa872382a8cde0440b72cdfc9032b5fa7d0Mark Salyzyn } 6660636fa872382a8cde0440b72cdfc9032b5fa7d0Mark Salyzyn 67501c373916e292764400dbae735f44b33378400fMark Salyzyn log_id_t getLogId() const { 68501c373916e292764400dbae735f44b33378400fMark Salyzyn return static_cast<log_id_t>(mLogId); 69501c373916e292764400dbae735f44b33378400fMark Salyzyn } 70501c373916e292764400dbae735f44b33378400fMark Salyzyn uid_t getUid(void) const { 71501c373916e292764400dbae735f44b33378400fMark Salyzyn return mUid; 72501c373916e292764400dbae735f44b33378400fMark Salyzyn } 73501c373916e292764400dbae735f44b33378400fMark Salyzyn pid_t getPid(void) const { 74501c373916e292764400dbae735f44b33378400fMark Salyzyn return mPid; 75501c373916e292764400dbae735f44b33378400fMark Salyzyn } 76501c373916e292764400dbae735f44b33378400fMark Salyzyn pid_t getTid(void) const { 77501c373916e292764400dbae735f44b33378400fMark Salyzyn return mTid; 78501c373916e292764400dbae735f44b33378400fMark Salyzyn } 7974e74f96a75209379facaf9d46f424c571b484a8Christopher Ferris uint32_t getTag() const; 80501c373916e292764400dbae735f44b33378400fMark Salyzyn unsigned short getDropped(void) const { 8174e74f96a75209379facaf9d46f424c571b484a8Christopher Ferris return mDropped ? mDroppedCount : 0; 82ab0dcf682867bd7e1fdebfd8d8f9fafaccfad7f6Mark Salyzyn } 8374e74f96a75209379facaf9d46f424c571b484a8Christopher Ferris unsigned short setDropped(unsigned short value); 84501c373916e292764400dbae735f44b33378400fMark Salyzyn unsigned short getMsgLen() const { 8574e74f96a75209379facaf9d46f424c571b484a8Christopher Ferris return mDropped ? 0 : mMsgLen; 86501c373916e292764400dbae735f44b33378400fMark Salyzyn } 87501c373916e292764400dbae735f44b33378400fMark Salyzyn const char* getMsg() const { 8874e74f96a75209379facaf9d46f424c571b484a8Christopher Ferris return mDropped ? nullptr : mMsg; 89501c373916e292764400dbae735f44b33378400fMark Salyzyn } 90501c373916e292764400dbae735f44b33378400fMark Salyzyn log_time getRealTime(void) const { 91501c373916e292764400dbae735f44b33378400fMark Salyzyn return mRealTime; 92501c373916e292764400dbae735f44b33378400fMark Salyzyn } 930175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn 945a34d6ea43d28f3b5d27bf6dd5b9fa31ec033531Mark Salyzyn static const log_time FLUSH_ERROR; 955a34d6ea43d28f3b5d27bf6dd5b9fa31ec033531Mark Salyzyn log_time flushTo(SocketClient* writer, LogBuffer* parent, bool privileged, 96501c373916e292764400dbae735f44b33378400fMark Salyzyn bool lastSame); 970175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn}; 980175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn 990175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn#endif 100