xref: /aosp_15_r20/external/executorch/extension/android/jni/log.cpp (revision 523fa7a60841cd1ecfb9cc4201f1ca8b03ed023a)
1*523fa7a6SAndroid Build Coastguard Worker /*
2*523fa7a6SAndroid Build Coastguard Worker  * Copyright (c) Meta Platforms, Inc. and affiliates.
3*523fa7a6SAndroid Build Coastguard Worker  * All rights reserved.
4*523fa7a6SAndroid Build Coastguard Worker  *
5*523fa7a6SAndroid Build Coastguard Worker  * This source code is licensed under the BSD-style license found in the
6*523fa7a6SAndroid Build Coastguard Worker  * LICENSE file in the root directory of this source tree.
7*523fa7a6SAndroid Build Coastguard Worker  */
8*523fa7a6SAndroid Build Coastguard Worker 
9*523fa7a6SAndroid Build Coastguard Worker #include "log.h"
10*523fa7a6SAndroid Build Coastguard Worker 
11*523fa7a6SAndroid Build Coastguard Worker #ifdef __ANDROID__
12*523fa7a6SAndroid Build Coastguard Worker 
13*523fa7a6SAndroid Build Coastguard Worker #include <android/log.h>
14*523fa7a6SAndroid Build Coastguard Worker #include <functional>
15*523fa7a6SAndroid Build Coastguard Worker #include <mutex>
16*523fa7a6SAndroid Build Coastguard Worker #include <sstream>
17*523fa7a6SAndroid Build Coastguard Worker 
18*523fa7a6SAndroid Build Coastguard Worker using executorch::extension::log_entry;
19*523fa7a6SAndroid Build Coastguard Worker 
20*523fa7a6SAndroid Build Coastguard Worker // Number of entries to store in the in-memory log buffer.
21*523fa7a6SAndroid Build Coastguard Worker const size_t log_buffer_length = 16;
22*523fa7a6SAndroid Build Coastguard Worker 
23*523fa7a6SAndroid Build Coastguard Worker namespace {
24*523fa7a6SAndroid Build Coastguard Worker std::vector<log_entry> log_buffer_;
25*523fa7a6SAndroid Build Coastguard Worker std::mutex log_buffer_mutex_;
26*523fa7a6SAndroid Build Coastguard Worker } // namespace
27*523fa7a6SAndroid Build Coastguard Worker 
28*523fa7a6SAndroid Build Coastguard Worker // For Android, write to logcat
et_pal_emit_log_message(et_timestamp_t timestamp,et_pal_log_level_t level,const char * filename,const char * function,size_t line,const char * message,size_t length)29*523fa7a6SAndroid Build Coastguard Worker void et_pal_emit_log_message(
30*523fa7a6SAndroid Build Coastguard Worker     et_timestamp_t timestamp,
31*523fa7a6SAndroid Build Coastguard Worker     et_pal_log_level_t level,
32*523fa7a6SAndroid Build Coastguard Worker     const char* filename,
33*523fa7a6SAndroid Build Coastguard Worker     const char* function,
34*523fa7a6SAndroid Build Coastguard Worker     size_t line,
35*523fa7a6SAndroid Build Coastguard Worker     const char* message,
36*523fa7a6SAndroid Build Coastguard Worker     size_t length) {
37*523fa7a6SAndroid Build Coastguard Worker   std::lock_guard<std::mutex> guard(log_buffer_mutex_);
38*523fa7a6SAndroid Build Coastguard Worker 
39*523fa7a6SAndroid Build Coastguard Worker   while (log_buffer_.size() >= log_buffer_length) {
40*523fa7a6SAndroid Build Coastguard Worker     log_buffer_.erase(log_buffer_.begin());
41*523fa7a6SAndroid Build Coastguard Worker   }
42*523fa7a6SAndroid Build Coastguard Worker 
43*523fa7a6SAndroid Build Coastguard Worker   log_buffer_.emplace_back(
44*523fa7a6SAndroid Build Coastguard Worker       timestamp, level, filename, function, line, message, length);
45*523fa7a6SAndroid Build Coastguard Worker 
46*523fa7a6SAndroid Build Coastguard Worker   int android_log_level = ANDROID_LOG_UNKNOWN;
47*523fa7a6SAndroid Build Coastguard Worker   if (level == 'D') {
48*523fa7a6SAndroid Build Coastguard Worker     android_log_level = ANDROID_LOG_DEBUG;
49*523fa7a6SAndroid Build Coastguard Worker   } else if (level == 'I') {
50*523fa7a6SAndroid Build Coastguard Worker     android_log_level = ANDROID_LOG_INFO;
51*523fa7a6SAndroid Build Coastguard Worker   } else if (level == 'E') {
52*523fa7a6SAndroid Build Coastguard Worker     android_log_level = ANDROID_LOG_ERROR;
53*523fa7a6SAndroid Build Coastguard Worker   } else if (level == 'F') {
54*523fa7a6SAndroid Build Coastguard Worker     android_log_level = ANDROID_LOG_FATAL;
55*523fa7a6SAndroid Build Coastguard Worker   }
56*523fa7a6SAndroid Build Coastguard Worker 
57*523fa7a6SAndroid Build Coastguard Worker   __android_log_print(android_log_level, "ExecuTorch", "%s", message);
58*523fa7a6SAndroid Build Coastguard Worker }
59*523fa7a6SAndroid Build Coastguard Worker 
60*523fa7a6SAndroid Build Coastguard Worker namespace executorch::extension {
61*523fa7a6SAndroid Build Coastguard Worker 
access_log_buffer(std::function<void (std::vector<log_entry> &)> accessor)62*523fa7a6SAndroid Build Coastguard Worker void access_log_buffer(std::function<void(std::vector<log_entry>&)> accessor) {
63*523fa7a6SAndroid Build Coastguard Worker   std::lock_guard<std::mutex> guard(log_buffer_mutex_);
64*523fa7a6SAndroid Build Coastguard Worker   accessor(log_buffer_);
65*523fa7a6SAndroid Build Coastguard Worker }
66*523fa7a6SAndroid Build Coastguard Worker 
67*523fa7a6SAndroid Build Coastguard Worker } // namespace executorch::extension
68*523fa7a6SAndroid Build Coastguard Worker 
69*523fa7a6SAndroid Build Coastguard Worker #endif
70