Logging options may be configured in config file
authorAdam Dickmeiss <adam@indexdata.dk>
Thu, 16 Oct 2003 16:10:43 +0000 (16:10 +0000)
committerAdam Dickmeiss <adam@indexdata.dk>
Thu, 16 Oct 2003 16:10:43 +0000 (16:10 +0000)
doc/proxy.xml
doc/yaz++.xml.in
include/yaz++/proxy.h
include/yaz++/z-assoc.h
src/config.xml
src/yaz-pdu-assoc.cpp
src/yaz-proxy-config.cpp
src/yaz-proxy.cpp
src/yaz-z-assoc.cpp

index 051e0fb..dfac254 100644 (file)
@@ -58,7 +58,7 @@
     start it up.  It will work exactly as usual, but all the packets
     will be sent via the proxy, which will generate a log like this:
    </para>
-   <screen>
+   <screen><![CDATA[
     decode choice
     initRequest {
         referenceId OCTETSTRING(len=4) 69 6E 69 74
             }
         }
     }
+]]>
    </screen>
   </section>
   
     <para>
      <screen>
      &lt;?xml version="1.0"?>
-     &lt;!-- $Id -->
      &lt;proxy>
       &lt;target name="server1" default="1">
        &lt;!-- description of server1 .. -->
      <screen>
       &lt;proxy>
        &lt;target name="mytarget">
-       &lt;syntax type="usmarc"/>
-       &lt;syntax type="xml" marcxml="1"/>
-       &lt;syntax type="*" error="238"/>
+        &lt;syntax type="usmarc"/>
+        &lt;syntax type="xml" marcxml="1"/>
+        &lt;syntax type="*" error="238"/>
        &lt;/target>
       &lt;/proxy>
      </screen>
      </para>
      </tip>
    </section>
-   
+
+   <section id="proxy-config-log">
+    <title>Configuration: log</title>
+    <para>
+     The element <literal>log</literal> is the child of element
+     <literal>proxy</literal> and specifies what to be logged by the
+     proxy.
+     </para>
+    <para>
+     Specify the log file with command-line option <literal>-l</literal>.
+    </para>
+    <para>
+     The text of the <literal>log</literal> element is a sequence of
+     options separated by white space. See the table below:
+     <table frame="top"><title>Logging options</title>
+      <tgroup cols="2">
+       <colspec colwidth="1*" colname="option"/>
+       <colspec colwidth="2*" colname="description"/>
+       <thead>
+       <row>
+        <entry>Option</entry>
+        <entry>Description</entry>
+       </row>
+       </thead>
+       <tbody>
+       <row>
+        <entry><literal>client-apdu</literal></entry>
+        <entry>
+         Log APDUs as reported by YAZ for the
+         communication between the client and the proxy
+        </entry>
+       </row>
+       <row>
+        <entry><literal>server-apdu</literal></entry>
+        <entry>
+         Log APDUs as reported by YAZ for the
+         communication between the proxy and the server (backend).
+        </entry>
+       </row>
+       <row>
+        <entry><literal>clients-requests</literal></entry>
+        <entry>
+         Log a brief description about requests transferred between
+         the client and the proxy. The name of the request and the size
+         of the APDU is logged.
+        </entry>
+       </row>
+       <row>
+        <entry><literal>server-requests</literal></entry>
+        <entry>
+         Log a brief description about requests transferred between
+         the proxy and the server (backend). The name of the request
+         and the size of the APDU is logged.
+        </entry>
+       </row>
+       </tbody>
+      </tgroup>
+     </table>
+    </para>
+    <para>
+     To log communication in details between the proxy and the backend, th
+     following configuration could be used:
+    <screen><![CDATA[
+     <target name="mytarget">
+      <log>server-apdu server-requests</log>
+     </target>
+]]>
+     </screen>
+    </para>
+   </section>
+
   </section>
   <section id="proxy-usage">
    <title>Proxy Usage</title>
index 4cc9a67..320b466 100644 (file)
@@ -9,7 +9,7 @@
      <!ENTITY yaz-proxy-ref SYSTEM "yaz-proxy-ref.xml">
      <!ENTITY app-license SYSTEM "license.xml">
 ]>
