浏览代码

Implement some basic logging for windows

jp9000 11 年之前
父节点
当前提交
fa490fa8c4
共有 5 个文件被更改,包括 53 次插入24 次删除
  1. 1 1
      libobs/obs-windows.c
  2. 25 10
      libobs/util/base.c
  3. 5 2
      libobs/util/base.h
  4. 18 9
      obs/obs-app.cpp
  5. 4 2
      test/win/test.cpp

+ 1 - 1
libobs/obs-windows.c

@@ -26,7 +26,7 @@ static inline bool check_path(const char* data, const char *path,
 	dstr_copy(output, path);
 	dstr_cat(output, data);
 
-	blog(LOG_INFO, "Attempting path: %s\n", output->array);
+	blog(LOG_DEBUG, "Attempting path: %s\n", output->array);
 
 	return os_file_exists(output->array);
 }

+ 25 - 10
libobs/util/base.c

@@ -27,10 +27,12 @@ static int log_output_level = LOG_DEBUG;
 static int log_output_level = LOG_INFO;
 #endif
 
-static int crashing = 0;
+static int  crashing     = 0;
+static void *log_param   = NULL;
+static void *crash_param = NULL;
 
 static void def_log_handler(int log_level, const char *format,
-		va_list args)
+		va_list args, void *param)
 {
 	char out[4096];
 	vsnprintf(out, sizeof(out), format, args);
@@ -57,6 +59,8 @@ static void def_log_handler(int log_level, const char *format,
 			fflush(stderr);
 		}
 	}
+
+	UNUSED_PARAMETER(param);
 }
 
 #ifdef _MSC_VER
@@ -65,24 +69,35 @@ static void def_log_handler(int log_level, const char *format,
 #define NORETURN __attribute__((noreturn))
 #endif
 
-NORETURN static void def_crash_handler(const char *format, va_list args)
+NORETURN static void def_crash_handler(const char *format, va_list args,
+		void *param)
 {
 	vfprintf(stderr, format, args);
 	exit(0);
+
+	UNUSED_PARAMETER(param);
 }
 
-static void (*log_handler)(int log_level, const char *, va_list) =
+static void (*log_handler)(int log_level, const char *, va_list, void *) =
 		def_log_handler;
-static void (*crash_handler)(const char *, va_list) = def_crash_handler;
+static void (*crash_handler)(const char *, va_list, void *) = def_crash_handler;
 
 void base_set_log_handler(
-	void (*handler)(int log_level, const char *, va_list))
+	void (*handler)(int log_level, const char *, va_list, void *),
+	void *param)
 {
+	if (!handler)
+		handler = def_log_handler;
+
+	log_param   = param;
 	log_handler = handler;
 }
 
-void base_set_crash_handler(void (*handler)(const char *, va_list))
+void base_set_crash_handler(
+		void (*handler)(const char *, va_list, void *),
+		void *param)
 {
+	crash_param   = param;
 	crash_handler = handler;
 }
 
@@ -97,13 +112,13 @@ void bcrash(const char *format, ...)
 
 	crashing = 1;
 	va_start(args, format);
-	crash_handler(format, args);
+	crash_handler(format, args, crash_param);
 	va_end(args);
 }
 
 void blogva(int log_level, const char *format, va_list args)
 {
-	log_handler(log_level, format, args);
+	log_handler(log_level, format, args, log_param);
 }
 
 void blog(int log_level, const char *format, ...)
@@ -111,6 +126,6 @@ void blog(int log_level, const char *format, ...)
 	va_list args;
 
 	va_start(args, format);
-	log_handler(log_level, format, args);
+	blogva(log_level, format, args);
 	va_end(args);
 }

+ 5 - 2
libobs/util/base.h

@@ -59,8 +59,11 @@ enum {
 };
 
 EXPORT void base_set_log_handler(
-		void (*handler)(int log_level, const char *, va_list));
-EXPORT void base_set_crash_handler(void (*handler)(const char *, va_list));
+		void (*handler)(int log_level, const char *, va_list, void *),
+		void *param);
+EXPORT void base_set_crash_handler(
+		void (*handler)(const char *, va_list, void *),
+		void *param);
 
 EXPORT void blogva(int log_level, const char *format, va_list args);
 

+ 18 - 9
obs/obs-app.cpp

@@ -29,29 +29,29 @@
 #include "platform.hpp"
 
 #ifdef _WIN32
+#include <fstream>
 #include <windows.h>
 #endif
 
 using namespace std;
 
-static void do_log(int log_level, const char *msg, va_list args)
-{
 #ifdef _WIN32
+static void do_log(int log_level, const char *msg, va_list args, void *param)
+{
+	fstream &logFile = *static_cast<fstream*>(param);
 	char bla[4096];
 	vsnprintf(bla, 4095, msg, args);
 
 	OutputDebugStringA(bla);
 	OutputDebugStringA("\n");
 
+	if (log_level <= LOG_INFO)
+		logFile << bla << endl;
+
 	if (log_level <= LOG_ERROR && IsDebuggerPresent())
 		__debugbreak();
-#else
-	vprintf(msg, args);
-	printf("\n");
-
-	UNUSED_PARAMETER(log_level);
-#endif
 }
+#endif
 
 bool OBSApp::InitGlobalConfigDefaults()
 {
@@ -220,7 +220,15 @@ int main(int argc, char *argv[])
 	int ret = -1;
 	QCoreApplication::addLibraryPath(".");
 #ifdef _WIN32
-	base_set_log_handler(do_log);
+	char *logPath = os_get_config_path("obs-studio/log.txt");
+	fstream logFile;
+
+	logFile.open(logPath, ios_base::in | ios_base::out | ios_base::trunc,
+			_SH_DENYNO);
+	bfree(logPath);
+
+	if (logFile.is_open())
+		base_set_log_handler(do_log, &logFile);
 #endif
 
 	try {
@@ -234,5 +242,6 @@ int main(int argc, char *argv[])
 	}
 
 	blog(LOG_INFO, "Number of memory leaks: %ld", bnum_allocs());
+	base_set_log_handler(nullptr, nullptr);
 	return ret;
 }

+ 4 - 2
test/win/test.cpp

@@ -51,7 +51,7 @@ static LRESULT CALLBACK sceneProc(HWND hwnd, UINT message, WPARAM wParam,
 	return 0;
 }
 
-static void do_log(int log_level, const char *msg, va_list args)
+static void do_log(int log_level, const char *msg, va_list args, void *param)
 {
 	char bla[4096];
 	vsnprintf(bla, 4095, msg, args);
@@ -61,6 +61,8 @@ static void do_log(int log_level, const char *msg, va_list args)
 
 	if (log_level <= LOG_WARNING)
 		__debugbreak();
+
+	UNUSED_PARAMETER(param);
 }
 
 static void CreateOBS(HWND hwnd)
@@ -122,7 +124,7 @@ int WINAPI WinMain(HINSTANCE instance, HINSTANCE prevInstance, LPSTR cmdLine,
 		int numCmd)
 {
 	HWND hwnd = NULL;
-	base_set_log_handler(do_log);
+	base_set_log_handler(do_log, nullptr);
 
 	try {
 		hwnd = CreateTestWindow(instance);