mirror of
https://github.com/obsproject/obs-studio.git
synced 2024-07-15 07:44:10 +00:00
Add logging to all operating systems
Also have it remove log files past 10 (default, changable with ini setting as per usual). 10 might be too few.
This commit is contained in:
parent
4f9e4a27d5
commit
66823d2cf3
156
obs/obs-app.cpp
156
obs/obs-app.cpp
|
@ -15,6 +15,8 @@
|
|||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
******************************************************************************/
|
||||
|
||||
#include <time.h>
|
||||
#include <stdio.h>
|
||||
#include <sstream>
|
||||
#include <util/bmem.h>
|
||||
#include <util/dstr.h>
|
||||
|
@ -28,36 +30,49 @@
|
|||
#include "window-basic-main.hpp"
|
||||
#include "platform.hpp"
|
||||
|
||||
#ifdef _WIN32
|
||||
#include <fstream>
|
||||
|
||||
#ifdef _WIN32
|
||||
#include <windows.h>
|
||||
#define snprintf _snprintf
|
||||
#else
|
||||
#include <signal.h>
|
||||
#endif
|
||||
|
||||
using namespace std;
|
||||
|
||||
#ifdef _WIN32
|
||||
static log_handler_t def_log_handler;
|
||||
|
||||
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);
|
||||
char str[4096];
|
||||
va_list args2;
|
||||
|
||||
OutputDebugStringA(bla);
|
||||
va_copy(args2, args);
|
||||
|
||||
vsnprintf(str, 4095, msg, args);
|
||||
|
||||
#ifdef _WIN32
|
||||
OutputDebugStringA(str);
|
||||
OutputDebugStringA("\n");
|
||||
#else
|
||||
def_log_handler(log_level, msg, args2, nullptr);
|
||||
#endif
|
||||
|
||||
if (log_level <= LOG_INFO)
|
||||
logFile << bla << endl;
|
||||
logFile << str << endl;
|
||||
|
||||
#ifdef _WIN32
|
||||
if (log_level <= LOG_ERROR && IsDebuggerPresent())
|
||||
__debugbreak();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
bool OBSApp::InitGlobalConfigDefaults()
|
||||
{
|
||||
config_set_default_string(globalConfig, "General", "Language", "en");
|
||||
config_set_default_uint(globalConfig, "General", "MaxLogs", 10);
|
||||
|
||||
#if _WIN32
|
||||
config_set_default_string(globalConfig, "Video", "Renderer",
|
||||
|
@ -81,18 +96,22 @@ static bool do_mkdir(const char *path)
|
|||
|
||||
static bool MakeUserDirs()
|
||||
{
|
||||
BPtr<char> configPath;
|
||||
BPtr<char> path;
|
||||
|
||||
configPath = os_get_config_path("obs-studio");
|
||||
if (!do_mkdir(configPath))
|
||||
path = os_get_config_path("obs-studio");
|
||||
if (!do_mkdir(path))
|
||||
return false;
|
||||
|
||||
configPath = os_get_config_path("obs-studio/basic");
|
||||
if (!do_mkdir(configPath))
|
||||
path = os_get_config_path("obs-studio/basic");
|
||||
if (!do_mkdir(path))
|
||||
return false;
|
||||
|
||||
configPath = os_get_config_path("obs-studio/studio");
|
||||
if (!do_mkdir(configPath))
|
||||
path = os_get_config_path("obs-studio/studio");
|
||||
if (!do_mkdir(path))
|
||||
return false;
|
||||
|
||||
path = os_get_config_path("obs-studio/logs");
|
||||
if (!do_mkdir(path))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
|
@ -229,38 +248,113 @@ struct NoFocusFrameStyle : QProxyStyle
|
|||
}
|
||||
};
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
static void delete_oldest_log(void)
|
||||
{
|
||||
#ifndef WIN32
|
||||
signal(SIGPIPE, SIG_IGN);
|
||||
#endif
|
||||
BPtr<char> logDir(os_get_config_path("obs-studio/logs"));
|
||||
char firstLog[256] = {};
|
||||
struct os_dirent *entry;
|
||||
|
||||
unsigned int maxLogs = (unsigned int)config_get_uint(
|
||||
App()->GlobalConfig(), "General", "MaxLogs");
|
||||
|
||||
os_dir_t dir = os_opendir(logDir);
|
||||
if (dir) {
|
||||
unsigned int count = 0;
|
||||
|
||||
while ((entry = os_readdir(dir)) != NULL) {
|
||||
if (entry->directory)
|
||||
continue;
|
||||
|
||||
/* no hidden files */
|
||||
if (*entry->d_name == '.')
|
||||
continue;
|
||||
|
||||
if (!*firstLog)
|
||||
strncpy(firstLog, entry->d_name, 255);
|
||||
|
||||
count++;
|
||||
}
|
||||
|
||||
os_closedir(dir);
|
||||
|
||||
if (count > maxLogs && *firstLog) {
|
||||
stringstream delPath;
|
||||
|
||||
delPath << logDir << "/" << firstLog;
|
||||
os_unlink(delPath.str().c_str());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void create_log_file(fstream &logFile)
|
||||
{
|
||||
stringstream dst;
|
||||
time_t now = time(0);
|
||||
struct tm *cur_time;
|
||||
|
||||
cur_time = localtime(&now);
|
||||
if (cur_time) {
|
||||
char file[256] = {};
|
||||
|
||||
snprintf(file, sizeof(file), "%d-%02d-%02d %02d-%02d-%02d.txt",
|
||||
cur_time->tm_year+1900,
|
||||
cur_time->tm_mon+1,
|
||||
cur_time->tm_mday,
|
||||
cur_time->tm_hour,
|
||||
cur_time->tm_min,
|
||||
cur_time->tm_sec);
|
||||
|
||||
dst << "obs-studio/logs/" << file;
|
||||
|
||||
BPtr<char> path(os_get_config_path(dst.str().c_str()));
|
||||
logFile.open(path,
|
||||
ios_base::in | ios_base::out | ios_base::trunc);
|
||||
}
|
||||
|
||||
if (logFile.is_open()) {
|
||||
delete_oldest_log();
|
||||
base_set_log_handler(do_log, &logFile);
|
||||
} else {
|
||||
blog(LOG_ERROR, "Failed to open log file");
|
||||
}
|
||||
}
|
||||
|
||||
static int run_program(fstream &logFile, int argc, char *argv[])
|
||||
{
|
||||
int ret = -1;
|
||||
QCoreApplication::addLibraryPath(".");
|
||||
#ifdef _WIN32
|
||||
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 {
|
||||
OBSApp program(argc, argv);
|
||||
OBSTranslator test;
|
||||
program.installTranslator(&test);
|
||||
OBSTranslator translator;
|
||||
|
||||
create_log_file(logFile);
|
||||
|
||||
program.installTranslator(&translator);
|
||||
program.setStyle(new NoFocusFrameStyle);
|
||||
program.OBSInit();
|
||||
|
||||
ret = program.exec();
|
||||
|
||||
} catch (const char *error) {
|
||||
blog(LOG_ERROR, "%s", error);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
#ifndef WIN32
|
||||
signal(SIGPIPE, SIG_IGN);
|
||||
#endif
|
||||
|
||||
base_get_log_handler(&def_log_handler, nullptr);
|
||||
|
||||
fstream logFile;
|
||||
|
||||
int ret = run_program(logFile, argc, argv);
|
||||
|
||||
blog(LOG_INFO, "Number of memory leaks: %ld", bnum_allocs());
|
||||
base_set_log_handler(nullptr, nullptr);
|
||||
return ret;
|
||||
|
|
Loading…
Reference in a new issue