GitHub user paladox added a comment to the discussion: Help with migrating from 
log4j to log4j2 (we also use a slf4j -> log4j)

What about something like:

```java
  private static final AtomicBoolean reconfiguring = new AtomicBoolean(false);

  @Inject
  SshLog(
      final Provider<SshSession> session,
      final Provider<Context> context,
      SystemLog systemLog,
      @GerritServerConfig Config config,
      LogConfig logConfig,
      GroupAuditService auditService) {
    this.session = session;
    this.context = context;
    this.auditService = auditService;
    this.systemLog = systemLog;
    this.json = logConfig.isJsonLogging();
    this.text = logConfig.isTextLogging();

    if (config.getBoolean("sshd", "requestLog", true)) {
      initLogger();

      // Prevent stack overflow on Log4j reconfiguration
      LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
      ctx.addPropertyChangeListener(
          evt -> {
            if ("config".equals(evt.getPropertyName())) {
              initLogger();
            }
          });
    }
  }

  /** Initialize the SSH logger appenders safely */
  private void initLogger() {
    synchronized (lock) {
      if (reconfiguring.get()) return;
      reconfiguring.set(true);
      try {
        LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
        Configuration cfg = ctx.getConfiguration();

        // Stop previous appender if exists
        if (async != null) {
          async.stop();
          async = null;
        }

        List<AppenderRef> refList = new ArrayList<>();

        if (text) {
          String name = LOG_NAME;
          if (!cfg.getAppenders().containsKey(name)) {
            cfg.addAppender(systemLog.createAsyncAppender(name, new 
SshLogLayout()));
          }
          refList.add(AppenderRef.createAppenderRef(name, null, null));
        }

        if (json) {
          String name = LOG_NAME + JSON_SUFFIX;
          if (!cfg.getAppenders().containsKey(name)) {
            cfg.addAppender(systemLog.createAsyncAppender(name, new 
SshLogJsonLayout()));
          }
          refList.add(AppenderRef.createAppenderRef(name, null, null));
        }

        AppenderRef[] refs = refList.toArray(new AppenderRef[0]);

        async =
            AsyncAppender.newBuilder()
                .setName("SshAsync")
                .setAppenderRefs(refs)
                .setConfiguration(cfg)
                .build();

        async.start();
        cfg.addAppender(async);
        ctx.updateLoggers();
      } finally {
        reconfiguring.set(false);
      }
    }
  }
```

GitHub link: 
https://github.com/apache/logging-log4j2/discussions/3914#discussioncomment-14332921

----
This is an automatically sent email for dev@logging.apache.org.
To unsubscribe, please send an email to: dev-unsubscr...@logging.apache.org

Reply via email to