static getFull (sections, sectionKey, d) {
    sections ??= ArkimeConfig.#defaultSections;
    if (!Array.isArray(sections)) { sections = [sections]; }

    let value;
    let key;

    for (const section of sections) {
      if (section === undefined) { continue; }
      key = `${section}.${sectionKey}`;
      value = ArkimeConfig.#override.get(key) ?? ArkimeConfig.#config?.[section]?.[sectionKey];
      if (value !== undefined) { break; }
    }

    if (value === undefined) {
      if (d === ArkimeConfig.exit) {
        console.log(`ERROR - ${sectionKey} not found in sections: ${sections}`);
        process.exit();
      }
      if (d === ArkimeConfig.throw) {
        throw new Error(`${sectionKey} not found in sections: ${sections}`);
      }
      key = `defaultValue ${sectionKey}`;
      value = d;
    }

    if (ArkimeConfig.debug > 0 && !ArkimeConfig.#debugged.has(key)) {
      console.log(`CONFIG - ${key} is ${value}`);
      ArkimeConfig.#debugged.set(key, true);
    }

    if (value === 'false') { return false; }
    if (value === 'true') { return true; }

    return value;
  }
Get a config value
@param {string[] | string} sections The sections the key lives in, can also be a string
@param {string} sectionKey The key in the section to get the value for
@param {string} d=undefined The default value to return if sectionKey isn't found