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