-<!-- $Id: yaz++.xml.in,v 1.9 2003-07-02 10:31:42 adam Exp $ -->
+<!-- $Id: yaz++.xml.in,v 1.10 2003-10-16 16:10:43 adam Exp $ -->
 <book id="yazpp">
  <bookinfo>
   <title>YAZ++ User's Guide and Reference</title>
@@ -39,6 +39,9 @@
    <simpara>
     This manual covers version @VERSION@.
     </simpara>
+   <simpara>
+    CVS ID: $Id: yaz++.xml.in,v 1.10 2003-10-16 16:10:43 adam Exp $
+   </simpara>
   </abstract>
  </bookinfo>
  
index cb96fc1..be82f31 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (c) 1998-2003, Index Data.
  * See the file LICENSE for details.
  * 
- * $Id: proxy.h,v 1.18 2003-10-16 13:40:41 adam Exp $
+ * $Id: proxy.h,v 1.19 2003-10-16 16:10:43 adam Exp $
  */
 
 #include <yaz++/z-assoc.h>
@@ -18,8 +18,10 @@ class Yaz_Proxy;
 
 #define MAX_ZURL_PLEX 10
 
-#define PROXY_LOG_APDU 1
-#define PROXY_LOG_REQ 1
+#define PROXY_LOG_APDU_CLIENT 1
+#define PROXY_LOG_APDU_SERVER 2
+#define PROXY_LOG_REQ_CLIENT 4
+#define PROXY_LOG_REQ_SERVER 8
 
 struct Yaz_RecordCache_Entry;
 
@@ -40,15 +42,16 @@ public:
                      int *max_clients,
                      int *keepalive_limit_bw,
                      int *keepalive_limit_pdu,
