Merge pull request #3078 from akallabeth/wlog_cmd_options
Added new command line options for logger.
This commit is contained in:
commit
7294a7f27d
@ -26,6 +26,7 @@
|
|||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
#include <winpr/crt.h>
|
#include <winpr/crt.h>
|
||||||
|
#include <winpr/wlog.h>
|
||||||
#include <winpr/cmdline.h>
|
#include <winpr/cmdline.h>
|
||||||
|
|
||||||
#include <freerdp/addin.h>
|
#include <freerdp/addin.h>
|
||||||
@ -173,6 +174,8 @@ static COMMAND_LINE_ARGUMENT_A args[] =
|
|||||||
{ "encryption-methods", COMMAND_LINE_VALUE_REQUIRED, "<40,56,128,FIPS>", NULL, NULL, -1, NULL, "RDP standard security encryption methods" },
|
{ "encryption-methods", COMMAND_LINE_VALUE_REQUIRED, "<40,56,128,FIPS>", NULL, NULL, -1, NULL, "RDP standard security encryption methods" },
|
||||||
{ "from-stdin", COMMAND_LINE_VALUE_FLAG, NULL, NULL, NULL, -1, NULL, "Read credentials from stdin, do not use defaults." },
|
{ "from-stdin", COMMAND_LINE_VALUE_FLAG, NULL, NULL, NULL, -1, NULL, "Read credentials from stdin, do not use defaults." },
|
||||||
{ "buildconfig", COMMAND_LINE_VALUE_FLAG | COMMAND_LINE_PRINT_BUILDCONFIG, NULL, NULL, NULL, -1, NULL, "print the build configuration" },
|
{ "buildconfig", COMMAND_LINE_VALUE_FLAG | COMMAND_LINE_PRINT_BUILDCONFIG, NULL, NULL, NULL, -1, NULL, "print the build configuration" },
|
||||||
|
{ "log-level", COMMAND_LINE_VALUE_REQUIRED, "[OFF|FATAL|ERROR|WARN|INFO|DEBUG|TRACE]", NULL, NULL, -1, NULL, "Set the default log level" },
|
||||||
|
{ "log-filters", COMMAND_LINE_VALUE_REQUIRED, "<logger tag>:<log level>[, <logger tag>:<log level>][, ...]]", NULL, NULL, -1, NULL, "Set logger filters" },
|
||||||
{ NULL, 0, NULL, NULL, NULL, -1, NULL, NULL }
|
{ NULL, 0, NULL, NULL, NULL, -1, NULL, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -2106,6 +2109,17 @@ int freerdp_client_settings_parse_command_line_arguments(rdpSettings* settings,
|
|||||||
{
|
{
|
||||||
settings->CredentialsFromStdin = TRUE;
|
settings->CredentialsFromStdin = TRUE;
|
||||||
}
|
}
|
||||||
|
CommandLineSwitchCase(arg, "log-level")
|
||||||
|
{
|
||||||
|
wLog* root = WLog_GetRoot();
|
||||||
|
if (!WLog_SetStringLogLevel(root, arg->Value))
|
||||||
|
return COMMAND_LINE_ERROR;
|
||||||
|
}
|
||||||
|
CommandLineSwitchCase(arg, "log-filters")
|
||||||
|
{
|
||||||
|
if (!WLog_AddStringLogFilters(arg->Value))
|
||||||
|
return COMMAND_LINE_ERROR;
|
||||||
|
}
|
||||||
CommandLineSwitchCase(arg, "sec-rdp")
|
CommandLineSwitchCase(arg, "sec-rdp")
|
||||||
{
|
{
|
||||||
settings->RdpSecurity = arg->Value ? TRUE : FALSE;
|
settings->RdpSecurity = arg->Value ? TRUE : FALSE;
|
||||||
|
@ -190,6 +190,9 @@ WINPR_API BOOL WLog_PrintMessageVA(wLog* log, wLogMessage* message, va_list args
|
|||||||
|
|
||||||
WINPR_API DWORD WLog_GetLogLevel(wLog* log);
|
WINPR_API DWORD WLog_GetLogLevel(wLog* log);
|
||||||
WINPR_API BOOL WLog_SetLogLevel(wLog* log, DWORD logLevel);
|
WINPR_API BOOL WLog_SetLogLevel(wLog* log, DWORD logLevel);
|
||||||
|
WINPR_API BOOL WLog_SetStringLogLevel(wLog* log, LPCSTR level);
|
||||||
|
WINPR_API BOOL WLog_AddStringLogFilters(LPCSTR filter);
|
||||||
|
|
||||||
|
|
||||||
WINPR_API BOOL WLog_SetLogAppenderType(wLog* log, DWORD logAppenderType);
|
WINPR_API BOOL WLog_SetLogAppenderType(wLog* log, DWORD logAppenderType);
|
||||||
WINPR_API wLogAppender* WLog_GetLogAppender(wLog* log);
|
WINPR_API wLogAppender* WLog_GetLogAppender(wLog* log);
|
||||||
|
@ -55,7 +55,7 @@ typedef struct _wLogFilter wLogFilter;
|
|||||||
* http://docs.python.org/2/library/logging.html
|
* http://docs.python.org/2/library/logging.html
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const char* WLOG_LEVELS[7] =
|
LPCSTR WLOG_LEVELS[7] =
|
||||||
{
|
{
|
||||||
"TRACE",
|
"TRACE",
|
||||||
"DEBUG",
|
"DEBUG",
|
||||||
@ -69,13 +69,16 @@ const char* WLOG_LEVELS[7] =
|
|||||||
static DWORD g_FilterCount = 0;
|
static DWORD g_FilterCount = 0;
|
||||||
static wLogFilter* g_Filters = NULL;
|
static wLogFilter* g_Filters = NULL;
|
||||||
|
|
||||||
static BOOL log_recursion(const char* file, const char* fkt, int line)
|
static int WLog_ParseLogLevel(LPCSTR level);
|
||||||
|
static BOOL WLog_ParseFilter(wLogFilter* filter, LPCSTR name);
|
||||||
|
|
||||||
|
static BOOL log_recursion(LPCSTR file, LPCSTR fkt, int line)
|
||||||
{
|
{
|
||||||
char** msg;
|
char** msg;
|
||||||
size_t used, i;
|
size_t used, i;
|
||||||
void* bt = winpr_backtrace(20);
|
void* bt = winpr_backtrace(20);
|
||||||
#if defined(ANDROID)
|
#if defined(ANDROID)
|
||||||
const char* tag = WINPR_TAG("utils.wlog");
|
LPCSTR tag = WINPR_TAG("utils.wlog");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!bt)
|
if (!bt)
|
||||||
@ -302,6 +305,90 @@ DWORD WLog_GetLogLevel(wLog* log)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOL WLog_SetStringLogLevel(wLog* log, LPCSTR level)
|
||||||
|
{
|
||||||
|
int lvl;
|
||||||
|
if (!log || !level)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
lvl = WLog_ParseLogLevel(level);
|
||||||
|
if (lvl < 0)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
return WLog_SetLogLevel(log, lvl);
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL WLog_AddStringLogFilters(LPCSTR filter)
|
||||||
|
{
|
||||||
|
DWORD pos;
|
||||||
|
DWORD size;
|
||||||
|
DWORD count;
|
||||||
|
DWORD status;
|
||||||
|
LPSTR p;
|
||||||
|
LPSTR filterStr;
|
||||||
|
LPSTR cp;
|
||||||
|
wLogFilter* tmp;
|
||||||
|
|
||||||
|
if (!filter)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
count = 1;
|
||||||
|
p = (LPSTR)filter;
|
||||||
|
|
||||||
|
while ((p = strchr(p, ',')) != NULL)
|
||||||
|
{
|
||||||
|
count++;
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
|
||||||
|
pos = g_FilterCount;
|
||||||
|
size = g_FilterCount + count;
|
||||||
|
tmp = (wLogFilter*) realloc(g_Filters, size * sizeof(wLogFilter));
|
||||||
|
|
||||||
|
if (!tmp)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
g_Filters = tmp;
|
||||||
|
|
||||||
|
cp = (LPSTR)_strdup(filter);
|
||||||
|
if (!cp)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
p = cp;
|
||||||
|
filterStr = cp;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
p = strchr(p, ',');
|
||||||
|
if (p)
|
||||||
|
*p = '\0';
|
||||||
|
|
||||||
|
if (pos < size)
|
||||||
|
{
|
||||||
|
status = WLog_ParseFilter(&g_Filters[pos++], filterStr);
|
||||||
|
if (status < 0)
|
||||||
|
{
|
||||||
|
free (cp);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (p)
|
||||||
|
{
|
||||||
|
filterStr = p + 1;
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (p != NULL);
|
||||||
|
|
||||||
|
g_FilterCount = size;
|
||||||
|
free (cp);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
BOOL WLog_SetLogLevel(wLog* log, DWORD logLevel)
|
BOOL WLog_SetLogLevel(wLog* log, DWORD logLevel)
|
||||||
{
|
{
|
||||||
if (!log)
|
if (!log)
|
||||||
@ -316,7 +403,7 @@ BOOL WLog_SetLogLevel(wLog* log, DWORD logLevel)
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
int WLog_ParseLogLevel(const char* level)
|
int WLog_ParseLogLevel(LPCSTR level)
|
||||||
{
|
{
|
||||||
int iLevel = -1;
|
int iLevel = -1;
|
||||||
|
|
||||||
@ -418,12 +505,12 @@ BOOL WLog_ParseFilter(wLogFilter* filter, LPCSTR name)
|
|||||||
|
|
||||||
BOOL WLog_ParseFilters()
|
BOOL WLog_ParseFilters()
|
||||||
{
|
{
|
||||||
char* p;
|
BOOL res;
|
||||||
char* env;
|
char* env;
|
||||||
DWORD count;
|
|
||||||
DWORD nSize;
|
DWORD nSize;
|
||||||
int status;
|
|
||||||
LPCSTR* strs;
|
g_Filters = NULL;
|
||||||
|
g_FilterCount = 0;
|
||||||
|
|
||||||
nSize = GetEnvironmentVariableA("WLOG_FILTER", NULL, 0);
|
nSize = GetEnvironmentVariableA("WLOG_FILTER", NULL, 0);
|
||||||
|
|
||||||
@ -438,62 +525,11 @@ BOOL WLog_ParseFilters()
|
|||||||
if (!GetEnvironmentVariableA("WLOG_FILTER", env, nSize))
|
if (!GetEnvironmentVariableA("WLOG_FILTER", env, nSize))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
count = 1;
|
res = WLog_AddStringLogFilters(env);
|
||||||
p = env;
|
|
||||||
|
|
||||||
while ((p = strchr(p, ',')) != NULL)
|
|
||||||
{
|
|
||||||
count++;
|
|
||||||
p++;
|
|
||||||
}
|
|
||||||
|
|
||||||
g_FilterCount = count;
|
|
||||||
p = env;
|
|
||||||
|
|
||||||
count = 0;
|
|
||||||
strs = (LPCSTR*) calloc(g_FilterCount, sizeof(LPCSTR));
|
|
||||||
|
|
||||||
if (!strs)
|
|
||||||
{
|
|
||||||
free(env);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
strs[count++] = p;
|
|
||||||
|
|
||||||
while ((p = strchr(p, ',')) != NULL)
|
|
||||||
{
|
|
||||||
if (count < g_FilterCount)
|
|
||||||
strs[count++] = p + 1;
|
|
||||||
*p = '\0';
|
|
||||||
p++;
|
|
||||||
}
|
|
||||||
|
|
||||||
g_Filters = calloc(g_FilterCount, sizeof(wLogFilter));
|
|
||||||
|
|
||||||
if (!g_Filters)
|
|
||||||
{
|
|
||||||
free(strs);
|
|
||||||
free(env);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (count = 0; count < g_FilterCount; count++)
|
|
||||||
{
|
|
||||||
status = WLog_ParseFilter(&g_Filters[count], strs[count]);
|
|
||||||
|
|
||||||
if (status < 0)
|
|
||||||
{
|
|
||||||
free(strs);
|
|
||||||
free(env);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
free(strs);
|
|
||||||
free(env);
|
free(env);
|
||||||
|
|
||||||
return TRUE;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
int WLog_GetFilterLogLevel(wLog* log)
|
int WLog_GetFilterLogLevel(wLog* log)
|
||||||
|
Loading…
Reference in New Issue
Block a user