in common/loglevel.cpp [92:209]
int swssloglevel(int argc, char** argv)
{
int opt;
bool applyToAll = false, print = false, default_loglevel_opt = false;
std::string prefix = "", component, loglevel;
auto exitWithUsage = std::bind(usage, argv[0], std::placeholders::_1, std::placeholders::_2);
while ( (opt = getopt (argc, argv, "c:l:sapdh")) != -1)
{
switch(opt)
{
case 'c':
component = optarg;
break;
case 'l':
loglevel = optarg;
break;
case 's':
prefix = "SAI_API_";
break;
case 'a':
applyToAll = true;
break;
case 'p':
print = true;
break;
case 'd':
default_loglevel_opt = true;
break;
case 'h':
exitWithUsage(EXIT_SUCCESS, "");
break;
default:
exitWithUsage(EXIT_FAILURE, "Invalid option");
}
}
DBConnector config_db("CONFIG_DB", 0);
swss::Table logger_tbl(&config_db, CFG_LOGGER_TABLE_NAME);
std::vector<std::string> keys;
logger_tbl.getKeys(keys);
if (print)
{
int errorCount = 0;
if (argc != 2)
{
exitWithUsage(EXIT_FAILURE, "-p option does not accept other options");
}
std::sort(keys.begin(), keys.end());
for (const auto& key : keys)
{
std::string level;
if (!(logger_tbl.hget(key, DAEMON_LOGLEVEL, level)))
{
std::cerr << std::left << std::setw(30) << key << "Unknown log level" << std::endl;
errorCount ++;
}
else
{
std::cout << std::left << std::setw(30) << key << level << std::endl;
}
}
if (errorCount > 0)
return (EXIT_FAILURE);
return (EXIT_SUCCESS);
}
if(default_loglevel_opt)
{
std::vector<std::string> sai_keys = get_sai_keys(keys);
std::vector<std::string> no_sai_keys = get_no_sai_keys(keys);
setAllLoglevel(logger_tbl,no_sai_keys, std::string(DEFAULT_LOGLEVEL));
setAllLoglevel(logger_tbl,sai_keys, std::string(SAI_DEFAULT_LOGLEVEL));
return (EXIT_SUCCESS);
}
if ((prefix == "SAI_API_") && !validateSaiLoglevel(loglevel))
{
exitWithUsage(EXIT_FAILURE, "Invalid SAI loglevel value");
}
else if ((prefix == "") && (Logger::priorityStringMap.find(loglevel) == Logger::priorityStringMap.end()))
{
exitWithUsage(EXIT_FAILURE, "Invalid loglevel value");
}
if (applyToAll)
{
if (component != "")
{
exitWithUsage(EXIT_FAILURE, "Invalid options provided with -a");
}
if (prefix == "SAI_API_")
{
keys.erase(std::remove_if(keys.begin(), keys.end(), filterSaiKeys), keys.end());
}
else
{
keys.erase(std::remove_if(keys.begin(), keys.end(), filterOutSaiKeys), keys.end());
}
setAllLoglevel(logger_tbl, keys, loglevel);
exit(EXIT_SUCCESS);
}
component = prefix + component;
if (std::find(std::begin(keys), std::end(keys), component) == keys.end())
{
exitWithUsage(EXIT_FAILURE, "Component not present in DB");
}
setLoglevel(logger_tbl, component, loglevel);
return EXIT_SUCCESS;
}