RSSClient: make debug log runtime configurable
authorWilfried Goesgens <dothebart@citadel.org>
Sat, 28 Apr 2012 16:03:05 +0000 (18:03 +0200)
committerWilfried Goesgens <dothebart@citadel.org>
Sat, 28 Apr 2012 16:03:05 +0000 (18:03 +0200)
citadel/modules/rssclient/rss_atom_parser.c
citadel/modules/rssclient/serv_rssclient.c

index 610dd2b959ba18d329e0fa0292404184ea711a2e..0c7290b5cc0857ce856d43a2ce614ca2eedb11aa 100644 (file)
 
 void rss_save_item(rss_item *ri, rss_aggregator *Cfg);
 
+int RSSAtomParserDebugEnabled = 0;
+
+#define N ((rss_aggregator*)IO->Data)->QRnumber
+
+#define DBGLOG(LEVEL) if ((LEVEL != LOG_DEBUG) || (RSSAtomParserDebugEnabled != 0))
+
+#define EVRSSATOM_syslog(LEVEL, FORMAT, ...)                           \
+       DBGLOG(LEVEL) syslog(LEVEL,                                     \
+                            "IO[%ld]CC[%d][%ld]RSSP" FORMAT,           \
+                            IO->ID, CCID, N, __VA_ARGS__)
+
+#define EVRSSATOMM_syslog(LEVEL, FORMAT)                               \
+       DBGLOG(LEVEL) syslog(LEVEL,                                     \
+                            "IO[%ld]CC[%d][%ld]RSSP" FORMAT,           \
+                            IO->ID, CCID, N)
+
+#define EVRSSATOMCS_syslog(LEVEL, FORMAT, ...)                 \
+       DBGLOG(LEVEL) syslog(LEVEL, "IO[%ld][%ld]RSSP" FORMAT,  \
+                            IO->ID, N, __VA_ARGS__)
+
+#define EVRSSATOMSM_syslog(LEVEL, FORMAT)                      \
+       DBGLOG(LEVEL) syslog(LEVEL, "IO[%ld][%ld]RSSP" FORMAT,  \
+                            IO->ID, N)
 
 /*
  * Convert an RDF/RSS datestamp into a time_t
@@ -126,35 +149,38 @@ void flush_rss_item(rss_item *ri)
 
 void RSS_item_rss_start (StrBuf *CData,
                         rss_item *ri,
-                        rss_aggregator *Cfg,
+                        rss_aggregator *RSSAggr,
                         const char** Attr)
 {
-       syslog(LOG_DEBUG, "RSS: This is an RSS feed.\n");
-       Cfg->ItemType = RSS_RSS;
+       AsyncIO         *IO = &RSSAggr->IO;
+       EVRSSATOMM_syslog(LOG_DEBUG, "RSS: This is an RSS feed.\n");
+       RSSAggr->ItemType = RSS_RSS;
 }
 
 void RSS_item_rdf_start(StrBuf *CData,
                        rss_item *ri,
-                       rss_aggregator *Cfg,
+                       rss_aggregator *RSSAggr,
                        const char** Attr)
 {
-       syslog(LOG_DEBUG, "RSS: This is an RDF feed.\n");
-       Cfg->ItemType = RSS_RSS;
+       AsyncIO         *IO = &RSSAggr->IO;
+       EVRSSATOMM_syslog(LOG_DEBUG, "RSS: This is an RDF feed.\n");
+       RSSAggr->ItemType = RSS_RSS;
 }
 
 void ATOM_item_feed_start(StrBuf *CData,
                          rss_item *ri,
-                         rss_aggregator *Cfg,
+                         rss_aggregator *RSSAggr,
                          const char** Attr)
 {
-       syslog(LOG_DEBUG, "RSS: This is an ATOM feed.\n");
-       Cfg->ItemType = RSS_ATOM;
+       AsyncIO         *IO = &RSSAggr->IO;
+       EVRSSATOMM_syslog(LOG_DEBUG, "RSS: This is an ATOM feed.\n");
+       RSSAggr->ItemType = RSS_ATOM;
 }
 
 
 void RSS_item_item_start(StrBuf *CData,
                         rss_item *ri,
-                        rss_aggregator *Cfg,
+                        rss_aggregator *RSSAggr,
                         const char** Attr)
 {
        ri->item_tag_nesting ++;
@@ -163,7 +189,7 @@ void RSS_item_item_start(StrBuf *CData,
 
 void ATOM_item_entry_start(StrBuf *CData,
                           rss_item *ri,
-                          rss_aggregator *Cfg,
+                          rss_aggregator *RSSAggr,
                           const char** Attr)
 {
 /* Atom feed... */
