Java >> Java tutorial >  >> Tag >> Log4j

Log4J2 - tildeler filtilføjelsesfilnavn ved kørsel

h/t rgoers FileAppenderen understøtter ikke to dollartegn på filnavnet, da filen åbnes, når appenderen startes. Det, du angiver med to dollartegn, er, at du - potentielt - ønsker et andet filnavn for hver begivenhed.

Med en enkelt $ (som i ${sys:logFilename} ), vil systemet lede efter egenskaben "logFilename" i systemegenskaberne.

Derfor skal log4j2.xml have:

<appenders>
    <File name="MyFile" fileName="${sys:logFilename}">
        <PatternLayout pattern="%-4r %d{${datestamp}} [%t] %-5level %logger{36} - %msg%n"/>
    </File>
</appenders>

Java-applikationen skal indstille systemegenskaben:

System.setProperty("logFilename", filename);

og genkonfigurer loggeren:

org.apache.logging.log4j.core.LoggerContext ctx =
    (org.apache.logging.log4j.core.LoggerContext) LogManager.getContext(false);
ctx.reconfigure();

Dette giver den ønskede adfærd.


Fra log4j2 version 2.5 her er den enkleste måde at opnå dette på:

I din log4j2.xml :

<Appenders>
   <File name="MyFile" filename="${sys:logFilename}">
   ...

I din hoved MyApp.java fil :

public class MyApp {

    Logger log;

    static {
          System.setProperty("logFilename", ...);
          log = LogManager.getLogger();
    }

    public static void main(String... args) {...}
}

FANG: Du skal indstille logFilename systemegenskab før log4j2 indlæses. I dette eksempel før du kalder LogManager.getLogger .


Jeg ved godt, at dette emne er gammelt, men svarene passede ikke rigtig til mig. Her er en funktion, som giver dig mulighed for at omkonfigurere en eksisterende Appender under kørsel:

static void updateLogger(String file_name, String appender_name, String package_name){
LoggerContext context = (LoggerContext) LogManager.getContext(false);
    Configuration configuration = context.getConfiguration();
    Layout<? extends Serializable> old_layout = configuration.getAppender(appender_name).getLayout();

    //delete old appender/logger
    configuration.getAppender(appender_name).stop();
    configuration.removeLogger(package_name);

    //create new appender/logger
    LoggerConfig loggerConfig = new LoggerConfig(package_name, Level.INFO, false);
    FileAppender appender = FileAppender.createAppender(file_name, "false", "false", appender_name, "true", "true", "true",
            "8192", old_layout, null, "false", "", configuration);
    appender.start();
    loggerConfig.addAppender(appender, Level.INFO, null);
    configuration.addLogger(package_name, loggerConfig);

    context.updateLoggers();
}

Du kan angive et filnavn, navnet på din appender og pakkenavnet, som du vil logge.

Eksempel logger:

<File name="fileWriter_api" fileName="${LOG_DIR}/api.log" append="false">
  <PatternLayout pattern="${PATTERN}"/>
</File>

Kan omkonfigureres opkald som dette:

updateLogger("log/api_new.log", "fileWriter_api", "my.package");

Java tag