blob: b8d1e79bcc418d78508d2e553668835865d6faab [file] [log] [blame]
Mark Salyzyn42958412013-11-22 10:50:27 -08001/*
2**
Mark Salyzyne9c41962014-01-02 13:52:29 -08003** Copyright 2007-2014, The Android Open Source Project
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -08004**
5** This file is dual licensed. It may be redistributed and/or modified
6** under the terms of the Apache 2.0 License OR version 2 of the GNU
7** General Public License.
8*/
9
Mark Salyzyn318bb722014-01-10 14:07:58 -080010#ifndef _LIBS_LOG_LOGGER_H
11#define _LIBS_LOG_LOGGER_H
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -080012
13#include <stdint.h>
Mark Salyzynba7a9a02015-12-01 15:57:25 -080014#ifdef __linux__
15#include <time.h> /* clockid_t definition */
16#endif
17
Mark Salyzyn8eaaac02016-09-27 11:18:29 -070018#ifdef __cplusplus
19#include <string>
20#endif
21
Mark Salyzyn42958412013-11-22 10:50:27 -080022#include <log/log.h>
Mark Salyzynfa3716b2014-02-14 16:05:05 -080023#include <log/log_read.h>
Mark Salyzyn42958412013-11-22 10:50:27 -080024
Mark Salyzynf387fa52014-01-03 16:54:28 -080025#ifdef __cplusplus
26extern "C" {
27#endif
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -080028
Nick Kralevich6756a0c2012-03-22 14:28:16 -070029/*
30 * The userspace structure for version 1 of the logger_entry ABI.
31 * This structure is returned to userspace by the kernel logger
32 * driver unless an upgrade to a newer ABI version is requested.
33 */
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -080034struct logger_entry {
35 uint16_t len; /* length of the payload */
36 uint16_t __pad; /* no matter what, we get 2 bytes of padding */
37 int32_t pid; /* generating process's pid */
38 int32_t tid; /* generating process's tid */
39 int32_t sec; /* seconds since Epoch */
40 int32_t nsec; /* nanoseconds */
41 char msg[0]; /* the entry's payload */
Mark Salyzyn7e2f83c2014-03-05 07:41:49 -080042} __attribute__((__packed__));
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -080043
Nick Kralevich6756a0c2012-03-22 14:28:16 -070044/*
45 * The userspace structure for version 2 of the logger_entry ABI.
46 * This structure is returned to userspace if ioctl(LOGGER_SET_VERSION)
Mark Salyzyn0175b072014-02-26 09:50:16 -080047 * is called with version==2; or used with the user space log daemon.
Nick Kralevich6756a0c2012-03-22 14:28:16 -070048 */
49struct logger_entry_v2 {
50 uint16_t len; /* length of the payload */
51 uint16_t hdr_size; /* sizeof(struct logger_entry_v2) */
52 int32_t pid; /* generating process's pid */
53 int32_t tid; /* generating process's tid */
54 int32_t sec; /* seconds since Epoch */
55 int32_t nsec; /* nanoseconds */
56 uint32_t euid; /* effective UID of logger */
57 char msg[0]; /* the entry's payload */
Mark Salyzyn7e2f83c2014-03-05 07:41:49 -080058} __attribute__((__packed__));
Nick Kralevich6756a0c2012-03-22 14:28:16 -070059
Mark Salyzyn0175b072014-02-26 09:50:16 -080060struct logger_entry_v3 {
61 uint16_t len; /* length of the payload */
Mark Salyzyn7e2f83c2014-03-05 07:41:49 -080062 uint16_t hdr_size; /* sizeof(struct logger_entry_v3) */
Mark Salyzyn0175b072014-02-26 09:50:16 -080063 int32_t pid; /* generating process's pid */
64 int32_t tid; /* generating process's tid */
65 int32_t sec; /* seconds since Epoch */
66 int32_t nsec; /* nanoseconds */
67 uint32_t lid; /* log id of the payload */
68 char msg[0]; /* the entry's payload */
Mark Salyzyn7e2f83c2014-03-05 07:41:49 -080069} __attribute__((__packed__));
Mark Salyzyn0175b072014-02-26 09:50:16 -080070
Mark Salyzyn9b292f52015-12-03 15:37:00 -080071struct logger_entry_v4 {
72 uint16_t len; /* length of the payload */
73 uint16_t hdr_size; /* sizeof(struct logger_entry_v4) */
74 int32_t pid; /* generating process's pid */
75 uint32_t tid; /* generating process's tid */
76 uint32_t sec; /* seconds since Epoch */
77 uint32_t nsec; /* nanoseconds */
78 uint32_t lid; /* log id of the payload, bottom 4 bits currently */
79 uint32_t uid; /* generating process's uid */
80 char msg[0]; /* the entry's payload */
81} __attribute__((__packed__));
82
Nick Kralevich6756a0c2012-03-22 14:28:16 -070083/*
84 * The maximum size of the log entry payload that can be
Mark Salyzyn48878422014-05-22 16:08:52 -070085 * written to the logger. An attempt to write more than
86 * this amount will result in a truncated log entry.
Nick Kralevich6756a0c2012-03-22 14:28:16 -070087 */
Mark Salyzyn8eaaac02016-09-27 11:18:29 -070088#define LOGGER_ENTRY_MAX_PAYLOAD 4068
Nick Kralevich6756a0c2012-03-22 14:28:16 -070089
90/*
91 * The maximum size of a log entry which can be read from the
92 * kernel logger driver. An attempt to read less than this amount
93 * may result in read() returning EINVAL.
94 */
Mark Salyzyn8eaaac02016-09-27 11:18:29 -070095#define LOGGER_ENTRY_MAX_LEN (5*1024)
The Android Open Source Projectdd7bc332009-03-03 19:32:55 -080096
Mark Salyzyn42958412013-11-22 10:50:27 -080097#define NS_PER_SEC 1000000000ULL
98
99struct log_msg {
100 union {
101 unsigned char buf[LOGGER_ENTRY_MAX_LEN + 1];
Mark Salyzyn9b292f52015-12-03 15:37:00 -0800102 struct logger_entry_v4 entry;
103 struct logger_entry_v4 entry_v4;
Mark Salyzyn0175b072014-02-26 09:50:16 -0800104 struct logger_entry_v3 entry_v3;
Mark Salyzyn42958412013-11-22 10:50:27 -0800105 struct logger_entry_v2 entry_v2;
106 struct logger_entry entry_v1;
Mark Salyzyn42958412013-11-22 10:50:27 -0800107 } __attribute__((aligned(4)));
108#ifdef __cplusplus
Mark Salyzyn318bb722014-01-10 14:07:58 -0800109 /* Matching log_time operators */
110 bool operator== (const log_msg &T) const
Mark Salyzyn42958412013-11-22 10:50:27 -0800111 {
112 return (entry.sec == T.entry.sec) && (entry.nsec == T.entry.nsec);
113 }
Mark Salyzyn318bb722014-01-10 14:07:58 -0800114 bool operator!= (const log_msg &T) const
Mark Salyzyn42958412013-11-22 10:50:27 -0800115 {
116 return !(*this == T);
117 }
Mark Salyzyn318bb722014-01-10 14:07:58 -0800118 bool operator< (const log_msg &T) const
Mark Salyzyn42958412013-11-22 10:50:27 -0800119 {
120 return (entry.sec < T.entry.sec)
121 || ((entry.sec == T.entry.sec)
122 && (entry.nsec < T.entry.nsec));
123 }
Mark Salyzyn318bb722014-01-10 14:07:58 -0800124 bool operator>= (const log_msg &T) const
Mark Salyzyn42958412013-11-22 10:50:27 -0800125 {
126 return !(*this < T);
127 }
Mark Salyzyn318bb722014-01-10 14:07:58 -0800128 bool operator> (const log_msg &T) const
Mark Salyzyn42958412013-11-22 10:50:27 -0800129 {
130 return (entry.sec > T.entry.sec)
131 || ((entry.sec == T.entry.sec)
132 && (entry.nsec > T.entry.nsec));
133 }
Mark Salyzyn318bb722014-01-10 14:07:58 -0800134 bool operator<= (const log_msg &T) const
Mark Salyzyn42958412013-11-22 10:50:27 -0800135 {
136 return !(*this > T);
137 }
Mark Salyzyn0175b072014-02-26 09:50:16 -0800138 uint64_t nsec() const
Mark Salyzyn42958412013-11-22 10:50:27 -0800139 {
140 return static_cast<uint64_t>(entry.sec) * NS_PER_SEC + entry.nsec;
141 }
142
143 /* packet methods */
Mark Salyzyn0175b072014-02-26 09:50:16 -0800144 log_id_t id()
Mark Salyzyn42958412013-11-22 10:50:27 -0800145 {
Mark Salyzyn154f4602014-02-20 14:59:07 -0800146 return (log_id_t) entry.lid;
Mark Salyzyn42958412013-11-22 10:50:27 -0800147 }
Mark Salyzyn0175b072014-02-26 09:50:16 -0800148 char *msg()
Mark Salyzyn42958412013-11-22 10:50:27 -0800149 {
Mark Salyzyn305374c2016-08-18 14:59:41 -0700150 unsigned short hdr_size = entry.hdr_size;
151 if (!hdr_size) {
152 hdr_size = sizeof(entry_v1);
153 }
154 if ((hdr_size < sizeof(entry_v1)) || (hdr_size > sizeof(entry))) {
155 return NULL;
156 }
157 return (char *) buf + hdr_size;
Mark Salyzyn42958412013-11-22 10:50:27 -0800158 }
Mark Salyzyn0175b072014-02-26 09:50:16 -0800159 unsigned int len()
Mark Salyzyn42958412013-11-22 10:50:27 -0800160 {
161 return (entry.hdr_size ? entry.hdr_size : sizeof(entry_v1)) + entry.len;
162 }
163#endif
164};
165
166struct logger;
167
168log_id_t android_logger_get_id(struct logger *logger);
169
170int android_logger_clear(struct logger *logger);
Mark Salyzyndfa7a072014-02-11 12:29:31 -0800171long android_logger_get_log_size(struct logger *logger);
Mark Salyzyndfa7a072014-02-11 12:29:31 -0800172int android_logger_set_log_size(struct logger *logger, unsigned long size);
Mark Salyzyndfa7a072014-02-11 12:29:31 -0800173long android_logger_get_log_readable_size(struct logger *logger);
Mark Salyzyn42958412013-11-22 10:50:27 -0800174int android_logger_get_log_version(struct logger *logger);
175
176struct logger_list;
177
Mark Salyzyn34facab2014-02-06 14:48:50 -0800178ssize_t android_logger_get_statistics(struct logger_list *logger_list,
179 char *buf, size_t len);
Mark Salyzyndfa7a072014-02-11 12:29:31 -0800180ssize_t android_logger_get_prune_list(struct logger_list *logger_list,
181 char *buf, size_t len);
182int android_logger_set_prune_list(struct logger_list *logger_list,
183 char *buf, size_t len);
Mark Salyzyn34facab2014-02-06 14:48:50 -0800184
Mark Salyzyn2d3f38a2015-01-26 10:46:44 -0800185#define ANDROID_LOG_RDONLY O_RDONLY
186#define ANDROID_LOG_WRONLY O_WRONLY
187#define ANDROID_LOG_RDWR O_RDWR
188#define ANDROID_LOG_ACCMODE O_ACCMODE
189#define ANDROID_LOG_NONBLOCK O_NONBLOCK
Mark Salyzynf8e546e2015-11-30 11:36:09 -0800190#define ANDROID_LOG_WRAP 0x40000000 /* Block until buffer about to wrap */
191#define ANDROID_LOG_WRAP_DEFAULT_TIMEOUT 7200 /* 2 hour default */
Mark Salyzyn6eef4172014-12-15 09:51:39 -0800192#define ANDROID_LOG_PSTORE 0x80000000
Mark Salyzyn2d3f38a2015-01-26 10:46:44 -0800193
Mark Salyzyn42958412013-11-22 10:50:27 -0800194struct logger_list *android_logger_list_alloc(int mode,
195 unsigned int tail,
196 pid_t pid);
Mark Salyzynfa3716b2014-02-14 16:05:05 -0800197struct logger_list *android_logger_list_alloc_time(int mode,
198 log_time start,
199 pid_t pid);
Mark Salyzyn42958412013-11-22 10:50:27 -0800200void android_logger_list_free(struct logger_list *logger_list);
201/* In the purest sense, the following two are orthogonal interfaces */
202int android_logger_list_read(struct logger_list *logger_list,
203 struct log_msg *log_msg);
204
205/* Multiple log_id_t opens */
206struct logger *android_logger_open(struct logger_list *logger_list,
207 log_id_t id);
208#define android_logger_close android_logger_free
209/* Single log_id_t open */
210struct logger_list *android_logger_list_open(log_id_t id,
211 int mode,
212 unsigned int tail,
213 pid_t pid);
214#define android_logger_list_close android_logger_list_free
215
Mark Salyzynba7a9a02015-12-01 15:57:25 -0800216#ifdef __linux__
217clockid_t android_log_clockid();
218#endif
Mark Salyzyn500afc72015-09-08 08:32:01 -0700219
Mark Salyzyn42958412013-11-22 10:50:27 -0800220/*
221 * log_id_t helpers
222 */
223log_id_t android_name_to_log_id(const char *logName);
224const char *android_log_id_to_name(log_id_t log_id);
225
Mark Salyzynf387fa52014-01-03 16:54:28 -0800226#ifdef __cplusplus
Mark Salyzyn8eaaac02016-09-27 11:18:29 -0700227// android_log_context C++ helpers
228class android_log_event_context {
229 android_log_context ctx;
230 int ret;
231
232public:
233 explicit android_log_event_context(int tag) : ret(0) {
234 ctx = create_android_logger(tag);
235 }
236 explicit android_log_event_context(log_msg& log_msg) : ret(0) {
237 ctx = create_android_log_parser(log_msg.msg() + sizeof(uint32_t),
238 log_msg.entry.len - sizeof(uint32_t));
239 }
240 ~android_log_event_context() { android_log_destroy(&ctx); }
241
242 int close() {
243 int retval = android_log_destroy(&ctx);
244 if (retval < 0) ret = retval;
245 return retval;
246 }
247
248 // To allow above C calls to use this class as parameter
249 operator android_log_context() const { return ctx; };
250
251 int error() const { return ret; }
252
253 int begin() {
254 int retval = android_log_write_list_begin(ctx);
255 if (retval < 0) ret = retval;
256 return ret;
257 }
258 int end() {
259 int retval = android_log_write_list_end(ctx);
260 if (retval < 0) ret = retval;
261 return ret;
262 }
263
264 android_log_event_context& operator <<(int32_t value) {
265 int retval = android_log_write_int32(ctx, value);
266 if (retval < 0) ret = retval;
267 return *this;
268 }
269 android_log_event_context& operator <<(uint32_t value) {
270 int retval = android_log_write_int32(ctx, value);
271 if (retval < 0) ret = retval;
272 return *this;
273 }
274 android_log_event_context& operator <<(int64_t value) {
275 int retval = android_log_write_int64(ctx, value);
276 if (retval < 0) ret = retval;
277 return *this;
278 }
279 android_log_event_context& operator <<(uint64_t value) {
280 int retval = android_log_write_int64(ctx, value);
281 if (retval < 0) ret = retval;
282 return *this;
283 }
284 android_log_event_context& operator <<(const char* value) {
285 int retval = android_log_write_string8(ctx, value);
286 if (retval < 0) ret = retval;
287 return *this;
288 }
289 android_log_event_context& operator <<(std::string& value) {
290 int retval = android_log_write_string8_len(ctx,
291 value.data(),
292 value.length());
293 if (retval < 0) ret = retval;
294 return *this;
295 }
296 android_log_event_context& operator <<(float value) {
297 int retval = android_log_write_float32(ctx, value);
298 if (retval < 0) ret = retval;
299 return *this;
300 }
301
302 int write(log_id_t id) {
303 int retval = android_log_write_list(ctx, id);
304 if (retval < 0) ret = retval;
305 return ret;
306 }
307
308 android_log_list_element read() { return android_log_read_next(ctx); }
309 android_log_list_element peak() { return android_log_peek_next(ctx); }
310
311};
312#endif
313
314#ifdef __cplusplus
Mark Salyzynf387fa52014-01-03 16:54:28 -0800315}
316#endif
Mark Salyzyn42958412013-11-22 10:50:27 -0800317
Mark Salyzyn318bb722014-01-10 14:07:58 -0800318#endif /* _LIBS_LOG_LOGGER_H */