Hvad er standard MessageFactory for Log4J
- Hvis du ikke indstiller en beskedfabrik,
ParameterizedMessageFactory
bruges som standard. - Som standard bruger log4j en beskedfabrik til parameteriserede beskeder, så du kan gøre
logger.warn("hello {}", user.getName());
- 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:
- Opret din egen MessageFactory (forlæng fra
AbstractMessageFactory
eller brug bareMessageFactory
grænseflade) - Opret en ny LoggerContext (udvid fra
LoggerContext
klasse eller brugLoggerContext
interface- Tilsidesæt
newInstance(LoggerContext, String, MessageFactory)
og returner din tidligere definerede MessageFactory if-argumentmessageFactory
ernull
- Tilsidesæt
- Opret en ny ContextSelector (forlænges fra
ClassLoaderContextSelector
eller brug bareContextSelector
grænseflade).- Tilsidesæt metoden createContext(String, URI) og returner en ny forekomst af din tidligere definerede LoggerContext
- Opret en fil
log4j.component.properties
i din klassesti og indstil egenskabenLog4jContextSelector
til det fuldt kvalificerede navn på din i trin 3 oprettede contextSelector- Alternativt:Opret ikke filen, sæt blot systemegenskaben
Log4jContextSelector
til fqn
- Alternativt:Opret ikke filen, sæt blot systemegenskaben
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