
Author: ceki Date: Tue Dec 23 22:22:24 2008 New Revision: 2100 Added: logback/trunk/logback-examples/src/main/java/chapter4/sift/access-siftingFile.xml Removed: logback/trunk/logback-access/src/test/input/jetty/siftingFile.xml Modified: logback/trunk/logback-access/src/main/java/ch/qos/logback/access/sift/AccessEventDiscriminator.java logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/action/AppenderRefAction.java logback/trunk/logback-site/src/site/pages/manual/appenders.html Log: - improved docs Modified: logback/trunk/logback-access/src/main/java/ch/qos/logback/access/sift/AccessEventDiscriminator.java ============================================================================== --- logback/trunk/logback-access/src/main/java/ch/qos/logback/access/sift/AccessEventDiscriminator.java (original) +++ logback/trunk/logback-access/src/main/java/ch/qos/logback/access/sift/AccessEventDiscriminator.java Tue Dec 23 22:22:24 2008 @@ -38,7 +38,9 @@ * REQUEST_ATTRIBUTE, SESSION_ATTRIBUTE, REMOTE_ADDRESS, * LOCAL_PORT,REQUEST_URI * - * <p> The first three fields require an additional key. + * <p> The first three fields require an additional key. For the + * SESSION_ATTRIBUTE field, the additional key named "id" has special meaning + * as it is mapped to the session id of the current http request. */ public enum FieldName { COOKIE, REQUEST_ATTRIBUTE, SESSION_ATTRIBUTE, REMOTE_ADDRESS, LOCAL_PORT, REQUEST_URI @@ -61,16 +63,19 @@ public String getRawDiscriminatingValue(AccessEvent acccessEvent) { switch (fieldName) { case COOKIE: + // tested return acccessEvent.getCookie(additionalKey); case LOCAL_PORT: return String.valueOf(acccessEvent.getLocalPort()); case REQUEST_ATTRIBUTE: + // tested return getRequestAttribute(acccessEvent); case SESSION_ATTRIBUTE: return getSessionAttribute(acccessEvent); case REMOTE_ADDRESS: return acccessEvent.getRemoteAddr(); case REQUEST_URI: + // tested return getRequestURI(acccessEvent); default: return null; @@ -79,13 +84,13 @@ private String getRequestAttribute(AccessEvent acccessEvent) { String attr = acccessEvent.getAttribute(additionalKey); - if(AccessEvent.NA.equals(attr)) { + if (AccessEvent.NA.equals(attr)) { return null; } else { return attr; } } - + private String getRequestURI(AccessEvent acccessEvent) { String uri = acccessEvent.getRequestURI(); if (uri != null && uri.length() >= 1 && uri.charAt(0) == '/') { @@ -97,18 +102,9 @@ private String getSessionAttribute(AccessEvent acccessEvent) { HttpServletRequest req = acccessEvent.getRequest(); - System.out.println("req=" + req); if (req != null) { HttpSession session = req.getSession(false); - System.out.println("session=" + session); if (session != null) { - Enumeration ee = session.getAttributeNames(); - while(ee.hasMoreElements()) { - String k = (String) ee.nextElement(); - Object v = session.getAttribute(k); - System.out.println("Session "+k+"="+v); - } - if ("id".equalsIgnoreCase(additionalKey)) { return session.getId(); } else { Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/action/AppenderRefAction.java ============================================================================== --- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/action/AppenderRefAction.java (original) +++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/joran/action/AppenderRefAction.java Tue Dec 23 22:22:24 2008 @@ -1,7 +1,7 @@ /** - * LOGBack: the generic, reliable, fast and flexible logging framework. + * Logback: the generic, reliable, fast and flexible logging framework. * - * Copyright (C) 1999-2006, QOS.ch + * Copyright (C) 2000-2008, QOS.ch * * This library is free software, you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free Added: logback/trunk/logback-examples/src/main/java/chapter4/sift/access-siftingFile.xml ============================================================================== --- (empty file) +++ logback/trunk/logback-examples/src/main/java/chapter4/sift/access-siftingFile.xml Tue Dec 23 22:22:24 2008 @@ -0,0 +1,22 @@ +<configuration> + + <appender name="SIFTING" + class="ch.qos.logback.access.sift.SiftingAppender"> + <Discriminator> + <Key>id</Key> + <FieldName>SESSION_ATTRIBUTE</FieldName> + <AdditionalKey>username</AdditionalKey> + <DefaultValue>NA</DefaultValue> + </Discriminator> + <sift> + <appender name="${id}" class="ch.qos.logback.core.FileAppender"> + <File>byUser/${id}.log</File> + <layout class="ch.qos.logback.access.PatternLayout"> + <Pattern>%h %l %u %t \"%r\" %s %b</Pattern> + </layout> + </appender> + </sift> + </appender> + + <appender-ref ref="SIFTING" /> +</configuration> \ No newline at end of file Modified: logback/trunk/logback-site/src/site/pages/manual/appenders.html ============================================================================== --- logback/trunk/logback-site/src/site/pages/manual/appenders.html (original) +++ logback/trunk/logback-site/src/site/pages/manual/appenders.html Tue Dec 23 22:22:24 2008 @@ -3512,11 +3512,47 @@ <p>The desginated AccessEvent field can be one of COOKIE, REQUEST_ATTRIBUTE, SESSION_ATTRIBUTE, REMOTE_ADDRESS, LOCAL_PORT, - REQUEST_URI. Note that the fiest three fields require that the - <span class="option">AdditionalKey</span> property to be + REQUEST_URI. Note that the first three fields require that the + <span class="option">AdditionalKey</span> property also to be specified.</p> + <p>Below is an example configuration file.</p> + <em>Example 4.<span class="autoEx"/>: SiftingAppender configuration (logback-examples/src/main/java/chapter4/conf/sift/access-siftingFile.xml)</em> + + <p class="source"><configuration> + <appender name="SIFTING" class="ch.qos.logback.access.sift.SiftingAppender"> + <Discriminator class="ch.qos.logback.access.sift.AccessEventDiscriminator"> + <Key>id</Key> + <FieldName>SESSION_ATTRIBUTE</FieldName> + <AdditionalKey>username</AdditionalKey> + <DefaultValue>NA</DefaultValue> + </Discriminator> + <sift> + <appender name="${id}" class="ch.qos.logback.core.FileAppender"> + <File>byUser/${id}.log</File> + <layout class="ch.qos.logback.access.PatternLayout"> + <Pattern>%h %l %u %t \"%r\" %s %b</Pattern> + </layout> + </appender> + </sift> + </appender> + <appender-ref ref="SIFTING" /> +</configuration></p> + + + <p>In the above configuration file, a <code>SiftingAppender</code> + nests <code>FileAppender</code> instances. The key "id" is + designated as a variable which will be availabe to the nested + <code>FileAppender</code> instances. The default discriminator, + namely <code>AccessEventDiscriminator</code>, will search for + "username" session attribute in each <code>AccessEvent</code>. If + no such attribute is available, then the default value "NA" will + be used. Thus, assuming the session attribute named "username" + contains the username of each logged on user, there will be a log + file under the <em>byUser/</em> folder (of the current folder) + named after each user containing the access logs for that user. + </p> <script src="../templates/footer.js" type="text/javascript"></script>