-                     int *pre_init,
-                     int *log_mask);
+                     int *pre_init);
+    
+    void get_generic_info(int *log_mask, int *max_clients);
 
     void get_target_info(const char *name, const char **url,
                         int *limit_bw, int *limit_pdu, int *limit_req,
                         int *target_idletime, int *client_idletime,
                         int *max_clients,
                         int *keepalive_limit_bw, int *keepalive_limit_pdu,
-                        int *pre_init, int *log_mask);
+                        int *pre_init);
 
     int check_query(ODR odr, const char *name, Z_Query *query, char **addinfo);
     int check_syntax(ODR odr, const char *name,
@@ -56,13 +59,14 @@ public:
 private:
     void operator=(const Yaz_ProxyConfig &conf);
 #if HAVE_XML2
+    int mycmp(const char *hay, const char *item, int len);
     xmlDocPtr m_docPtr;
     xmlNodePtr m_proxyPtr;
     void return_target_info(xmlNodePtr ptr, const char **url,
                            int *limit_bw, int *limit_pdu, int *limit_req,
                            int *target_idletime, int *client_idletime,
                            int *keepalive_limit_bw, int *keepalive_limit_pdu,
-                           int *pre_init, int *log_mask);
+                           int *pre_init);
     void return_limit(xmlNodePtr ptr,
                      int *limit_bw, int *limit_pdu, int *limit_req);
     int check_type_1(ODR odr, xmlNodePtr ptr, Z_RPNQuery *query,
@@ -173,6 +177,7 @@ class YAZ_EXPORT Yaz_Proxy : public Yaz_Z_Assoc {
     Yaz_Proxy *m_parent;
     int m_seqno;
     int m_max_clients;
+    int m_log_mask;
     int m_keepalive_limit_bw;
     int m_keepalive_limit_pdu;
     int m_client_idletime;
@@ -233,5 +238,6 @@ class YAZ_EXPORT Yaz_Proxy : public Yaz_Z_Assoc {
     int send_to_client(Z_APDU *apdu);
     void server(const char *addr);
     void pre_init();
+    int get_log_mask() { return m_log_mask; };
 };
 
index 13f57fe..4a2b4d4 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (c) 1998-2000, Index Data.
  * See the file LICENSE for details.
  * 
- * $Id: z-assoc.h,v 1.3 2003-10-10 12:37:26 adam Exp $
+ * $Id: z-assoc.h,v 1.4 2003-10-16 16:10:43 adam Exp $
  */
 
 #ifndef YAZ_Z_ASSOC_INCLUDED
@@ -80,6 +80,8 @@ class YAZ_EXPORT Yaz_Z_Assoc : public IYaz_PDU_Observer {
 
     const char *get_hostname();
 
+    int set_APDU_yazlog(int v);
+
  private:
     static int yaz_init_flag;
     static int yaz_init_func();
@@ -91,6 +93,7 @@ class YAZ_EXPORT Yaz_Z_Assoc : public IYaz_PDU_Observer {
     FILE *m_APDU_file;
     char *m_APDU_fname;
     char *m_hostname;
+    int m_APDU_yazlog;
 };
 
 #endif
index 38dbf36..4d4b08e 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<!-- $Id: config.xml,v 1.11 2003-10-14 13:48:26 adam Exp $ -->
+<!-- $Id: config.xml,v 1.12 2003-10-16 16:10:43 adam Exp $ -->
 <proxy>
   <target default="1" name="voyager">
     <!-- default target -->
@@ -21,7 +21,7 @@
     <syntax type="usmarc"/>
     <syntax type="xml" marcxml="1"/>
     <syntax type="*" error="238"/>
-    <preinit>2</preinit>
+    <preinit>0</preinit>
   </target>
   <target name="localhost">
     <url>localhost:9999</url>
@@ -44,4 +44,5 @@
     <!-- everything else -->
   </target>
   <max-clients>500</max-clients>
+  <xlog>client-apdu server-apdu</xlog>
 </proxy>
index 50ebbe7..2eec370 100644 (file)
@@ -1,8 +1,8 @@
 /*
- * Copyright (c) 1998-2001, Index Data.
+ * Copyright (c) 1998-2003, Index Data.
  * See the file LICENSE for details.
  * 
- * $Id: yaz-pdu-assoc.cpp,v 1.33 2003-10-10 12:37:26 adam Exp $
+ * $Id: yaz-pdu-assoc.cpp,v 1.34 2003-10-16 16:10:43 adam Exp $
  */
 
 #include <assert.h>
index 2d5d22e..9306899 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (c) 1998-2003, Index Data.
  * See the file LICENSE for details.
  * 
- * $Id: yaz-proxy-config.cpp,v 1.10 2003-10-16 13:40:41 adam Exp $
+ * $Id: yaz-proxy-config.cpp,v 1.11 2003-10-16 16:10:43 adam Exp $
  */
 
 #include <ctype.h>
@@ -117,8 +117,7 @@ void Yaz_ProxyConfig::return_target_info(xmlNodePtr ptr,
                                         int *client_idletime,
                                         int *keepalive_limit_bw,
                                         int *keepalive_limit_pdu,
-                                        int *pre_init,
-                                        int *log_mask)
+                                        int *pre_init)
 {
     *pre_init = 0;
     int no_url = 0;
@@ -126,30 +125,6 @@ void Yaz_ProxyConfig::return_target_info(xmlNodePtr ptr,
     for (; ptr; ptr = ptr->next)
     {
        if (ptr->type == XML_ELEMENT_NODE 
-           && !strcmp((const char *) ptr->name, "log"))
-       {
-           const char *v = get_text(ptr);
-           *log_mask = 0;
-           while (v && *v)
-           {
-               const char *cp = v;
-               while (*cp && *cp != ',' && !isspace(*cp))
-                   cp++;
-               size_t len = cp - v;
-               if (len == 4 && !memcmp(v, "apdu", 4))
-                   *log_mask |= PROXY_LOG_APDU;
-               if (len == 3 && !memcmp(v, "req", 3))
-                   *log_mask |= PROXY_LOG_REQ;
-               if (isdigit(*v))
-                   *log_mask |= atoi(v);
-               if (*cp == ',')
-                   cp++;
-               while (*cp && isspace(*cp))
-                   cp++;
-               v = cp;
-           }
-       }
-       if (ptr->type == XML_ELEMENT_NODE 
            && !strcmp((const char *) ptr->name, "preinit"))
        {
            const char *v = get_text(ptr);
@@ -488,8 +463,7 @@ int Yaz_ProxyConfig::get_target_no(int no,
                                   int *max_clients,
                                   int *keepalive_limit_bw,
                                   int *keepalive_limit_pdu,
-                                  int *pre_init,
-                                  int *log_mask)
+                                  int *pre_init)
 {
 #if HAVE_XML2
     xmlNodePtr ptr;
@@ -514,7 +488,7 @@ int Yaz_ProxyConfig::get_target_no(int no,
                return_target_info(ptr, url, limit_bw, limit_pdu, limit_req,
                                   target_idletime, client_idletime,
                                   keepalive_limit_bw, keepalive_limit_pdu,
-                                  pre_init, log_mask);
+                                  pre_init);
                return 1;
            }
            i++;
@@ -523,6 +497,65 @@ int Yaz_ProxyConfig::get_target_no(int no,
     return 0;
 }
 
+int Yaz_ProxyConfig::mycmp(const char *hay, const char *item, int len)
+{
+    if (len == strlen(item) && memcmp(hay, item, len) == 0)
+       return 1;
+    return 0;
+}
+
+void Yaz_ProxyConfig::get_generic_info(int *log_mask,
+                                      int *max_clients)
+{
+#if HAVE_XML2
+    xmlNodePtr ptr;
+    if (!m_proxyPtr)
+       return;
+    for (ptr = m_proxyPtr->children; ptr; ptr = ptr->next)
+    {
+       if (ptr->type == XML_ELEMENT_NODE 
+           && !strcmp((const char *) ptr->name, "log"))
+       {
+           const char *v = get_text(ptr);
+           *log_mask = 0;
+           while (v && *v)
+           {
+               const char *cp = v;
+               while (*cp && *cp != ',' && !isspace(*cp))
+                   cp++;
+               size_t len = cp - v;
+               if (mycmp(v, "client-apdu", len))
+                   *log_mask |= PROXY_LOG_APDU_CLIENT;
+               if (mycmp(v, "server-apdu", len))
+                   *log_mask |= PROXY_LOG_APDU_SERVER;
+               if (mycmp(v, "client-requests", len))
+                   *log_mask |= PROXY_LOG_REQ_CLIENT;
+               if (mycmp(v, "server-requests", len))
+                   *log_mask |= PROXY_LOG_REQ_SERVER;
+               if (isdigit(*v))
+                   *log_mask |= atoi(v);
+               if (*cp == ',')
+                   cp++;
+               while (*cp && isspace(*cp))
+                   cp++;
+               v = cp;
+           }
+       }
+       if (ptr->type == XML_ELEMENT_NODE &&
+           !strcmp((const char *) ptr->name, "max-clients"))
+       {
+           const char *t = get_text(ptr);
+           if (t)
+           {
+               *max_clients = atoi(t);
+               if (*max_clients  < 1)
+                   *max_clients = 1;
+           }
+       }
+    }
+#endif
+}
+
 void Yaz_ProxyConfig::get_target_info(const char *name,
                                      const char **url,
                                      int *limit_bw,
@@ -533,8 +566,7 @@ void Yaz_ProxyConfig::get_target_info(const char *name,
                                      int *max_clients,
                                      int *keepalive_limit_bw,
                                      int *keepalive_limit_pdu,
-                                     int *pre_init,
-                                     int *log_mask)
+                                     int *pre_init)
 {
 #if HAVE_XML2
     xmlNodePtr ptr;
@@ -570,7 +602,7 @@ void Yaz_ProxyConfig::get_target_info(const char *name,
        return_target_info(ptr, url, limit_bw, limit_pdu, limit_req,
                           target_idletime, client_idletime,
                           keepalive_limit_bw, keepalive_limit_pdu,
-                          pre_init, log_mask);
+                          pre_init);
     }
 #else
     *url = name;
index 921d8e5..5f323b7 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (c) 1998-2003, Index Data.
  * See the file LICENSE for details.
  * 
- * $Id: yaz-proxy.cpp,v 1.61 2003-10-16 13:40:41 adam Exp $
+ * $Id: yaz-proxy.cpp,v 1.62 2003-10-16 16:10:43 adam Exp $
  */
 
 #include <assert.h>
@@ -67,11 +67,12 @@ Yaz_Proxy::Yaz_Proxy(IYaz_PDU_Observable *the_PDU_Observable,
     m_default_target = 0;
     m_proxy_authentication = 0;
     m_max_clients = 150;
+    m_log_mask = 0;
     m_seed = time(0);
     m_client_idletime = 600;
     m_target_idletime = 600;
     m_optimize = xstrdup ("1");
-    strcpy(m_session_str, "x");
+    strcpy(m_session_str, "0");
     m_session_no=0;
     m_bytes_sent = m_bytes_recv = 0;
     m_bw_hold_PDU = 0;
@@ -104,6 +105,8 @@ int Yaz_Proxy::set_config(const char *config)
     xfree(m_config_fname);
     m_config_fname = xstrdup(config);
     int r = m_config->read_xml(config);
+    if (!r)
+       m_config->get_generic_info(&m_log_mask, &m_max_clients);
     return r;
 }
 
@@ -139,6 +142,11 @@ Yaz_ProxyConfig *Yaz_Proxy::check_reconfigure()
            int r = cfg->read_xml(m_config_fname);
            if (r)
                yaz_log(LOG_WARN, "reconfigure failed");
+           else
+           {
+               m_log_mask = 0;
+               cfg->get_generic_info(&m_log_mask, &m_max_clients);
+           }
        }
        else
            yaz_log(LOG_LOG, "reconfigure");
@@ -157,7 +165,13 @@ IYaz_PDU_Observer *Yaz_Proxy::sessionNotify(IYaz_PDU_Observable
     new_proxy->timeout(m_client_idletime);
     new_proxy->m_target_idletime = m_target_idletime;
     new_proxy->set_default_target(m_default_target);
+    new_proxy->m_max_clients = m_max_clients;
+    new_proxy->m_log_mask = m_log_mask;
     new_proxy->set_APDU_log(get_APDU_log());
+    if (m_log_mask & PROXY_LOG_APDU_CLIENT)
+       new_proxy->set_APDU_yazlog(1);
+    else
+       new_proxy->set_APDU_yazlog(0);
     new_proxy->set_proxy_authentication(m_proxy_authentication);
     sprintf(new_proxy->m_session_str, "%ld:%d ", (long) time(0), m_session_no);
     m_session_no++;
@@ -254,14 +268,13 @@ Yaz_ProxyClient *Yaz_Proxy::get_client(Z_APDU *apdu)
        if (cfg)
        {
            int pre_init = 0;
-           int log_mask = 0;
            cfg->get_target_info(proxy_host, url, &m_bw_max,
                                 &m_pdu_max, &m_max_record_retrieve,
                                 &m_target_idletime, &client_idletime,
                                 &parent->m_max_clients,
                                 &m_keepalive_limit_bw,
                                 &m_keepalive_limit_pdu,
-                                &pre_init, &log_mask);
+                                &pre_init);
        }
        if (client_idletime != -1)
        {
@@ -282,9 +295,7 @@ Yaz_ProxyClient *Yaz_Proxy::get_client(Z_APDU *apdu)
            m_proxyTarget = (char*) xstrdup(load_balance(url));
     }
     if (cookie && *cookie)
-    {
-       Yaz_ProxyClient *cc = 0;
-       
+    {   // search in sessions with a cookie
        for (c = parent->m_clientPool; c; c = c->m_next)
        {
            assert (c->m_prev);
@@ -292,50 +303,44 @@ Yaz_ProxyClient *Yaz_Proxy::get_client(Z_APDU *apdu)
            if (c->m_cookie && !strcmp(cookie,c->m_cookie) &&
                !strcmp(m_proxyTarget, c->get_hostname()))
            {
-               cc = c;
-           }
-       }
-       if (cc)
-       {
-           // found it in cache
-           c = cc;
-           // The following handles "cancel"
-           // If connection is busy (waiting for PDU) and
-           // we have an initRequest we can safely do re-open
-           if (c->m_waiting && apdu->which == Z_APDU_initRequest)
-           {
-               yaz_log (LOG_LOG, "%s REOPEN target=%s", m_session_str,
-                        c->get_hostname());
-               c->close();
-               c->m_init_flag = 0;
-
-               c->m_last_ok = 0;
-               c->m_cache.clear();
-               c->m_last_resultCount = 0;
-               c->m_sr_transform = 0;
-               c->m_waiting = 0;
-               c->m_resultSetStartPoint = 0;
-               c->m_target_idletime = m_target_idletime;
-               if (c->client(m_proxyTarget))
+               // Found it in cache
+               // The following handles "cancel"
+               // If connection is busy (waiting for PDU) and
+               // we have an initRequest we can safely do re-open
+               if (c->m_waiting && apdu->which == Z_APDU_initRequest)
                {
-                   delete c;
-                   return 0;
+                   yaz_log (LOG_LOG, "%s REOPEN target=%s", m_session_str,
+                            c->get_hostname());
+                   c->close();
+                   c->m_init_flag = 0;
+                   
+                   c->m_last_ok = 0;
+                   c->m_cache.clear();
+                   c->m_last_resultCount = 0;
+                   c->m_sr_transform = 0;
+                   c->m_waiting = 0;
+                   c->m_resultSetStartPoint = 0;
+                   c->m_target_idletime = m_target_idletime;
+                   if (c->client(m_proxyTarget))
+                   {
+                       delete c;
+                       return 0;
+                   }
+                   c->timeout(30); 
                }
-               c->timeout(30); 
+               c->m_seqno = parent->m_seqno;
+               if (c->m_server && c->m_server != this)
+                   c->m_server->m_client = 0;
+               c->m_server = this;
+               (parent->m_seqno)++;
+               yaz_log (LOG_DEBUG, "get_client 1 %p %p", this, c);
+               return c;
            }
-           c->m_seqno = parent->m_seqno;
-           if (c->m_server && c->m_server != this)
-               c->m_server->m_client = 0;
-           c->m_server = this;
-           (parent->m_seqno)++;
-           yaz_log (LOG_DEBUG, "get_client 1 %p %p", this, c);
-           return c;
        }
     }
     else if (!c)
     {
-       Yaz_ProxyClient *cc = 0;
-       
+       // don't have a client session yet. Search in session w/o cookie
        for (c = parent->m_clientPool; c; c = c->m_next)
        {
            assert (c->m_prev);
@@ -344,27 +349,26 @@ Yaz_ProxyClient *Yaz_Proxy::get_client(Z_APDU *apdu)
                c->m_waiting == 0 &&
                !strcmp(m_proxyTarget, c->get_hostname()))
            {
-               cc = c;
-           }
-       }
-       if (cc)
-       {
-           // found it in cache
-           c = cc;
-
-           yaz_log (LOG_LOG, "%sREUSE %d %d %s",
-                    m_session_str,
-                    c->m_seqno, parent->m_seqno, c->get_hostname());
-
-           c->m_seqno = parent->m_seqno;
-           assert(c->m_server == 0);
-           c->m_server = this;
-           
-           (parent->m_seqno)++;
+               // found it in cache
+               yaz_log (LOG_LOG, "%sREUSE %d %d %s",
+                        m_session_str,
+                        c->m_seqno, parent->m_seqno, c->get_hostname());
+               
+               c->m_seqno = parent->m_seqno;
+               assert(c->m_server == 0);
+               c->m_server = this;
 
-           parent->pre_init();
+               if (parent->m_log_mask & PROXY_LOG_APDU_SERVER)
+                   c->set_APDU_yazlog(1);
+               else
+                   c->set_APDU_yazlog(0);
 
-           return c;
+               (parent->m_seqno)++;
+               
+               parent->pre_init();
+               
+               return c;
+           }
        }
     }
     if (!m_client)
@@ -438,6 +442,12 @@ Yaz_ProxyClient *Yaz_Proxy::get_client(Z_APDU *apdu)
                (parent->m_seqno)++;
                c->m_target_idletime = m_target_idletime;
                c->timeout(m_target_idletime);
+               
+               if (parent->m_log_mask & PROXY_LOG_APDU_SERVER)
+                   c->set_APDU_yazlog(1);
+               else
+                   c->set_APDU_yazlog(0);
+
                return c;
            }
        }
@@ -475,6 +485,10 @@ Yaz_ProxyClient *Yaz_Proxy::get_client(Z_APDU *apdu)
        c->m_target_idletime = m_target_idletime;
        c->timeout(30);
 
+       if (parent->m_log_mask & PROXY_LOG_APDU_SERVER)
+           c->set_APDU_yazlog(1);
+       else
+           c->set_APDU_yazlog(0);
     }
     yaz_log (LOG_DEBUG, "get_client 3 %p %p", this, c);
     return c;
