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

Hvordan tilpasser man log4j2 RollingFileAppender?

Et alternativ til at bruge de indbyggede opslag er at oprette et brugerdefineret opslag. Dette kan opnås på et par linjer kode med et log4j2 plugin. Dit brugerdefinerede opslag giver derefter den nøjagtige værdi, du ønsker at vise i filoverskriften ved hver roll-over.

Plugin-koden ville se nogenlunde sådan ud:

package com.mycompany;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.apache.logging.log4j.core.lookup.AbstractLookup;
import org.apache.logging.log4j.core.lookup.StrLookup;

/**
 * Looks up keys from a class SomeClass which has access to all
 * information you want to provide in the log file header at rollover.
 */
@Plugin(name = "setu", category = StrLookup.CATEGORY)
public class SetuLookup extends AbstractLookup {

    /**
     * Looks up the value of the specified key by invoking a
     * static method on SomeClass.
     *
     * @param event The current LogEvent (ignored by this StrLookup).
     * @param key  the key to be looked up, may be null
     * @return The value of the specified key.
     */
    @Override
    public String lookup(final LogEvent event, final String key) {
        return com.mycompany.SomeClass.getValue(key);
    }
}

Derefter kan du i din konfiguration bruge overskriften på mønsterlayoutet til at udlæse dette ved hver rollover:

<RollingFile name="RollingFile" fileName="logs/app.log"
             filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}.log.gz">

  <!-- use custom lookups to access arbitrary internal system info -->
  <PatternLayout header="${setu:key1} ${setu:key2}">
    <Pattern>%d %m%n</Pattern>
  </PatternLayout>
  <Policies>
    <TimeBasedTriggeringPolicy />
  </Policies>
</RollingFile>

Log4j2-manualen har detaljer om opbygning/implementering af brugerdefinerede plugins. Kort resumé:

Den nemmeste måde er at bygge din krukke med Maven; dette vil få log4j2-annotationsprocessoren til at producere en binær indeksfil i krukken, så dit plugin hurtigt kan findes af log4j2.

Alternativet er at angive pakkenavnet på din plugin-klasse i din log4j2.xml-konfigurations packages attribut:

<Configuration status="warn" packages="com.mycompany">
  ...

OPDATERING:Bemærk, at du i din opslagsimplementering kan være så kreativ som nødvendigt. For eksempel:

package com.mycompany;

public class SomeClass {
    private static AtomicLong count = new AtomicLong(0);

    public static String getValue(final String key) {
        if (count.getAndIncrement() == 0) { // is this the first call?
            return ""; // don't output a value at system startup
        }
        if ("FULL".equals(key)) {
            // returns info to shown on rollover, nicely formatted
            return fullyFormattedHeader();
        }
        return singleValue(key);
    }
    ....
}

Dette kan opnås med konfiguration. Du kan bruge overskriften på mønsterlayoutet til at udskrive information. Dette vil blive inkluderet ved hver rollover.

<RollingFile name="RollingFile" fileName="logs/app.log"
             filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}.log.gz">

  <!-- use built-in lookups for system info or system properties -->
  <PatternLayout header="${java:runtime} - ${java:vm} - ${java:os}">
    <Pattern>%d %m%n</Pattern>
  </PatternLayout>
  <Policies>
    <TimeBasedTriggeringPolicy />
  </Policies>
</RollingFile>

Java tag