diff --git a/indra/llwindow/llwindowsdl.cpp b/indra/llwindow/llwindowsdl.cpp
index 4050e9c174a5c89744e671843166bcbed314c700..b38d9813b2187b423c5c6fa7225937b16518acc8 100644
--- a/indra/llwindow/llwindowsdl.cpp
+++ b/indra/llwindow/llwindowsdl.cpp
@@ -162,6 +162,72 @@ Display* LLWindowSDL::get_SDL_Display(void)
 }
 #endif // LL_X11
 
+void sdlLogOutputFunc(void *userdata, int category, SDL_LogPriority priority, const char *message)
+{
+    LLError::ELevel level = LLError::LEVEL_INFO;
+    std::string level_str;
+    switch (priority)
+    {
+    case SDL_LOG_PRIORITY_VERBOSE:
+        level = LLError::LEVEL_DEBUG;
+        level_str = "verbose";
+        break;
+    case SDL_LOG_PRIORITY_DEBUG:
+        level = LLError::LEVEL_DEBUG;
+        level_str = "debug";
+        break;
+    case SDL_LOG_PRIORITY_INFO:
+        level = LLError::LEVEL_INFO;
+        level_str = "info";
+        break;
+    case SDL_LOG_PRIORITY_WARN:
+        level = LLError::LEVEL_WARN;
+        level_str = "warn";
+        break;
+    case SDL_LOG_PRIORITY_ERROR:
+        level = LLError::LEVEL_WARN;
+        level_str = "error";
+        break;
+    case SDL_LOG_PRIORITY_CRITICAL:
+        level = LLError::LEVEL_WARN;
+        level_str = "critical";
+        break;
+    }
+
+    std::string category_str;
+    switch (priority)
+    {
+    case SDL_LOG_CATEGORY_APPLICATION:
+        category_str = "application";
+        break;
+    case SDL_LOG_CATEGORY_ERROR:
+        category_str = "error";
+        break;
+    case SDL_LOG_CATEGORY_ASSERT:
+        category_str = "assert";
+        break;
+    case SDL_LOG_CATEGORY_SYSTEM:
+        category_str = "system";
+        break;
+    case SDL_LOG_CATEGORY_AUDIO:
+        category_str = "audio";
+        break;
+    case SDL_LOG_CATEGORY_VIDEO:
+        category_str = "video";
+        break;
+    case SDL_LOG_CATEGORY_RENDER:
+        category_str = "render";
+        break;
+    case SDL_LOG_CATEGORY_INPUT:
+        category_str = "input";
+        break;
+    case SDL_LOG_CATEGORY_TEST:
+        category_str = "test";
+        break;
+    }
+
+    LL_VLOGS(level, "LLWindowSDL") << "SDL " << level_str << " " << category_str << " :" << message << LL_ENDL;
+}
 
 LLWindowSDL::LLWindowSDL(LLWindowCallbacks* callbacks,
 			 const std::string& title, S32 x, S32 y, S32 width,
@@ -174,6 +240,8 @@ LLWindowSDL::LLWindowSDL(LLWindowCallbacks* callbacks,
 {
 	SDL_SetMainReady();
 
+	SDL_LogSetOutputFunction(&sdlLogOutputFunc, nullptr);
+
 	if (SDL_InitSubSystem(SDL_INIT_EVENTS|SDL_INIT_VIDEO|SDL_INIT_GAMECONTROLLER|SDL_INIT_JOYSTICK) != 0)
 	{
 		LL_WARNS() << "Failed to initialize SDL due to error: " << SDL_GetError() << LL_ENDL;