1//
2// Created by Han Yin on 10/31/25.
3//
4
5#ifndef AICHAT_LOGGING_H
6#define AICHAT_LOGGING_H
7
8#endif //AICHAT_LOGGING_H
9
10#pragma once
11#include <android/log.h>
12
13#ifndef LOG_TAG
14#define LOG_TAG "ai-chat"
15#endif
16
17#ifndef LOG_MIN_LEVEL
18#if defined(NDEBUG)
19#define LOG_MIN_LEVEL ANDROID_LOG_INFO
20#else
21#define LOG_MIN_LEVEL ANDROID_LOG_VERBOSE
22#endif
23#endif
24
25static inline int ai_should_log(int prio) {
26 return __android_log_is_loggable(prio, LOG_TAG, LOG_MIN_LEVEL);
27}
28
29#if LOG_MIN_LEVEL <= ANDROID_LOG_VERBOSE
30#define LOGv(...) do { if (ai_should_log(ANDROID_LOG_VERBOSE)) __android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG, __VA_ARGS__); } while (0)
31#else
32#define LOGv(...) ((void)0)
33#endif
34
35#if LOG_MIN_LEVEL <= ANDROID_LOG_DEBUG
36#define LOGd(...) do { if (ai_should_log(ANDROID_LOG_DEBUG)) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__); } while (0)
37#else
38#define LOGd(...) ((void)0)
39#endif
40
41#define LOGi(...) do { if (ai_should_log(ANDROID_LOG_INFO )) __android_log_print(ANDROID_LOG_INFO , LOG_TAG, __VA_ARGS__); } while (0)
42#define LOGw(...) do { if (ai_should_log(ANDROID_LOG_WARN )) __android_log_print(ANDROID_LOG_WARN , LOG_TAG, __VA_ARGS__); } while (0)
43#define LOGe(...) do { if (ai_should_log(ANDROID_LOG_ERROR)) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__); } while (0)
44
45static inline int android_log_prio_from_ggml(enum ggml_log_level level) {
46 switch (level) {
47 case GGML_LOG_LEVEL_ERROR: return ANDROID_LOG_ERROR;
48 case GGML_LOG_LEVEL_WARN: return ANDROID_LOG_WARN;
49 case GGML_LOG_LEVEL_INFO: return ANDROID_LOG_INFO;
50 case GGML_LOG_LEVEL_DEBUG: return ANDROID_LOG_DEBUG;
51 default: return ANDROID_LOG_DEFAULT;
52 }
53}
54
55static inline void aichat_android_log_callback(enum ggml_log_level level,
56 const char* text,
57 void* /*user*/) {
58 const int prio = android_log_prio_from_ggml(level);
59 if (!ai_should_log(prio)) return;
60 __android_log_write(prio, LOG_TAG, text);
61}