@@ -173,7 +199,7 @@ void ATOM_item_entry_start(StrBuf *CData,
 
 void ATOM_item_link_start (StrBuf *CData,
                           rss_item *ri,
-                          rss_aggregator *Cfg,
+                          rss_aggregator *RSSAggr,
                           const char** Attr)
 {
        int i;
@@ -256,7 +282,7 @@ void ATOM_item_link_start (StrBuf *CData,
 
 void ATOMRSS_item_title_end(StrBuf *CData,
                            rss_item *ri,
-                           rss_aggregator *Cfg,
+                           rss_aggregator *RSSAggr,
                            const char** Attr)
 {
        if ((ri->item_tag_nesting == 0) && (StrLength(CData) > 0)) {
@@ -267,7 +293,7 @@ void ATOMRSS_item_title_end(StrBuf *CData,
 
 void RSS_item_guid_end(StrBuf *CData,
                       rss_item *ri,
-                      rss_aggregator *Cfg,
+                      rss_aggregator *RSSAggr,
                       const char** Attr)
 {
        if (StrLength(CData) > 0) {
@@ -276,7 +302,7 @@ void RSS_item_guid_end(StrBuf *CData,
 }
 
 void ATOM_item_id_end(StrBuf *CData,
-                     rss_item *ri, rss_aggregator *Cfg, const char** Attr)
+                     rss_item *ri, rss_aggregator *RSSAggr, const char** Attr)
 {
        if (StrLength(CData) > 0) {
                NewStrBufDupAppendFlush(&ri->guid, CData, NULL, 0);
@@ -286,7 +312,7 @@ void ATOM_item_id_end(StrBuf *CData,
 
 void RSS_item_link_end (StrBuf *CData,
                        rss_item *ri,
-                       rss_aggregator *Cfg,
+                       rss_aggregator *RSSAggr,
                        const char** Attr)
 {
        if (StrLength(CData) > 0) {
@@ -296,7 +322,7 @@ void RSS_item_link_end (StrBuf *CData,
 }
 void RSS_item_relink_end(StrBuf *CData,
                         rss_item *ri,
-                        rss_aggregator *Cfg,
+                        rss_aggregator *RSSAggr,
                         const char** Attr)
 {
        if (StrLength(CData) > 0) {
@@ -307,7 +333,7 @@ void RSS_item_relink_end(StrBuf *CData,
 
 void RSSATOM_item_title_end (StrBuf *CData,
                             rss_item *ri,
-                            rss_aggregator *Cfg,
+                            rss_aggregator *RSSAggr,
                             const char** Attr)
 {
        if (StrLength(CData) > 0) {
@@ -318,7 +344,7 @@ void RSSATOM_item_title_end (StrBuf *CData,
 
 void ATOM_item_content_end (StrBuf *CData,
                            rss_item *ri,
-                           rss_aggregator *Cfg,
+                           rss_aggregator *RSSAggr,
                            const char** Attr)
 {
        long olen = StrLength (ri->description);
@@ -345,7 +371,7 @@ void ATOM_item_content_end (StrBuf *CData,
 }
 void ATOM_item_summary_end (StrBuf *CData,
                            rss_item *ri,
-                           rss_aggregator *Cfg,
+                           rss_aggregator *RSSAggr,
                            const char** Attr)
 {
        /*
@@ -361,7 +387,7 @@ void ATOM_item_summary_end (StrBuf *CData,
 
 void RSS_item_description_end (StrBuf *CData,
                               rss_item *ri,
-                              rss_aggregator *Cfg,
+                              rss_aggregator *RSSAggr,
                               const char** Attr)
 {
        long olen = StrLength (ri->description);
@@ -388,7 +414,7 @@ void RSS_item_description_end (StrBuf *CData,
 
 void ATOM_item_published_end (StrBuf *CData,
                              rss_item *ri,
-                             rss_aggregator *Cfg,
+                             rss_aggregator *RSSAggr,
                              const char** Attr)
 {
        if (StrLength(CData) > 0) {
@@ -399,7 +425,7 @@ void ATOM_item_published_end (StrBuf *CData,
 
 void ATOM_item_updated_end (StrBuf *CData,
                            rss_item *ri,
-                           rss_aggregator *Cfg,
+                           rss_aggregator *RSSAggr,
                            const char** Attr)
 {
        if (StrLength(CData) > 0) {
@@ -410,7 +436,7 @@ void ATOM_item_updated_end (StrBuf *CData,
 
 void RSS_item_pubdate_end (StrBuf *CData,
                           rss_item *ri,
-                          rss_aggregator *Cfg,
+                          rss_aggregator *RSSAggr,
                           const char** Attr)
 {
        if (StrLength(CData) > 0) {
@@ -422,7 +448,7 @@ void RSS_item_pubdate_end (StrBuf *CData,
 
 void RSS_item_date_end (StrBuf *CData,
                        rss_item *ri,
-                       rss_aggregator *Cfg,
+                       rss_aggregator *RSSAggr,
                        const char** Attr)
 {
        if (StrLength(CData) > 0) {
@@ -435,7 +461,7 @@ void RSS_item_date_end (StrBuf *CData,
 
 void RSS_item_author_end(StrBuf *CData,
                         rss_item *ri,
-                        rss_aggregator *Cfg,
+                        rss_aggregator *RSSAggr,
                         const char** Attr)
 {
        if (StrLength(CData) > 0) {
@@ -447,7 +473,7 @@ void RSS_item_author_end(StrBuf *CData,
 
 void ATOM_item_name_end(StrBuf *CData,
                        rss_item *ri,
-                       rss_aggregator *Cfg,
+                       rss_aggregator *RSSAggr,
                        const char** Attr)
 {
        if (StrLength(CData) > 0) {
@@ -458,7 +484,7 @@ void ATOM_item_name_end(StrBuf *CData,
 
 void ATOM_item_email_end(StrBuf *CData,
                         rss_item *ri,
-                        rss_aggregator *Cfg,
+                        rss_aggregator *RSSAggr,
                         const char** Attr)
 {
        if (StrLength(CData) > 0) {
@@ -469,7 +495,7 @@ void ATOM_item_email_end(StrBuf *CData,
 
 void RSS_item_creator_end(StrBuf *CData,
                          rss_item *ri,
-                         rss_aggregator *Cfg,
+                         rss_aggregator *RSSAggr,
                          const char** Attr)
 {
        if ((StrLength(CData) > 0) &&
@@ -483,7 +509,7 @@ void RSS_item_creator_end(StrBuf *CData,
 
 void ATOM_item_uri_end(StrBuf *CData,
                       rss_item *ri,
-                      rss_aggregator *Cfg,
+                      rss_aggregator *RSSAggr,
                       const char** Attr)
 {
        if (StrLength(CData) > 0) {
@@ -494,45 +520,47 @@ void ATOM_item_uri_end(StrBuf *CData,
 
 void RSS_item_item_end(StrBuf *CData,
                       rss_item *ri,
-                      rss_aggregator *Cfg,
+                      rss_aggregator *RSSAggr,
                       const char** Attr)
 {
        --ri->item_tag_nesting;
-       rss_save_item(ri, Cfg);
+       rss_save_item(ri, RSSAggr);
 }
 
 
 void ATOM_item_entry_end(StrBuf *CData,
                         rss_item *ri,
-                        rss_aggregator *Cfg,
+                        rss_aggregator *RSSAggr,
                         const char** Attr)
 {
        --ri->item_tag_nesting;
-       rss_save_item(ri, Cfg);
+       rss_save_item(ri, RSSAggr);
 }
 
 void RSS_item_rss_end(StrBuf *CData,
                      rss_item *ri,
-                     rss_aggregator *Cfg,
+                     rss_aggregator *RSSAggr,
                      const char** Attr)
 {
-//             syslog(LOG_DEBUG, "End of feed detected.  Closing parser.\n");
+       AsyncIO         *IO = &RSSAggr->IO;
+       EVRSSATOMM_syslog(LOG_DEBUG, "End of feed detected.  Closing parser.\n");
        ri->done_parsing = 1;
 }
 
 void RSS_item_rdf_end(StrBuf *CData,
                      rss_item *ri,
-                     rss_aggregator *Cfg,
+                     rss_aggregator *RSSAggr,
                      const char** Attr)
 {
-//             syslog(LOG_DEBUG, "End of feed detected.  Closing parser.\n");
+       AsyncIO         *IO = &RSSAggr->IO;
+       EVRSSATOMM_syslog(LOG_DEBUG, "End of feed detected.  Closing parser.\n");
        ri->done_parsing = 1;
 }
 
 
 void RSSATOM_item_ignore(StrBuf *CData,
                         rss_item *ri,
-                        rss_aggregator *Cfg,
+                        rss_aggregator *RSSAggr,
                         const char** Attr)
 {
 }
@@ -604,7 +632,7 @@ void AppendLink(StrBuf *Message,
 /*
  * Commit a fetched and parsed RSS item to disk
  */
-void rss_save_item(rss_item *ri, rss_aggregator *Cfg)
+void rss_save_item(rss_item *ri, rss_aggregator *RSSAggr)
 {
        networker_save_message *SaveMsg;
        struct MD5Context md5context;
@@ -612,7 +640,7 @@ void rss_save_item(rss_item *ri, rss_aggregator *Cfg)
        int msglen = 0;
        StrBuf *Message;
        StrBuf *guid;
-       AsyncIO *IO = &Cfg->IO;
+       AsyncIO *IO = &RSSAggr->IO;
        int n;
 
 
@@ -647,7 +675,7 @@ void rss_save_item(rss_item *ri, rss_aggregator *Cfg)
        }
 
        /* translate Item into message. */
-       EVM_syslog(LOG_DEBUG, "RSS: translating item...\n");
+       EVRSSATOMM_syslog(LOG_DEBUG, "RSS: translating item...\n");
        if (ri->description == NULL) ri->description = NewStrBufPlain(HKEY(""));
        StrBufSpaceToBlank(ri->description);
        SaveMsg->Msg.cm_magic = CTDLMESSAGE_MAGIC;
@@ -767,8 +795,8 @@ void rss_save_item(rss_item *ri, rss_aggregator *Cfg)
        SaveMsg->MsgGUID = guid;
        SaveMsg->Message = Message;
 
-       n = GetCount(Cfg->Messages) + 1;
-       Put(Cfg->Messages, IKEY(n), SaveMsg, FreeNetworkSaveMessage);
+       n = GetCount(RSSAggr->Messages) + 1;
+       Put(RSSAggr->Messages, IKEY(n), SaveMsg, FreeNetworkSaveMessage);
 }
 
 
@@ -776,6 +804,7 @@ void rss_xml_start(void *data, const char *supplied_el, const char **attr)
 {
        rss_xml_handler *h;
        rss_aggregator  *RSSAggr = (rss_aggregator*) data;
+       AsyncIO         *IO = &RSSAggr->IO;
        rss_item        *ri = RSSAggr->Item;
        void            *pv;
        const char      *pel;
@@ -784,7 +813,7 @@ void rss_xml_start(void *data, const char *supplied_el, const char **attr)
        /* Axe the namespace, we don't care about it */
        /*
          syslog(LOG_DEBUG,
-         "RSS: supplied el %d: %s\n", RSSAggr->Cfg->ItemType, supplied_el);
+         "RSS: supplied el %d: %s\n", RSSAggr->RSSAggr->ItemType, supplied_el);
        */
        pel = supplied_el;
        while (sep = strchr(pel, ':'), sep) {
@@ -800,12 +829,10 @@ void rss_xml_start(void *data, const char *supplied_el, const char **attr)
                             pel - supplied_el - 1,
                             &v))
                {
-#ifdef DEBUG_RSS
-                       syslog(LOG_DEBUG,
-                              "RSS: START ignoring "
-                              "because of wrong namespace [%s]\n",
-                              supplied_el);
-#endif
+                       EVRSSATOM_syslog(LOG_DEBUG,
+                                        "RSS: START ignoring "
+                                        "because of wrong namespace [%s]\n",
+                                        supplied_el);
                        return;
                }
        }
@@ -834,27 +861,24 @@ void rss_xml_start(void *data, const char *supplied_el, const char **attr)
                                   RSSAggr,
                                   attr);
                }
-#ifdef DEBUG_RSS
                else
-                       syslog(LOG_DEBUG,
-                              "RSS: START unhandled: [%s] [%s]...\n",
-                              pel,
-                              supplied_el);
-#endif
+                       EVRSSATOM_syslog(LOG_DEBUG,
+                                         "RSS: START unhandled: [%s] [%s]...\n",
+                                        pel,
+                                        supplied_el);
        }
-#ifdef DEBUG_RSS
        else
-               syslog(LOG_DEBUG,
-                      "RSS: START unhandled: [%s] [%s]...\n",
-                      pel,
-                      supplied_el);
-#endif
+               EVRSSATOM_syslog(LOG_DEBUG,
+                                "RSS: START unhandled: [%s] [%s]...\n",
+                                pel,
+                                supplied_el);
 }
 
 void rss_xml_end(void *data, const char *supplied_el)
 {
        rss_xml_handler *h;
        rss_aggregator  *RSSAggr = (rss_aggregator*) data;
+       AsyncIO         *IO = &RSSAggr->IO;
        rss_item        *ri = RSSAggr->Item;
        const char      *pel;
        char            *sep = NULL;
@@ -865,7 +889,7 @@ void rss_xml_end(void *data, const char *supplied_el)
        while (sep = strchr(pel, ':'), sep) {
                pel = sep + 1;
        }
-//     syslog(LOG_DEBUG, "RSS: END %s...\n", el);
+       EVRSSATOM_syslog(LOG_DEBUG, "RSS: END %s...\n", supplied_el);
        if (pel != supplied_el)
        {
                void *v;
@@ -875,13 +899,11 @@ void rss_xml_end(void *data, const char *supplied_el)
                             pel - supplied_el - 1,
                             &v))
                {
-#ifdef DEBUG_RSS
-                       syslog(LOG_DEBUG,
-                              "RSS: END ignoring because of wrong namespace"
-                              "[%s] = [%s]\n",
-                              supplied_el,
-                              ChrPtr(RSSAggr->CData));
-#endif
+                       EVRSSATOM_syslog(LOG_DEBUG,
+                                        "RSS: END ignoring because of wrong namespace"
+                                        "[%s] = [%s]\n",
+                                        supplied_el,
+                                        ChrPtr(RSSAggr->CData));
                        FlushStrBuf(RSSAggr->CData);
                        return;
                }
@@ -908,23 +930,19 @@ void rss_xml_end(void *data, const char *supplied_el)
                {
                        h->Handler(RSSAggr->CData, ri, RSSAggr, NULL);
                }
-#ifdef DEBUG_RSS
                else
-                       syslog(LOG_DEBUG,
-                              "RSS: END   unhandled: [%s]  [%s] = [%s]...\n",
-                              pel,
-                              supplied_el,
-                              ChrPtr(RSSAggr->CData));
-#endif
+                       EVRSSATOM_syslog(LOG_DEBUG,
+                                        "RSS: END   unhandled: [%s]  [%s] = [%s]...\n",
+                                        pel,
+                                        supplied_el,
+                                        ChrPtr(RSSAggr->CData));
        }
-#ifdef DEBUG_RSS
        else
-               syslog(LOG_DEBUG,
-                      "RSS: END   unhandled: [%s]  [%s] = [%s]...\n",
-                      pel,
-                      supplied_el,
-                      ChrPtr(RSSAggr->CData));
-#endif
+               EVRSSATOM_syslog(LOG_DEBUG,
+                                "RSS: END   unhandled: [%s]  [%s] = [%s]...\n",
+                                pel,
+                                supplied_el,
+                                ChrPtr(RSSAggr->CData));
        FlushStrBuf(RSSAggr->CData);
 }
 
@@ -952,8 +970,8 @@ eNextState RSSAggregator_ParseReply(AsyncIO *IO)
        if (IO->HttpReq.httpcode != 200)
        {
 
-               EV_syslog(LOG_DEBUG, "need a 200, got a %ld !\n",
-                         IO->HttpReq.httpcode);
+               EVRSSATOM_syslog(LOG_ALERT, "need a 200, got a %ld !\n",
+                                IO->HttpReq.httpcode);
 // TODO: aide error message with rate limit
                return eAbort;
        }
@@ -982,11 +1000,11 @@ eNextState RSSAggregator_ParseReply(AsyncIO *IO)
        else
                ptr = "UTF-8";
 
-       syslog(LOG_DEBUG, "RSS: Now parsing [%s] \n", ChrPtr(RSSAggr->Url));
+       EVRSSATOM_syslog(LOG_DEBUG, "RSS: Now parsing [%s] \n", ChrPtr(RSSAggr->Url));
 
        RSSAggr->xp = XML_ParserCreateNS(ptr, ':');
        if (!RSSAggr->xp) {
-               syslog(LOG_DEBUG, "Cannot create XML parser!\n");
+               EVRSSATOMM_syslog(LOG_ALERT, "Cannot create XML parser!\n");
                return eAbort;
        }
        FlushStrBuf(RSSAggr->Key);
@@ -1008,8 +1026,8 @@ eNextState RSSAggregator_ParseReply(AsyncIO *IO)
                XML_Parse(RSSAggr->xp, "", 0, 1);
 
 
-       syslog(LOG_DEBUG, "RSS: XML Status [%s] \n",
-              XML_ErrorString(XML_GetErrorCode(RSSAggr->xp)));
+       EVRSSATOM_syslog(LOG_DEBUG, "RSS: XML Status [%s] \n",
+                        XML_ErrorString(XML_GetErrorCode(RSSAggr->xp)));
 
        XML_ParserFree(RSSAggr->xp);
        flush_rss_item(ri);
@@ -1021,7 +1039,7 @@ eNextState RSSAggregator_ParseReply(AsyncIO *IO)
 
        RSSAggr->Pos = GetNewHashPos(RSSAggr->Messages, 1);
 
-//Cfg->next_poll = time(NULL) + config.c_net_freq;
+//RSSAggr->next_poll = time(NULL) + config.c_net_freq;
        if (GetNextHashPos(RSSAggr->Messages,
                           RSSAggr->Pos,
                           &len,
@@ -1068,6 +1086,10 @@ void rss_parser_cleanup(void)
        DeleteHash(&KnownNameSpaces);
 }
 
+void LogDebugEnableRSSATOMParser(void)
+{
+       RSSAtomParserDebugEnabled = 1;
+}
 
 CTDL_MODULE_INIT(rssparser)
 {
@@ -1155,6 +1177,7 @@ CTDL_MODULE_INIT(rssparser)
                /* we don't like these namespaces because of they shadow our usefull parameters. */
                Put(KnownNameSpaces, HKEY("http://search.yahoo.com/mrss/"), NULL, reference_free_handler);
 #endif
+               CtdlRegisterDebugFlagHook(HKEY("RSSAtomParser"), LogDebugEnableRSSATOMParser);
                CtdlRegisterCleanupHook(rss_parser_cleanup);
        }
        return "rssparser";
index 68f04ab75daddf83fd0fef6c04c3b4f82cf3ae44..638300feb439abdbee4bb7cb42afa3fbcd825f82 100644 (file)
@@ -68,7 +68,30 @@ eNextState RSSAggregator_ShutdownAbort(AsyncIO *IO);
 struct CitContext rss_CC;
 
 struct rssnetcfg *rnclist = NULL;
+int RSSClientDebugEnabled = 0;
+#define N ((rss_aggregator*)IO->Data)->QRnumber
 
+#define DBGLOG(LEVEL) if ((LEVEL != LOG_DEBUG) || (RSSClientDebugEnabled != 0))
+
+#define EVRSSC_syslog(LEVEL, FORMAT, ...)                              \
+       DBGLOG(LEVEL) syslog(LEVEL,                                     \
+                            "IO[%ld]CC[%d][%ld]RSS" FORMAT,            \
+                            IO->ID, CCID, N, __VA_ARGS__)
+
+#define EVRSSCM_syslog(LEVEL, FORMAT)                                  \
+       DBGLOG(LEVEL) syslog(LEVEL,                                     \
+                            "IO[%ld]CC[%d][%ld]RSS" FORMAT,            \
+                            IO->ID, CCID, N)
+
+#define EVRSSQ_syslog(LEVEL, FORMAT, ...)                              \
+       DBGLOG(LEVEL) syslog(LEVEL, "RSS" FORMAT,                       \
+                            __VA_ARGS__)
+#define EVRSSQM_syslog(LEVEL, FORMAT)                  \
+       DBGLOG(LEVEL) syslog(LEVEL, "RSS" FORMAT)
+
+#define EVRSSCSM_syslog(LEVEL, FORMAT)                                 \
+       DBGLOG(LEVEL) syslog(LEVEL, "IO[%ld][%ld]RSS" FORMAT,           \
+                            IO->ID, N)
 
 void DeleteRoomReference(long QRnumber)
 {
@@ -94,19 +117,19 @@ void DeleteRoomReference(long QRnumber)
        DeleteHashPos(&At);
 }
 
-void UnlinkRooms(rss_aggregator *Cfg)
+void UnlinkRooms(rss_aggregator *RSSAggr)
 {
-       DeleteRoomReference(Cfg->QRnumber);
-       if (Cfg->OtherQRnumbers != NULL)
+       DeleteRoomReference(RSSAggr->QRnumber);
+       if (RSSAggr->OtherQRnumbers != NULL)
        {
                long HKLen;
                const char *HK;
                HashPos *At;
                void *vData;
 
-               At = GetNewHashPos(Cfg->OtherQRnumbers, 0);
+               At = GetNewHashPos(RSSAggr->OtherQRnumbers, 0);
                while (! server_shutting_down &&
-                      GetNextHashPos(Cfg->OtherQRnumbers,
+                      GetNextHashPos(RSSAggr->OtherQRnumbers,
                                      At,
                                      &HKLen, &HK,
                                      &vData) &&
@@ -120,15 +143,15 @@ void UnlinkRooms(rss_aggregator *Cfg)
        }
 }
 
-void UnlinkRSSAggregator(rss_aggregator *Cfg)
+void UnlinkRSSAggregator(rss_aggregator *RSSAggr)
 {
        HashPos *At;
 
        pthread_mutex_lock(&RSSQueueMutex);
-       UnlinkRooms(Cfg);
+       UnlinkRooms(RSSAggr);
 
        At = GetNewHashPos(RSSFetchUrls, 0);
-       if (GetHashPosFromKey(RSSFetchUrls, SKEY(Cfg->Url), At))
+       if (GetHashPosFromKey(RSSFetchUrls, SKEY(RSSAggr->Url), At))
        {
                DeleteEntryFromHash(RSSFetchUrls, At);
        }
@@ -141,7 +164,7 @@ void DeleteRssCfg(void *vptr)
 {
        rss_aggregator *RSSAggr = (rss_aggregator *)vptr;
        AsyncIO *IO = &RSSAggr->IO;
-       EVM_syslog(LOG_DEBUG, "RSS: destroying\n");
+       EVRSSCM_syslog(LOG_DEBUG, "RSS: destroying\n");
 
        FreeStrBuf(&RSSAggr->Url);
        FreeStrBuf(&RSSAggr->rooms);
@@ -170,7 +193,7 @@ eNextState RSSAggregator_Terminate(AsyncIO *IO)
 {
        rss_aggregator *RSSAggr = (rss_aggregator *)IO->Data;
 
-       EVM_syslog(LOG_DEBUG, "RSS: Terminating.\n");
+       EVRSSCM_syslog(LOG_DEBUG, "RSS: Terminating.\n");
 
 
        UnlinkRSSAggregator(RSSAggr);
@@ -181,7 +204,7 @@ eNextState RSSAggregator_TerminateDB(AsyncIO *IO)
 {
        rss_aggregator *RSSAggr = (rss_aggregator *)IO->Data;
 
-       EVM_syslog(LOG_DEBUG, "RSS: Terminating.\n");
+       EVRSSCM_syslog(LOG_DEBUG, "RSS: Terminating.\n");
 
 
        UnlinkRSSAggregator(RSSAggr);
@@ -197,7 +220,7 @@ eNextState RSSAggregator_ShutdownAbort(AsyncIO *IO)
        if (pUrl == NULL)
                pUrl = "";
 
-       EV_syslog(LOG_DEBUG, "RSS: Aborting by shutdown: %s.\n", pUrl);
+       EVRSSC_syslog(LOG_DEBUG, "RSS: Aborting by shutdown: %s.\n", pUrl);
 
 
        UnlinkRSSAggregator(RSSAggr);
@@ -252,7 +275,7 @@ eNextState RSS_FetchNetworkUsetableEntry(AsyncIO *IO)
 #ifndef DEBUG_RSS
        if (cdbut != NULL) {
                /* Item has already been seen */
-               EV_syslog(LOG_DEBUG,
+               EVRSSC_syslog(LOG_DEBUG,
                          "%s has already been seen\n",
                          ChrPtr(Ctx->ThisMsg->MsgGUID));
                cdb_free(cdbut);
@@ -283,41 +306,42 @@ eNextState RSS_FetchNetworkUsetableEntry(AsyncIO *IO)
 /*
  * Begin a feed parse
  */
-int rss_do_fetching(rss_aggregator *Cfg)
+int rss_do_fetching(rss_aggregator *RSSAggr)
 {
+       AsyncIO         *IO = &RSSAggr->IO;
        rss_item *ri;
        time_t now;
 
        now = time(NULL);
 
-       if ((Cfg->next_poll != 0) && (now < Cfg->next_poll))
+       if ((RSSAggr->next_poll != 0) && (now < RSSAggr->next_poll))
                return 0;
 
        ri = (rss_item*) malloc(sizeof(rss_item));
        memset(ri, 0, sizeof(rss_item));
-       Cfg->Item = ri;
+       RSSAggr->Item = ri;
 
-       if (! InitcURLIOStruct(&Cfg->IO,
-                              Cfg,
+       if (! InitcURLIOStruct(&RSSAggr->IO,
+                              RSSAggr,
                               "Citadel RSS Client",
                               RSSAggregator_ParseReply,
                               RSSAggregator_Terminate,
                               RSSAggregator_TerminateDB,
                               RSSAggregator_ShutdownAbort))
        {
-               syslog(LOG_ALERT, "Unable to initialize libcurl.\n");
+               EVRSSCM_syslog(LOG_ALERT, "Unable to initialize libcurl.\n");
                return 0;
        }
 
-       safestrncpy(((CitContext*)Cfg->IO.CitContext)->cs_host,
-                   ChrPtr(Cfg->Url),
-                   sizeof(((CitContext*)Cfg->IO.CitContext)->cs_host));
+       safestrncpy(((CitContext*)RSSAggr->IO.CitContext)->cs_host,
+                   ChrPtr(RSSAggr->Url),
+                   sizeof(((CitContext*)RSSAggr->IO.CitContext)->cs_host));
 
-       syslog(LOG_DEBUG, "Fetching RSS feed <%s>\n", ChrPtr(Cfg->Url));
-       ParseURL(&Cfg->IO.ConnectMe, Cfg->Url, 80);
-       CurlPrepareURL(Cfg->IO.ConnectMe);
+       EVRSSC_syslog(LOG_DEBUG, "Fetching RSS feed <%s>\n", ChrPtr(RSSAggr->Url));
+       ParseURL(&RSSAggr->IO.ConnectMe, RSSAggr->Url, 80);
+       CurlPrepareURL(RSSAggr->IO.ConnectMe);
 
-       QueueCurlContext(&Cfg->IO);
+       QueueCurlContext(&RSSAggr->IO);
        return 1;
 }
 
@@ -343,10 +367,10 @@ void rssclient_scan_room(struct ctdlroom *qrbuf, void *data)
        pthread_mutex_lock(&RSSQueueMutex);
        if (GetHash(RSSQueueRooms, LKEY(qrbuf->QRnumber), &vptr))
        {
-               syslog(LOG_DEBUG,
-                      "rssclient: [%ld] %s already in progress.\n",
-                      qrbuf->QRnumber,
-                      qrbuf->QRname);
+               EVRSSQ_syslog(LOG_DEBUG,
+                             "rssclient: [%ld] %s already in progress.\n",
+                             qrbuf->QRnumber,
+                             qrbuf->QRname);
                pthread_mutex_unlock(&RSSQueueMutex);
                return;
        }
@@ -370,10 +394,10 @@ void rssclient_scan_room(struct ctdlroom *qrbuf, void *data)
                return;
 
        if (fstat(fd, &statbuf) == -1) {
-               syslog(LOG_DEBUG,
-                      "ERROR: could not stat configfile '%s' - %s\n",
-                      filename,
-                      strerror(errno));
+               EVRSSQ_syslog(LOG_DEBUG,
+                             "ERROR: could not stat configfile '%s' - %s\n",
+                             filename,
+                             strerror(errno));
                return;
        }
 
@@ -385,8 +409,8 @@ void rssclient_scan_room(struct ctdlroom *qrbuf, void *data)
        if (StrBufReadBLOB(CfgData, &fd, 1, statbuf.st_size, &Err) < 0) {
                close(fd);
                FreeStrBuf(&CfgData);
-               syslog(LOG_DEBUG, "ERROR: reading config '%s' - %s<br>\n",
-                      filename, strerror(errno));
+               EVRSSQ_syslog(LOG_ERR, "ERROR: reading config '%s' - %s<br>\n",
+                             filename, strerror(errno));
                return;
        }
        close(fd);
@@ -481,8 +505,8 @@ void rssclient_scan_room(struct ctdlroom *qrbuf, void *data)
        {
                Count->QRnumber = qrbuf->QRnumber;
                pthread_mutex_lock(&RSSQueueMutex);
-               syslog(LOG_DEBUG, "rssclient: [%ld] %s now starting.\n",
-                      qrbuf->QRnumber, qrbuf->QRname);
+               EVRSSQ_syslog(LOG_DEBUG, "client: [%ld] %s now starting.\n",
+                             qrbuf->QRnumber, qrbuf->QRname);
                Put(RSSQueueRooms, LKEY(qrbuf->QRnumber), Count, NULL);
                pthread_mutex_unlock(&RSSQueueMutex);
        }
@@ -505,10 +529,10 @@ void rssclient_scan(void) {
 
        /* Run no more than once every 15 minutes. */
        if ((now - last_run) < 900) {
-               syslog(LOG_DEBUG,
-                       "rssclient: polling interval not yet reached; last run was %ldm%lds ago",
-                       ((now - last_run) / 60),
-                       ((now - last_run) % 60)
+               EVRSSQ_syslog(LOG_DEBUG,
+                             "Client: polling interval not yet reached; last run was %ldm%lds ago",
+                             ((now - last_run) / 60),
+                             ((now - last_run) % 60)
                );
                return;
        }
@@ -523,15 +547,15 @@ void rssclient_scan(void) {
        pthread_mutex_unlock(&RSSQueueMutex);
 
        if ((RSSRoomCount > 0) || (RSSCount > 0)) {
-               syslog(LOG_DEBUG,
-                      "rssclient: concurrency check failed; %d rooms and %d url's are queued",
-                      RSSRoomCount, RSSCount
+               EVRSSQ_syslog(LOG_DEBUG,
+                             "rssclient: concurrency check failed; %d rooms and %d url's are queued",
+                             RSSRoomCount, RSSCount
                        );
                return;
        }
 
        become_session(&rss_CC);
-       syslog(LOG_DEBUG, "rssclient started\n");
+       EVRSSQM_syslog(LOG_DEBUG, "rssclient started\n");
        CtdlForEachRoom(rssclient_scan_room, NULL);
 
        pthread_mutex_lock(&RSSQueueMutex);
@@ -547,7 +571,7 @@ void rssclient_scan(void) {
        DeleteHashPos(&it);
        pthread_mutex_unlock(&RSSQueueMutex);
 
-       syslog(LOG_DEBUG, "rssclient ended\n");
+       EVRSSQM_syslog(LOG_DEBUG, "rssclient ended\n");
        return;
 }
 
@@ -558,6 +582,10 @@ void rss_cleanup(void)
        DeleteHash(&RSSQueueRooms);
 }
 
+void LogDebugEnableRSSClient(void)
+{
+       RSSClientDebugEnabled = 1;
+}
 
 CTDL_MODULE_INIT(rssclient)
 {
@@ -570,6 +598,7 @@ CTDL_MODULE_INIT(rssclient)
                syslog(LOG_INFO, "%s\n", curl_version());
                CtdlRegisterSessionHook(rssclient_scan, EVT_TIMER);
                CtdlRegisterEVCleanupHook(rss_cleanup);
+               CtdlRegisterDebugFlagHook(HKEY("rssclient"), LogDebugEnableRSSClient);
        }
        return "rssclient";
 }