@@ -621,8 +635,9 @@ int Yaz_Proxy::send_to_client(Z_APDU *apdu)
            convert_to_marcxml(p->u.databaseOrSurDiagnostics);
     }
     int r = send_Z_PDU(apdu, &len);
-    yaz_log (LOG_DEBUG, "%sSending %s to client %d bytes", m_session_str,
-            apdu_name(apdu), len);
+    if (m_log_mask & PROXY_LOG_APDU_CLIENT)
+       yaz_log (LOG_DEBUG, "%sSending %s to client %d bytes", m_session_str,
+                apdu_name(apdu), len);
     m_bytes_sent += len;
     m_bw_stat.add_bytes(len);
     return r;
@@ -632,9 +647,10 @@ int Yaz_ProxyClient::send_to_target(Z_APDU *apdu)
 {
     int len = 0;
     int r = send_Z_PDU(apdu, &len);
-    yaz_log (LOG_LOG, "%sSending %s to %s %d bytes",
-            get_session_str(),
-            apdu_name(apdu), get_hostname(), len);
+    if (m_root->get_log_mask() & PROXY_LOG_REQ_SERVER)
+       yaz_log (LOG_LOG, "%sSending %s to %s %d bytes",
+                get_session_str(),
+                apdu_name(apdu), get_hostname(), len);
     m_bytes_sent += len;
     return r;
 }
