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>
<?xml version="1.0"?>
- <!-- $Id -->
<proxy>
<target name="server1" default="1">
<!-- description of server1 .. -->
<screen>
<proxy>
<target name="mytarget">
- <syntax type="usmarc"/>
- <syntax type="xml" marcxml="1"/>
- <syntax type="*" error="238"/>
+ <syntax type="usmarc"/>
+ <syntax type="xml" marcxml="1"/>
+ <syntax type="*" error="238"/>
</target>
</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>
<!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>
<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>
* 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>
#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;
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,
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,
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;
int send_to_client(Z_APDU *apdu);
void server(const char *addr);
void pre_init();
+ int get_log_mask() { return m_log_mask; };
};
* 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
const char *get_hostname();
+ int set_APDU_yazlog(int v);
+
private:
static int yaz_init_flag;
static int yaz_init_func();
FILE *m_APDU_file;
char *m_APDU_fname;
char *m_hostname;
+ int m_APDU_yazlog;
};
#endif
<?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 -->
<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>
<!-- everything else -->
</target>
<max-clients>500</max-clients>
+ <xlog>client-apdu server-apdu</xlog>
</proxy>
/*
- * 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>
* 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>
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;
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);
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;
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++;
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,
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;
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;
* 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>
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;
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;
}
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");
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++;
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)
{
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);
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);
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)
(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;
}
}
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;
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;
{
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;
}
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();
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)
{
&& 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)
{
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);
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++;
}
}
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
* 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>
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)
{
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;
}
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");
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");