On Thu, Jan 21, 2021 at 03:28:12PM +0100, Romain Manni-Bucau wrote:
> Hi

Hi,
 
> Why cant it be added as element earlier at pattern parsing time? Would
> avoid to have two particular cases and keep current pattern/impl.
> A %java or so sounds more natural no?

Mhh, maybe I just share my idea of the concrete implementation, so you see
what I want to do:

Premise: The JUL logging is configured to log all below to an own handler.

public class LoggingAccessLogValve extends AbstractAccessLogValve {

        private static final Log log = 
LogFactory.getLog(LoggingAccessLogValve.class);
        private Map<CharArrayWriter, JsonGenerator> writers = new 
WeakHashMap<>();

        @Override
        protected void log(CharArrayWriter message) {
                if(log.isInfoEnabled()) {
                        log.info(message);
                }
        }

        protected void preLogAddElement(CharArrayWriter result) {
                JsonGenerator jsonWriter = Json.createGenerator(result);
                synchronized (this) {
                        writers.put(result,jsonWriter);
                }
                jsonWriter.writeStartObject();
        }

        protected void postLogAddElement(CharArrayWriter result) {
                JsonGenerator jsonWriter = null;
                synchronized (this) {
                        jsonWriter = writers.remove(result);
                }
                if(jsonWriter != null) {
                        jsonWriter.writeEnd();
                        jsonWriter.close();
                }
        }

        private class JsonAccessLogElementWrapper implements AccessLogElement {

                private final String jsonAttributeName;
                private final AccessLogElement delegate;

                public JsonAccessLogElementWrapper(AccessLogElement e, String 
name) {
                        delegate = e;
                        jsonAttributeName = name;
                }

                @Override
                public void addElement(CharArrayWriter buf, Date date, Request 
request, Response response, long time) {
                        JsonGenerator jsonWriter = null;
                        synchronized (this) {
                                jsonWriter = writers.get(buf);
                        }
                        if(jsonWriter == null) {
                                // TODO: add warn
                                return;
                        }

                        // TODO: maybe even use stack/cache of CharyArrayWriter 
here, too
                        CharArrayWriter writer = new CharArrayWriter();
                        delegate.addElement(writer, date, request, response, 
time);
                        jsonWriter.write(jsonAttributeName, writer.toString());
                }
        }

        @Override
        protected AccessLogElement createAccessLogElement(String name, char 
pattern) {
                AccessLogElement e = super.createAccessLogElement(name, 
pattern);
                return new JsonAccessLogElementWrapper(e, mapName(e) + '-' + 
name);
        }

        @Override
        protected AccessLogElement createAccessLogElement(char pattern) {
                AccessLogElement e = super.createAccessLogElement(pattern);
                return new JsonAccessLogElementWrapper(e, mapName(e));
        }

        private String mapName(AccessLogElement e) {
                if(e instanceof RemoteAddrElement) {
                        return "remoteAddr";
                } else if(e instanceof HostElement) {
                        return "host";
                // TODO: finish
                }
                throw new IllegalArgumentException();
        }
}

so what do you think about this approach?

mfg
thomas

> 
> Le jeu. 21 janv. 2021 à 13:59, Thomas Meyer <tho...@m3y3r.de> a écrit :
> 
> > a sub class can extend before and after the addElement loop to
> > establish a context via thread-dependend CharArrayWriter object.
> > ---
> >  java/org/apache/catalina/valves/AbstractAccessLogValve.java | 5 +++++
> >  1 file changed, 5 insertions(+)
> >
> > diff --git a/java/org/apache/catalina/valves/AbstractAccessLogValve.java
> > b/java/org/apache/catalina/valves/AbstractAccessLogValve.java
> > index e23f49d3a5..5e774c2320 100644
> > --- a/java/org/apache/catalina/valves/AbstractAccessLogValve.java
> > +++ b/java/org/apache/catalina/valves/AbstractAccessLogValve.java
> > @@ -685,9 +685,11 @@ public abstract class AbstractAccessLogValve extends
> > ValveBase implements Access
> >              result = new CharArrayWriter(128);
> >          }
> >
> > +        preLogAddElement(result);
> >          for (int i = 0; i < logElements.length; i++) {
> >              logElements[i].addElement(result, date, request, response,
> > time);
> >          }
> > +        postLogAddElement(result);
> >
> >          log(result);
> >
> > @@ -699,6 +701,9 @@ public abstract class AbstractAccessLogValve extends
> > ValveBase implements Access
> >
> >      // -------------------------------------------------------- Protected
> > Methods
> >
> > +    protected void preLogAddElement(CharArrayWriter result) {}
> > +    protected void postLogAddElement(CharArrayWriter result) {}
> > +
> >      /**
> >       * Log the specified message.
> >       *
> > --
> > 2.20.1
> >
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
> > For additional commands, e-mail: dev-h...@tomcat.apache.org
> >
> >

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to