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

Hvad er standard MessageFactory for Log4J

  1. Hvis du ikke indstiller en beskedfabrik, ParameterizedMessageFactory bruges som standard.
  2. Som standard bruger log4j en beskedfabrik til parameteriserede beskeder, så du kan gøre logger.warn("hello {}", user.getName());
  3. Du indstiller din egen fabrik ved at ringe til LogManager.getLogger(name, messageFactory) når du får en logger.

Hvis du ønsker String.format-typen af ​​parametre (System.out.printf-formatet), vil du bruge LogManager.getLogger(MyClass.class, new StringFormatterMessageFactory()) for at få en logger.

Hvis din mest almindelige brug er parametriserede meddelelser ({}-formatet), men hvis du lejlighedsvis ønsker mere kontrol over outputformatet, som strengformateringsværktøjet giver dig, kan du angive din logger normalt (så den bruger {}-parametriserede meddelelser), og brug Logger.printf metoder.

Eksempel:

class MyClass {
    private static Logger logger = LogManager.getLogger(MyClass.class);

    public void someMethod() {
        // use printf here to precisely control the number of digits displayed
        logger.printf(Level.INFO, "pi: %.5f", Math.PI);
    }
}

Det hele er i kode. Konfiguration (XML eller andet) er ikke involveret.


Denne tråd er allerede omkring et år gammel, men måske kan jeg stadig hjælpe nogle fyre, fordi jeg lige havde det samme problem og fandt ud af en måde, hvordan du indstiller din egen standard MessageFactory. Det er lidt tricky, måske en anden kender en bedre måde uden at oprette så mange klasser. Men for mig virker det:

  1. Opret din egen MessageFactory (forlæng fra AbstractMessageFactory eller brug bare MessageFactory grænseflade)
  2. Opret en ny LoggerContext (udvid fra LoggerContext klasse eller brug LoggerContext interface
    • Tilsidesæt newInstance(LoggerContext, String, MessageFactory) og returner din tidligere definerede MessageFactory if-argument messageFactory er null
  3. Opret en ny ContextSelector (forlænges fra ClassLoaderContextSelector eller brug bare ContextSelector grænseflade).
    • Tilsidesæt metoden createContext(String, URI) og returner en ny forekomst af din tidligere definerede LoggerContext
  4. Opret en fil log4j.component.properties i din klassesti og indstil egenskaben Log4jContextSelector til det fuldt kvalificerede navn på din i trin 3 oprettede contextSelector
    • Alternativt:Opret ikke filen, sæt blot systemegenskaben Log4jContextSelector til fqn

Nogle kodeeksempler (uden kommentarer):

MessageFactory:

public final class OwnMessageFactory extends AbstractMessageFactory
{
  public static final OwnMessageFactory INSTANCE = new OwnMessageFactory();

  @Override
  public Message newMessage(final String message, final Object... params)
  {
    return new OwnDataMessage(message, params);
  }
}

LoggerContext:

public class OwnLoggerContext extends LoggerContext
{
  // constructors

  protected Logger newInstance(final LoggerContext ctx, final String name, MessageFactory messageFactory)
  {
    if (null == messageFactory)
      messageFactory = OwnMessageFactory.INSTANCE;

    return super.newInstance(ctx, name, messageFactory);
  }

}

ContextSelector :

public class OwnContextSelector extends ClassLoaderContextSelector
{

  @Override
  protected LoggerContext createContext(String name, URI configLocation)
  {
    return new OwnLoggerContext(name, null, configLocation);
  }

}

log4j2.component.properties :

Log4jContextSelector=com.example.OwnContextSelector

Java tag