0

I want to configure separate log directory for every request. Is this possible with helidon?

1 Answers1

0

The oracle helidon JUL examples are located in github. Building off of those examples you would have to create a custom Handler to read the request from the HelidonMdc:

import io.helidon.logging.jul;
import io.helidon.logging.common;
import java.util.logging.*;

public class RequestFileHandler extends Handler {

public RequestFileHandler() {
    super.setFormatter(new HelidonFormatter());
}

@Override
public synchronized void publish(LogRecord r) {
    if (isLoggable(r)) {
       try {
           FileHandler h = new FileHandler(fileName(r), Integer.MAX_VALUE, 1, true);
           try {
               h.setLevel(getLevel());
               h.setEncoding(getEncoding());
               h.setFilter(null);
               h.setFormatter(getFormatter());
               h.setErrorManager(getErrorManager());
               h.publish(r);
           } finally {
              h.close();
           }
       } catch (IOException | SecurityException jm) {
           this.reportError(null, jm, ErrorManager.WRITE_FAILURE);
       }
    }
}

@Override
public void flush() {
}

@Override
public void close() {
    super.setLevel(Level.OFF);
}

private String fileName(LogRecord r) {
   Optional<String> o = HelidonMdc.get("name");
   return o.isPresent() ? o.get() +".log" : "unknown.log";
}}

Like the example code this code is assuming that you have set the value of 'name' to the request id. You would then have to install this handler on your application logger.

jmehrens
  • 10,580
  • 1
  • 38
  • 47