@@ -877,8 +893,9 @@ void Yaz_Proxy::recv_Z_PDU(Z_APDU *apdu, int len)
     int reduce = 0;
     m_bytes_recv += len;
     
-    yaz_log (LOG_DEBUG, "%sReceiving %s from client %d bytes", m_session_str,
-            apdu_name(apdu), len);
+    if (m_log_mask & PROXY_LOG_APDU_CLIENT)
+       yaz_log (LOG_DEBUG, "%sReceiving %s from client %d bytes",
+                m_session_str, apdu_name(apdu), len);
 
     if (m_bw_hold_PDU)     // double incoming PDU. shutdown now.
        shutdown();
@@ -1279,19 +1296,23 @@ void Yaz_Proxy::pre_init()
     int max_clients;
     int keepalive_limit_bw, keepalive_limit_pdu;
     int pre_init;
-    int log_mask = 0;
 
     Yaz_ProxyConfig *cfg = check_reconfigure();
 
-    yaz_log(LOG_LOG, "pre_init");
     zurl_in_use[0] = 0;
+
+    if (m_log_mask & PROXY_LOG_APDU_CLIENT)
+       set_APDU_yazlog(1);
+    else
+       set_APDU_yazlog(0);
+
     for (i = 0; cfg && cfg->get_target_no(i, &name, zurl_in_use,
                                          &limit_bw, &limit_pdu, &limit_req,
                                          &target_idletime, &client_idletime,
                                          &max_clients, 
                                          &keepalive_limit_bw,
                                          &keepalive_limit_pdu,
-                                         &pre_init, &log_mask) ; i++)
+                                         &pre_init) ; i++)
     {
        if (pre_init)
        {
@@ -1306,7 +1327,8 @@ void Yaz_Proxy::pre_init()
                        && c->m_server == 0 && c->m_cookie == 0)
                        spare++;
                }
