Module: kamailio Branch: master Commit: ec19b1330f10a88b74fef475a476318fef709342 URL: https://github.com/kamailio/kamailio/commit/ec19b1330f10a88b74fef475a476318f...
Author: Daniel-Constantin Mierla miconda@gmail.com Committer: Daniel-Constantin Mierla miconda@gmail.com Date: 2015-01-06T16:34:07+01:00
xlog: new log function xlogm(...) - logs with method filtering
- same as xlog(level, message), fitering on methods - new parameter methods_filter - a bitmask with internal sip method ids to be skipped from printing logs. Default -1 (skip all) - parameter can be set at runtime via cfg reload framework kamcmd cfg.set_now_int xlog methods_filter 15 - alternative implementation of FS#81
---
Modified: modules/xlog/xlog.c
---
Diff: https://github.com/kamailio/kamailio/commit/ec19b1330f10a88b74fef475a476318f... Patch: https://github.com/kamailio/kamailio/commit/ec19b1330f10a88b74fef475a476318f...
---
diff --git a/modules/xlog/xlog.c b/modules/xlog/xlog.c index 600b9d9..61947af 100644 --- a/modules/xlog/xlog.c +++ b/modules/xlog/xlog.c @@ -45,6 +45,7 @@ #include "../../sr_module.h" #include "../../dprint.h" #include "../../error.h" +#include "../../cfg/cfg.h" #include "../../mem/mem.h" #include "../../parser/parse_param.h"
@@ -66,6 +67,20 @@ static int long_format=0; static int xlog_facility = DEFAULT_FACILITY; static char *xlog_facility_name = NULL;
+/** cfg dynamic parameters */ +struct cfg_group_xlog { + int methods_filter; +}; +static struct cfg_group_xlog xlog_default_cfg = { + -1 /* methods filter */ +}; +static void *xlog_cfg = &xlog_default_cfg; +static cfg_def_t xlog_cfg_def[] = { + {"methods_filter", CFG_VAR_INT | CFG_ATOMIC, 0, 0, 0, 0, + "Methods filter value for xlogm(...)."}, + {0, 0, 0, 0, 0, 0} +}; + /** module functions */ static int mod_init(void);
@@ -79,6 +94,8 @@ static int xlogl_2(struct sip_msg*, char*, char*); static int xlogl_3(struct sip_msg*, char*, char*, char*); static int xdbgl(struct sip_msg*, char*, char*);
+static int xlogm_2(struct sip_msg*, char*, char*); + static int xlog_fixup(void** param, int param_no); static int xlog3_fixup(void** param, int param_no); static int xdbg_fixup(void** param, int param_no); @@ -125,6 +142,7 @@ static cmd_export_t cmds[]={ {"xlogl", (cmd_function)xlogl_2, 2, xlogl_fixup, 0, ANY_ROUTE}, {"xlogl", (cmd_function)xlogl_3, 3, xlogl3_fixup,0, ANY_ROUTE}, {"xdbgl", (cmd_function)xdbgl, 1, xdbgl_fixup, 0, ANY_ROUTE}, + {"xlogm", (cmd_function)xlogm_2, 2, xlog_fixup, 0, ANY_ROUTE}, {0,0,0,0,0,0} };
@@ -136,6 +154,7 @@ static param_export_t params[]={ {"prefix", PARAM_STRING, &_xlog_prefix}, {"log_facility", PARAM_STRING, &xlog_facility_name}, {"log_colors", PARAM_STRING|USE_FUNC_PARAM, (void*)xlog_log_colors_param}, + {"methods_filter", PARAM_INT, &xlog_default_cfg.methods_filter}, {0,0,0} };
@@ -162,6 +181,11 @@ struct module_exports exports= { static int mod_init(void) { int lf; + if(cfg_declare("xlog", xlog_cfg_def, &xlog_default_cfg, + cfg_sizeof(xlog), &xlog_cfg)){ + LM_ERR("Fail to declare the xlog cfg framework structure\n"); + return -1; + } if (xlog_facility_name!=NULL) { lf = str2facility(xlog_facility_name); if (lf != -1) { @@ -276,6 +300,35 @@ static int xlogl_2(struct sip_msg* msg, char* lev, char* frm) return xlog_2_helper(msg, lev, frm, 1, NOFACILITY); }
+/** + * print log message to level given in parameter applying methods filter + */ +static int xlogm_2(struct sip_msg* msg, char* lev, char* frm) +{ + int mfilter; + + mfilter = cfg_get(xlog, xlog_cfg, methods_filter); + + if(mfilter==-1) + return 1; + + if(msg->first_line.type==SIP_REQUEST) { + if (msg->first_line.u.request.method_value & mfilter) { + return 1; + } + } else { + if (parse_headers(msg, HDR_CSEQ_F, 0) != 0 || msg->cseq==NULL) { + LM_ERR("cannot parse cseq header\n"); + return -1; + } + if (get_cseq(msg)->method_id & mfilter) { + return 1; + } + } + + return xlog_2_helper(msg, lev, frm, 0, NOFACILITY); +} + static int xlog_3_helper(struct sip_msg* msg, char* fac, char* lev, char* frm, int mode) { long level;