You've already forked pgbackrest
mirror of
https://github.com/pgbackrest/pgbackrest.git
synced 2025-09-16 09:06:18 +02:00
Fix issue where specifying log-level-stderr > warn would cause a local/remote process to error on exit due to output found on stderr when none was expected.
The max value for a local/remote process is now error since there's no reason for these processes to emit warnings. Reported by Clinton Adams.
This commit is contained in:
@@ -145,6 +145,8 @@ sub buildConfig
|
||||
"\n" .
|
||||
" CONFIG_COMMAND_LOG_FILE(" . ($rhCommand->{&CFGDEF_LOG_FILE} ? 'true' : 'false') . ")\n" .
|
||||
" CONFIG_COMMAND_LOG_LEVEL_DEFAULT(logLevel" . ucfirst(lc($rhCommand->{&CFGDEF_LOG_LEVEL_DEFAULT})) . ")\n" .
|
||||
" CONFIG_COMMAND_LOG_LEVEL_STDERR_MAX(logLevel" .
|
||||
ucfirst(lc($rhCommand->{&CFGDEF_LOG_LEVEL_STDERR_MAX})) . ")\n" .
|
||||
" )\n";
|
||||
|
||||
$iCommandTotal++;
|
||||
|
@@ -448,6 +448,11 @@ use constant CFGDEF_LOG_FILE => 'log-file
|
||||
use constant CFGDEF_LOG_LEVEL_DEFAULT => 'log-level-default';
|
||||
push @EXPORT, qw(CFGDEF_LOG_LEVEL_DEFAULT);
|
||||
|
||||
# Defines the max log level that may be assigned for the output type. For instance, it's not OK for the local and remote processes
|
||||
# to log anything but errors to stderr because it will cause the process to error on exit.
|
||||
use constant CFGDEF_LOG_LEVEL_STDERR_MAX => 'log-level-stderr-max';
|
||||
push @EXPORT, qw(CFGDEF_LOG_LEVEL_STDERR_MAX);
|
||||
|
||||
# Option defines
|
||||
#-----------------------------------------------------------------------------------------------------------------------------------
|
||||
use constant CFGDEF_ALLOW_LIST => 'allow-list';
|
||||
@@ -554,11 +559,13 @@ my $rhCommandDefine =
|
||||
&CFGCMD_LOCAL =>
|
||||
{
|
||||
&CFGDEF_LOG_FILE => false,
|
||||
&CFGDEF_LOG_LEVEL_STDERR_MAX => ERROR,
|
||||
},
|
||||
|
||||
&CFGCMD_REMOTE =>
|
||||
{
|
||||
&CFGDEF_LOG_FILE => false,
|
||||
&CFGDEF_LOG_LEVEL_STDERR_MAX => ERROR,
|
||||
},
|
||||
|
||||
&CFGCMD_RESTORE =>
|
||||
@@ -2194,6 +2201,12 @@ foreach my $strCommand (sort(keys(%{$rhCommandDefine})))
|
||||
{
|
||||
$rhCommandDefine->{$strCommand}{&CFGDEF_LOG_LEVEL_DEFAULT} = INFO;
|
||||
}
|
||||
|
||||
# Default max stderr log level is TRACE
|
||||
if (!defined($rhCommandDefine->{$strCommand}{&CFGDEF_LOG_LEVEL_STDERR_MAX}))
|
||||
{
|
||||
$rhCommandDefine->{$strCommand}{&CFGDEF_LOG_LEVEL_STDERR_MAX} = TRACE;
|
||||
}
|
||||
}
|
||||
|
||||
####################################################################################################################################
|
||||
|
@@ -38,6 +38,14 @@
|
||||
|
||||
<p>Fix issue passing <br-option>--no-config</br-option> to embedded Perl.</p>
|
||||
</release-item>
|
||||
|
||||
<release-item>
|
||||
<release-item-contributor-list>
|
||||
<release-item-ideator id="adams.clinton"/>
|
||||
</release-item-contributor-list>
|
||||
|
||||
<p>Fix issue where specifying <br-setting>log-level-stderr</br-setting> > <id>warn</id> would cause a <cmd>local</cmd>/<cmd>remote</cmd> process to error on exit due to output found on stderr when none was expected. The max value for a <cmd>local</cmd>/<cmd>remote</cmd> process is now error since there's no reason for these processes to emit warnings.</p>
|
||||
</release-item>
|
||||
</release-bug-list>
|
||||
|
||||
<release-improvement-list>
|
||||
|
@@ -15,6 +15,7 @@ static ConfigCommandData configCommandData[CFG_COMMAND_TOTAL] = CONFIG_COMMAND_L
|
||||
|
||||
CONFIG_COMMAND_LOG_FILE(false)
|
||||
CONFIG_COMMAND_LOG_LEVEL_DEFAULT(logLevelInfo)
|
||||
CONFIG_COMMAND_LOG_LEVEL_STDERR_MAX(logLevelTrace)
|
||||
)
|
||||
|
||||
CONFIG_COMMAND
|
||||
@@ -23,6 +24,7 @@ static ConfigCommandData configCommandData[CFG_COMMAND_TOTAL] = CONFIG_COMMAND_L
|
||||
|
||||
CONFIG_COMMAND_LOG_FILE(false)
|
||||
CONFIG_COMMAND_LOG_LEVEL_DEFAULT(logLevelInfo)
|
||||
CONFIG_COMMAND_LOG_LEVEL_STDERR_MAX(logLevelTrace)
|
||||
)
|
||||
|
||||
CONFIG_COMMAND
|
||||
@@ -31,6 +33,7 @@ static ConfigCommandData configCommandData[CFG_COMMAND_TOTAL] = CONFIG_COMMAND_L
|
||||
|
||||
CONFIG_COMMAND_LOG_FILE(true)
|
||||
CONFIG_COMMAND_LOG_LEVEL_DEFAULT(logLevelInfo)
|
||||
CONFIG_COMMAND_LOG_LEVEL_STDERR_MAX(logLevelTrace)
|
||||
)
|
||||
|
||||
CONFIG_COMMAND
|
||||
@@ -39,6 +42,7 @@ static ConfigCommandData configCommandData[CFG_COMMAND_TOTAL] = CONFIG_COMMAND_L
|
||||
|
||||
CONFIG_COMMAND_LOG_FILE(false)
|
||||
CONFIG_COMMAND_LOG_LEVEL_DEFAULT(logLevelInfo)
|
||||
CONFIG_COMMAND_LOG_LEVEL_STDERR_MAX(logLevelTrace)
|
||||
)
|
||||
|
||||
CONFIG_COMMAND
|
||||
@@ -47,6 +51,7 @@ static ConfigCommandData configCommandData[CFG_COMMAND_TOTAL] = CONFIG_COMMAND_L
|
||||
|
||||
CONFIG_COMMAND_LOG_FILE(true)
|
||||
CONFIG_COMMAND_LOG_LEVEL_DEFAULT(logLevelInfo)
|
||||
CONFIG_COMMAND_LOG_LEVEL_STDERR_MAX(logLevelTrace)
|
||||
)
|
||||
|
||||
CONFIG_COMMAND
|
||||
@@ -55,6 +60,7 @@ static ConfigCommandData configCommandData[CFG_COMMAND_TOTAL] = CONFIG_COMMAND_L
|
||||
|
||||
CONFIG_COMMAND_LOG_FILE(false)
|
||||
CONFIG_COMMAND_LOG_LEVEL_DEFAULT(logLevelDebug)
|
||||
CONFIG_COMMAND_LOG_LEVEL_STDERR_MAX(logLevelTrace)
|
||||
)
|
||||
|
||||
CONFIG_COMMAND
|
||||
@@ -63,6 +69,7 @@ static ConfigCommandData configCommandData[CFG_COMMAND_TOTAL] = CONFIG_COMMAND_L
|
||||
|
||||
CONFIG_COMMAND_LOG_FILE(false)
|
||||
CONFIG_COMMAND_LOG_LEVEL_DEFAULT(logLevelDebug)
|
||||
CONFIG_COMMAND_LOG_LEVEL_STDERR_MAX(logLevelTrace)
|
||||
)
|
||||
|
||||
CONFIG_COMMAND
|
||||
@@ -71,6 +78,7 @@ static ConfigCommandData configCommandData[CFG_COMMAND_TOTAL] = CONFIG_COMMAND_L
|
||||
|
||||
CONFIG_COMMAND_LOG_FILE(false)
|
||||
CONFIG_COMMAND_LOG_LEVEL_DEFAULT(logLevelInfo)
|
||||
CONFIG_COMMAND_LOG_LEVEL_STDERR_MAX(logLevelError)
|
||||
)
|
||||
|
||||
CONFIG_COMMAND
|
||||
@@ -79,6 +87,7 @@ static ConfigCommandData configCommandData[CFG_COMMAND_TOTAL] = CONFIG_COMMAND_L
|
||||
|
||||
CONFIG_COMMAND_LOG_FILE(false)
|
||||
CONFIG_COMMAND_LOG_LEVEL_DEFAULT(logLevelInfo)
|
||||
CONFIG_COMMAND_LOG_LEVEL_STDERR_MAX(logLevelError)
|
||||
)
|
||||
|
||||
CONFIG_COMMAND
|
||||
@@ -87,6 +96,7 @@ static ConfigCommandData configCommandData[CFG_COMMAND_TOTAL] = CONFIG_COMMAND_L
|
||||
|
||||
CONFIG_COMMAND_LOG_FILE(true)
|
||||
CONFIG_COMMAND_LOG_LEVEL_DEFAULT(logLevelInfo)
|
||||
CONFIG_COMMAND_LOG_LEVEL_STDERR_MAX(logLevelTrace)
|
||||
)
|
||||
|
||||
CONFIG_COMMAND
|
||||
@@ -95,6 +105,7 @@ static ConfigCommandData configCommandData[CFG_COMMAND_TOTAL] = CONFIG_COMMAND_L
|
||||
|
||||
CONFIG_COMMAND_LOG_FILE(true)
|
||||
CONFIG_COMMAND_LOG_LEVEL_DEFAULT(logLevelInfo)
|
||||
CONFIG_COMMAND_LOG_LEVEL_STDERR_MAX(logLevelTrace)
|
||||
)
|
||||
|
||||
CONFIG_COMMAND
|
||||
@@ -103,6 +114,7 @@ static ConfigCommandData configCommandData[CFG_COMMAND_TOTAL] = CONFIG_COMMAND_L
|
||||
|
||||
CONFIG_COMMAND_LOG_FILE(true)
|
||||
CONFIG_COMMAND_LOG_LEVEL_DEFAULT(logLevelInfo)
|
||||
CONFIG_COMMAND_LOG_LEVEL_STDERR_MAX(logLevelTrace)
|
||||
)
|
||||
|
||||
CONFIG_COMMAND
|
||||
@@ -111,6 +123,7 @@ static ConfigCommandData configCommandData[CFG_COMMAND_TOTAL] = CONFIG_COMMAND_L
|
||||
|
||||
CONFIG_COMMAND_LOG_FILE(true)
|
||||
CONFIG_COMMAND_LOG_LEVEL_DEFAULT(logLevelInfo)
|
||||
CONFIG_COMMAND_LOG_LEVEL_STDERR_MAX(logLevelTrace)
|
||||
)
|
||||
|
||||
CONFIG_COMMAND
|
||||
@@ -119,6 +132,7 @@ static ConfigCommandData configCommandData[CFG_COMMAND_TOTAL] = CONFIG_COMMAND_L
|
||||
|
||||
CONFIG_COMMAND_LOG_FILE(true)
|
||||
CONFIG_COMMAND_LOG_LEVEL_DEFAULT(logLevelInfo)
|
||||
CONFIG_COMMAND_LOG_LEVEL_STDERR_MAX(logLevelTrace)
|
||||
)
|
||||
|
||||
CONFIG_COMMAND
|
||||
@@ -127,6 +141,7 @@ static ConfigCommandData configCommandData[CFG_COMMAND_TOTAL] = CONFIG_COMMAND_L
|
||||
|
||||
CONFIG_COMMAND_LOG_FILE(true)
|
||||
CONFIG_COMMAND_LOG_LEVEL_DEFAULT(logLevelInfo)
|
||||
CONFIG_COMMAND_LOG_LEVEL_STDERR_MAX(logLevelTrace)
|
||||
)
|
||||
|
||||
CONFIG_COMMAND
|
||||
@@ -135,6 +150,7 @@ static ConfigCommandData configCommandData[CFG_COMMAND_TOTAL] = CONFIG_COMMAND_L
|
||||
|
||||
CONFIG_COMMAND_LOG_FILE(false)
|
||||
CONFIG_COMMAND_LOG_LEVEL_DEFAULT(logLevelDebug)
|
||||
CONFIG_COMMAND_LOG_LEVEL_STDERR_MAX(logLevelTrace)
|
||||
)
|
||||
)
|
||||
|
||||
|
@@ -16,6 +16,7 @@ typedef struct ConfigCommandData
|
||||
const char *name;
|
||||
bool logFile:1;
|
||||
unsigned int logLevelDefault:4;
|
||||
unsigned int logLevelStdErrMax:4;
|
||||
} ConfigCommandData;
|
||||
|
||||
#define CONFIG_COMMAND_LIST(...) \
|
||||
@@ -28,6 +29,8 @@ typedef struct ConfigCommandData
|
||||
.logFile = logFileParam,
|
||||
#define CONFIG_COMMAND_LOG_LEVEL_DEFAULT(logLevelDefaultParam) \
|
||||
.logLevelDefault = logLevelDefaultParam,
|
||||
#define CONFIG_COMMAND_LOG_LEVEL_STDERR_MAX(logLevelStdErrMaxParam) \
|
||||
.logLevelStdErrMax = logLevelStdErrMaxParam,
|
||||
#define CONFIG_COMMAND_NAME(nameParam) \
|
||||
.name = nameParam,
|
||||
|
||||
@@ -294,6 +297,16 @@ cfgLogLevelDefault()
|
||||
return (LogLevel)configCommandData[cfgCommand()].logLevelDefault;
|
||||
}
|
||||
|
||||
/***********************************************************************************************************************************
|
||||
Get max stderr log level -- used to suppress error output for higher log levels, e.g. local and remote commands
|
||||
***********************************************************************************************************************************/
|
||||
LogLevel
|
||||
cfgLogLevelStdErrMax()
|
||||
{
|
||||
ASSERT_DEBUG_COMMAND_SET();
|
||||
return (LogLevel)configCommandData[cfgCommand()].logLevelStdErrMax;
|
||||
}
|
||||
|
||||
/***********************************************************************************************************************************
|
||||
Ensure that option id is valid
|
||||
***********************************************************************************************************************************/
|
||||
|
@@ -32,6 +32,7 @@ const char *cfgCommandName(ConfigCommand commandId);
|
||||
|
||||
bool cfgLogFile();
|
||||
LogLevel cfgLogLevelDefault();
|
||||
LogLevel cfgLogLevelStdErrMax();
|
||||
|
||||
const StringList *cfgCommandParam();
|
||||
|
||||
|
@@ -29,8 +29,6 @@ cfgLoadParam(unsigned int argListSize, const char *argList[], String *exe)
|
||||
configParse(argListSize, argList);
|
||||
|
||||
// Initialize logging
|
||||
if (cfgCommand() != cfgCmdLocal && cfgCommand() != cfgCmdRemote)
|
||||
{
|
||||
LogLevel logLevelConsole = logLevelOff;
|
||||
LogLevel logLevelStdErr = logLevelOff;
|
||||
LogLevel logLevelFile = logLevelOff;
|
||||
@@ -40,8 +38,14 @@ cfgLoadParam(unsigned int argListSize, const char *argList[], String *exe)
|
||||
logLevelConsole = logLevelEnum(strPtr(cfgOptionStr(cfgOptLogLevelConsole)));
|
||||
|
||||
if (cfgOptionValid(cfgOptLogLevelStderr))
|
||||
{
|
||||
logLevelStdErr = logLevelEnum(strPtr(cfgOptionStr(cfgOptLogLevelStderr)));
|
||||
|
||||
// If configured log level exceeds the max for a command, set it to the max
|
||||
if (logLevelStdErr > cfgLogLevelStdErrMax())
|
||||
logLevelStdErr = cfgLogLevelStdErrMax();
|
||||
}
|
||||
|
||||
if (cfgOptionValid(cfgOptLogLevelFile))
|
||||
logLevelFile = logLevelEnum(strPtr(cfgOptionStr(cfgOptLogLevelFile)));
|
||||
|
||||
@@ -49,7 +53,6 @@ cfgLoadParam(unsigned int argListSize, const char *argList[], String *exe)
|
||||
logTimestamp = cfgOptionBool(cfgOptLogTimestamp);
|
||||
|
||||
logInit(logLevelConsole, logLevelStdErr, logLevelFile, logTimestamp);
|
||||
}
|
||||
|
||||
// Only continue if a command was set. If no command is set then help will be displayed
|
||||
if (cfgCommand() != cfgCmdNone)
|
||||
@@ -65,7 +68,7 @@ cfgLoadParam(unsigned int argListSize, const char *argList[], String *exe)
|
||||
// Begin the command
|
||||
cmdBegin();
|
||||
|
||||
// If an exe was passed in the use that
|
||||
// If an exe was passed in then use it
|
||||
if (exe != NULL)
|
||||
cfgExeSet(exe);
|
||||
|
||||
|
@@ -83,8 +83,12 @@ testRun()
|
||||
TEST_RESULT_VOID(cfgCommandSet(cfgCmdBackup), "command set to backup");
|
||||
TEST_RESULT_INT(cfgLogLevelDefault(), logLevelInfo, "default log level is info");
|
||||
TEST_RESULT_BOOL(cfgLogFile(), true, "log file is on");
|
||||
TEST_RESULT_VOID(cfgCommandSet(cfgCmdInfo), "command set to archive-push");
|
||||
TEST_RESULT_VOID(cfgCommandSet(cfgCmdInfo), "command set to info");
|
||||
TEST_RESULT_INT(cfgLogLevelDefault(), logLevelDebug, "default log level is debug");
|
||||
TEST_RESULT_INT(cfgLogLevelStdErrMax(), logLevelTrace, "max stderr log level is trace");
|
||||
TEST_RESULT_BOOL(cfgLogFile(), false, "log file is off");
|
||||
TEST_RESULT_VOID(cfgCommandSet(cfgCmdLocal), "command set to local");
|
||||
TEST_RESULT_INT(cfgLogLevelStdErrMax(), logLevelError, "max stderr log level is error");
|
||||
TEST_RESULT_BOOL(cfgLogFile(), false, "log file is off");
|
||||
|
||||
// -------------------------------------------------------------------------------------------------------------------------
|
||||
|
@@ -24,7 +24,6 @@ testRun()
|
||||
TEST_RESULT_INT(logLevelStdErr, logLevelWarn, "stderr logging is error");
|
||||
|
||||
// -------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
argList = strLstNew();
|
||||
strLstAdd(argList, strNew("pgbackrest"));
|
||||
strLstAdd(argList, strNew("--host-id=1"));
|
||||
@@ -32,13 +31,15 @@ testRun()
|
||||
strLstAdd(argList, strNew("--command=backup"));
|
||||
strLstAdd(argList, strNew("--stanza=db"));
|
||||
strLstAdd(argList, strNew("--type=backup"));
|
||||
strLstAdd(argList, strNew("--log-level-stderr=info"));
|
||||
strLstAdd(argList, strNew("local"));
|
||||
|
||||
TEST_RESULT_VOID(cfgLoad(strLstSize(argList), strLstPtr(argList)), "load local config");
|
||||
|
||||
TEST_RESULT_STR(strPtr(cfgExe()), "pgbackrest", "check exe");
|
||||
TEST_RESULT_INT(logLevelStdOut, logLevelWarn, "console logging is warn");
|
||||
TEST_RESULT_INT(logLevelStdErr, logLevelWarn, "stderr logging is warn");
|
||||
TEST_RESULT_INT(logLevelStdOut, logLevelOff, "console logging is off");
|
||||
TEST_RESULT_INT(logLevelStdErr, logLevelError, "stderr logging is error");
|
||||
TEST_RESULT_INT(logLevelFile, logLevelOff, "file logging is off");
|
||||
|
||||
// -------------------------------------------------------------------------------------------------------------------------
|
||||
TEST_RESULT_VOID(cfgLoadParam(strLstSize(argList), strLstPtr(argList), strNew("pgbackrest2")), "load local config");
|
||||
|
Reference in New Issue
Block a user