-               yaz_log(LOG_LOG, "pre_init %s %s spare=%d pre_init=%d",
+               yaz_log(LOG_LOG, "%s pre-init %s %s spare=%d pre_init=%d",
+                       m_session_str,
                        name, zurl_in_use[j], spare, pre_init);
                if (spare < pre_init)
                {
@@ -1317,6 +1339,11 @@ void Yaz_Proxy::pre_init()
                    m_clientPool = c;
                    c->m_prev = &m_clientPool;
                    
+                   if (m_log_mask & PROXY_LOG_APDU_SERVER)
+                       c->set_APDU_yazlog(1);
+                   else
+                       c->set_APDU_yazlog(0);
+
                    if (c->client(zurl_in_use[j]))
                    {
                        timeout(60);
@@ -1326,8 +1353,6 @@ void Yaz_Proxy::pre_init()
                    c->timeout(30);
                    c->m_waiting = 1;
                    c->m_target_idletime = target_idletime;
-                   yaz_log(LOG_LOG, "pre_init name=%s zurl=%s timeout=%d", name,
-                           zurl_in_use[j], target_idletime);
                    c->m_seqno = m_seqno++;
                }
            }
@@ -1410,8 +1435,9 @@ void Yaz_ProxyClient::recv_Z_PDU(Z_APDU *apdu, int len)
     m_bytes_recv += len;
     m_pdu_recv++;
     m_waiting = 0;
-    yaz_log (LOG_LOG, "%sReceiving %s from %s %d bytes", get_session_str(),
-            apdu_name(apdu), get_hostname(), len);
+    if (m_root->get_log_mask() & PROXY_LOG_REQ_SERVER)
+       yaz_log (LOG_LOG, "%sReceiving %s from %s %d bytes", get_session_str(),
+                apdu_name(apdu), get_hostname(), len);
     if (apdu->which == Z_APDU_initResponse)
     {
        if (!m_server)  // if this is a pre init session , check for more
index 1990698..08e1976 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (c) 1998-2001, Index Data.
  * See the file LICENSE for details.
  * 
- * $Id: yaz-z-assoc.cpp,v 1.27 2003-10-10 12:37:26 adam Exp $
+ * $Id: yaz-z-assoc.cpp,v 1.28 2003-10-16 16:10:43 adam Exp $
  */
 
 #include <assert.h>
@@ -32,6 +32,7 @@ Yaz_Z_Assoc::Yaz_Z_Assoc(IYaz_PDU_Observable *the_PDU_Observable)
     m_APDU_file = 0;
     m_APDU_fname = 0;
     m_hostname = 0;
+    m_APDU_yazlog = 0;
 }
 
 void Yaz_Z_Assoc::set_APDU_log(const char *fname)
@@ -48,14 +49,22 @@ void Yaz_Z_Assoc::set_APDU_log(const char *fname)
     {
        m_APDU_fname = new char[strlen(fname)+1];
        strcpy (m_APDU_fname, fname);
-       if (*fname && strcmp(fname, "-"))
-           m_APDU_file = fopen (fname, "a");
-       else
+       if (!strcmp(fname, "-"))
            m_APDU_file = stderr;
+       else if (*fname == '\0')
+           m_APDU_file = 0;
+       else
+           m_APDU_file = fopen (fname, "a");
        odr_setprint(m_odr_print, m_APDU_file);
     }
 }
 
