| // Copyright 2018 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| library fuchsia.logger; |
| |
| using zx; |
| |
| enum LogLevelFilter : int8 { |
| NONE = -1; |
| INFO = 0; |
| WARN = 1; |
| ERROR = 2; |
| FATAL = 3; |
| }; |
| |
| // Max tags that can be passed to filter by listener. |
| const uint8 MAX_TAGS = 5; |
| |
| // Max tag length that can be passed to filter by listener. |
| const uint8 MAX_TAG_LEN_BYTES = 63; |
| |
| struct LogFilterOptions { |
| bool filter_by_pid; |
| uint64 pid; |
| |
| bool filter_by_tid; |
| uint64 tid; |
| |
| // If more than zero, logs would be filtered based on verbosity and |
| // |min_severity| would be ignored. |
| uint8 verbosity; |
| |
| LogLevelFilter min_severity; |
| |
| // If non-empty, return all messages which contain at least one specified |
| // tag. If empty, messages will not be filtered by tag. |
| // Passed tags should not be more than |MAX_TAG_LEN_BYTES| bytes in length |
| // and max tags can be |MAX_TAGS|. |
| // Listener would be discarded if the limit is not followed. |
| vector<string>:MAX_TAGS tags; |
| }; |
| |
| // Max tags that will be attached to a LogMessage. |
| const uint8 MAX_TAGS_PER_LOG_MESSAGE = 5; |
| |
| struct LogMessage { |
| uint64 pid; |
| uint64 tid; |
| // Nanoseconds since the system was powered on, aka ZX_CLOCK_MONOTONIC. |
| // https://fuchsia.googlesource.com/zircon/+/master/docs/syscalls/clock_get.md#supported-clock-ids |
| zx.time time; |
| int32 severity; |
| |
| // See //zircon/system/ulib/syslog/include/syslog/wire_format.h. As messages |
| // can be served out of order, this should only be logged if more than last |
| // count. |
| uint32 dropped_logs; |
| vector<string>:MAX_TAGS_PER_LOG_MESSAGE tags; |
| string msg; |
| }; |
| |
| // Interface for LogListener to register to listen to logs. |
| [Discoverable] |
| interface Log { |
| // Listens to new log entries by calling Log() on |log_listener|. |
| // A null |options| indicates no filtering is requested. |
| 1: Listen(LogListener log_listener, LogFilterOptions? options); |
| |
| // Dumps all cached logs by calling LogMany() followed by Done() on |
| // |log_listener|. |
| // A null |options| indicates no filtering is requested. |
| 2: DumpLogs(LogListener log_listener, LogFilterOptions? options); |
| }; |
| |
| // Interface to get and listen to socket from syslogger |
| [Discoverable] |
| interface LogSink { |
| // Client connects to send logs over socket |
| 1: Connect(handle<socket> socket); |
| }; |
| |
| const uint64 MAX_LOG_MANY_SIZE_BYTES = 16384; |
| |
| interface LogListener { |
| // Called for single messages. |
| 1: Log(LogMessage log); |
| |
| // Called when |Log| service is serving cached logs. |
| // Max logs size per call is |MAX_LOG_MANY_SIZE_BYTES| bytes. |
| 2: LogMany(vector<LogMessage> log); |
| |
| // Called in the case |DumpLogs()| function of |Log| service was called and |
| // all cached logs have been dispatched to this listener. |
| 3: Done(); |
| }; |