Wie erstelle ich ein Appender-Plugin für Rolling Files in log4j2

Ich möchte einen benutzerdefinierten rollenden log4j2-Dateianhanger erstellen. Ich muss diesen benutzerdefinierten Appender erstellen, da ich das log4j-Protokollereignis mit einigen für meine Anwendung spezifischen Informationen umschließen möchte. Beispiel: userId, Name der gehosteten Anwendung.

Ich habe eine Klasse, die Log4jLogEvent erweitert und LogEvent implementiert. Diese Klasse enthält Informationen, die ich mit dem Protokollereignis umbrechen muss. Bitte sehen Sie diesen Code:

public class CustomLogEvent extends Log4jLogEvent implements LogEvent {

private String userId;
private String applicationName;

private static final long serialVersionUID = 1L;

public CustomLogEvent(String loggerName, Marker marker, String loggerFQCN, Level level, Message message, Throwable t, Map<String, String> mdc, ThreadContext.ContextStack ndc, String threadName, StackTraceElement location, long timestamp){
    super(loggerName,marker,loggerFQCN,level,message,t,mdc,ndc,threadName,location,timestamp);
}
         //Getters and setters for user Id and app name
}

a wir in log4j2 den Appender für rollende Dateien nicht wie in log4j 1.2 erweitern können, habe ich einen neuen Appender für rollende Dateien erstellt, indem ich den Quellcode des ursprünglichen Appenders für rollende Dateien sah. Diese Klasse erweitert AbstractOutputStreamAppender.

Dies ist der Code, den ich für den rollenden Dateianhang geschrieben habe.

@Plugin(name = "MyRollingFileAppender", category = "Core", elementType = "appender", printObject = true)
public class MyRollingFileAppender extends AbstractOutputStreamAppender<RollingFileManager> {

private static final int DEFAULT_BUFFER_SIZE = 8192;
private static final long serialVersionUID = 1L;

private final String fileName;
private final String filePattern;
private Object advertisement;
private final Advertiser advertiser;


private MyRollingFileAppender(final String name, final Layout<? extends Serializable> layout, final Filter filter,
                            final RollingFileManager manager, final String fileName, final String filePattern,
                            final boolean ignoreExceptions, final boolean immediateFlush, final Advertiser advertiser) {
    super(name, layout, filter, ignoreExceptions, immediateFlush, manager);
    if (advertiser != null) {
        final Map<String, String> configuration = new HashMap<String, String>(layout.getContentFormat());
        configuration.put("contentType", layout.getContentType());
        configuration.put("name", name);
        advertisement = advertiser.advertise(configuration);
    }
    this.fileName = fileName;
    this.filePattern = filePattern;
    this.advertiser = advertiser;
}


@Override
public void append(final LogEvent logEvent) {

    int userId = //get user Id

    String appplicatinName = //get application name

    GetLoggingEvent myLogEvent = new GetLoggingEvent();

    LogEvent customLogEvent = myLogEvent.getCustomLogEvent(logEvent, userId, applicationName);
    getManager().checkRollover(customLogEvent);
    super.append(customLogEvent);
}

@PluginFactory
public static MyRollingFileAppender createAppender(
        @PluginAttribute("fileName") final String fileName,
        @PluginAttribute("filePattern") final String filePattern,
        @PluginAttribute("append") final String append,
        @PluginAttribute("name") final String name,
        @PluginAttribute("bufferedIO") final String bufferedIO,
        @PluginAttribute("bufferSize") final String bufferSizeStr,
        @PluginAttribute("immediateFlush") final String immediateFlush,
        @PluginElement("Policy") final TriggeringPolicy policy,
        @PluginElement("Strategy") RolloverStrategy strategy,
        @PluginElement("Layout") Layout<? extends Serializable> layout,
        @PluginElement("Filter") final Filter filter,
        @PluginAttribute("ignoreExceptions") final String ignore,
        @PluginAttribute("advertise") final String advertise,
        @PluginAttribute("advertiseURI") final String advertiseURI,
        @PluginConfiguration final Configuration config) {

    final boolean isAppend = Booleans.parseBoolean(append, true);
    final boolean ignoreExceptions = Booleans.parseBoolean(ignore, true);
    final boolean isBuffered = Booleans.parseBoolean(bufferedIO, true);
    final boolean isFlush = Booleans.parseBoolean(immediateFlush, true);
    final boolean isAdvertise = Boolean.parseBoolean(advertise);
    final int bufferSize = Integers.parseInt(bufferSizeStr, DEFAULT_BUFFER_SIZE);
    if (!isBuffered && bufferSize > 0) {
        LOGGER.warn("The bufferSize is set to {} but bufferedIO is not true: {}", bufferSize, bufferedIO);
    }
    if (name == null) {
        LOGGER.error("No name provided for FileAppender");
        return null;
    }

    if (fileName == null) {
        LOGGER.error("No filename was provided for FileAppender with name "  + name);
        return null;
    }

    if (filePattern == null) {
        LOGGER.error("No filename pattern provided for FileAppender with name "  + name);
        return null;
    }

    if (policy == null) {
        LOGGER.error("A TriggeringPolicy must be provided");
        return null;
    }

    if (strategy == null) {
        strategy = DefaultRolloverStrategy.createStrategy(null, null, null,
                String.valueOf(Deflater.DEFAULT_COMPRESSION), config);
    }

    if (layout == null) {
        layout = PatternLayout.createDefaultLayout();
    }

    final RollingFileManager manager = RollingFileManager.getFileManager(fileName, filePattern, isAppend,
            isBuffered, policy, strategy, advertiseURI, layout, bufferSize);
    if (manager == null) {
        return null;
    }

    return new MyRollingFileAppender(name, layout, filter, manager, fileName, filePattern,
            ignoreExceptions, isFlush, isAdvertise ? config.getAdvertiser() : null);
}
}

Die Anwendung, die ich von log4j 1.2 auf log4j2 aktualisiere, verwendet die Apache-Commons-API. Daher kann ich zum Hinzufügen von Informationen keine Thread-Kontextzuordnungen verwenden.

Dieser Appender funktioniert vorerst einwandfrei. Allerdings habe ich einige Verwirrungen über meine Vorgehensweise.

Ich möchte sicherstellen, dass die Art und Weise, wie ich dies tue (dh das Protokollereignis mit benutzerdefinierten Informationen umbrechen und den Appender für fortlaufende Dateien für benutzerdefinierte Informationen erstellen), korrekt ist. Da wir den vorhandenen Appender für fortlaufende Dateien nicht erweitern können, muss ich alle erneut schreiben der Code des rollenden Dateianhängers in meiner benutzerdefinierten Klasse, um dem Protokollereignis nur zwei weitere Felder hinzuzufügen? Gibt es eine einfache Möglichkeit, dasselbe zu tun?

Vielen Dank

Antworten auf die Frage(2)

Ihre Antwort auf die Frage