+int Yaz_Z_Assoc::set_APDU_yazlog(int v)
+{
+    int old = m_APDU_yazlog;
+    m_APDU_yazlog = v;
+}
+
 const char *Yaz_Z_Assoc::get_APDU_log()
 {
     return m_APDU_fname;
@@ -200,6 +209,14 @@ Z_APDU *Yaz_Z_Assoc::decode_Z_PDU(const char *buf, int len)
     }
     else
     {
+       if (m_APDU_yazlog)
+       {   // use YAZ log FILE
+           FILE *save = m_APDU_file;
+
+           odr_setprint(m_odr_print, yaz_log_file());
+           z_APDU(m_odr_print, &apdu, 0, "decode");
+           m_APDU_file = save;
+       }
        if (m_APDU_file)
         {
            z_APDU(m_odr_print, &apdu, 0, "decode");
@@ -211,6 +228,13 @@ Z_APDU *Yaz_Z_Assoc::decode_Z_PDU(const char *buf, int len)
 
 int Yaz_Z_Assoc::encode_Z_PDU(Z_APDU *apdu, char **buf, int *len)
 {
+    if (m_APDU_yazlog)
+    {
+       FILE *save = m_APDU_file;
+       odr_setprint(m_odr_print, yaz_log_file()); // use YAZ log FILE
+       z_APDU(m_odr_print, &apdu, 0, "encode");
+       m_APDU_file = save;
+    }
     if (m_APDU_file)
     {
        z_APDU(m_odr_print, &apdu, 0, "encode");