private static LogTarget getLogTargetFromString(String target) throws FileNotFoundException {
        if ("fd:2".equals(target)) {
            return new StderrLogTarget();
        } else if ("fd:1".equals(target)) {
            return new StdoutLogTarget();
        } else if (target.startsWith("file:")) {
            return new FileLogTarget(new File(target.substring(5)));
        }
        throw new IllegalArgumentException("Target '" + target + "' is not a valid target");
    }
Every Vespa application should call initVespaLogging exactly
one time.  This should be done from the main() method or from a
static initializer in the main class.  The library will pick up
the environment variables usually set by the Vespa
config-sentinel (VESPA_LOG_LEVEL, VESPA_LOG_TARGET,
VESPA_SERVICE_NAME, VESPA_LOG_CONTROL_DIR) but it's possible to
override these by setting system properties before calling
initVespaLogging.  This may be useful for unit testing etc:
<br>
System.setProperty("vespa.log.level", "all")
<br>
System.setProperty("vespa.log.target", "file:foo.log")
<br>
System.setProperty("vespa.service.name", "my.name")
<br>
System.setProperty("vespa.log.control.dir", ".")
<br>
System.setProperty("vespa.log.control.file", "my.logcontrol")
<br>
vespa.log.control.file is used if it's set, otherwise it's
vespa.log.control.dir + "/" + vespa.service.name + ".logcontrol"
if both of those variables are set, otherwise there will be no
runtime log control.

@param programName the name of the program that is running;
this is added as a prefix to the logger name to form the
"component" part of the log message.  (Usually the logger name
is the name of the class that logs something, so the
programName should be kept short and simple.)
vespalog/src/main/java/com/yahoo/log/LogSetup.java