1 //===-- OsLogger.cpp --------------------------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #include "OsLogger.h" 11 12 #if LLDB_USE_OS_LOG 13 14 #include <os/log.h> 15 16 #include "DNBDefs.h" 17 #include "DNBLog.h" 18 19 #define LLDB_OS_LOG_MAX_BUFFER_LENGTH 256 20 21 namespace 22 { 23 //---------------------------------------------------------------------- 24 // Darwin os_log logging callback that can be registered with 25 // DNBLogSetLogCallback 26 //---------------------------------------------------------------------- 27 void 28 DarwinLogCallback(void *baton, uint32_t flags, const char *format, 29 va_list args) 30 { 31 if (format == nullptr) 32 return; 33 34 static os_log_t g_logger; 35 if (!g_logger) 36 { 37 g_logger = os_log_create("com.apple.dt.lldb", "debugserver"); 38 if (!g_logger) 39 return; 40 } 41 42 os_log_type_t log_type; 43 if (flags & DNBLOG_FLAG_FATAL) log_type = OS_LOG_TYPE_FAULT; 44 else if (flags & DNBLOG_FLAG_ERROR) log_type = OS_LOG_TYPE_ERROR; 45 else if (flags & DNBLOG_FLAG_WARNING) log_type = OS_LOG_TYPE_DEFAULT; 46 else if (flags & DNBLOG_FLAG_VERBOSE) log_type = OS_LOG_TYPE_DEBUG; 47 else log_type = OS_LOG_TYPE_DEFAULT; 48 49 // This code is unfortunate. os_log* only takes static strings, but 50 // our current log API isn't set up to make use of that style. 51 char buffer[LLDB_OS_LOG_MAX_BUFFER_LENGTH]; 52 vsnprintf(buffer, sizeof(buffer), format, args); 53 os_log_with_type(g_logger, log_type, "%{public}s", buffer); 54 } 55 } 56 57 DNBCallbackLog 58 OsLogger::GetLogFunction() 59 { 60 return _os_log_impl ? DarwinLogCallback : nullptr; 61 } 62 63 #else 64 65 DNBCallbackLog 66 OsLogger::GetLogFunction() 67 { 68 return nullptr; 69 } 70 71 #endif 72