Initial import (#848388).

This commit is contained in:
Mahaveer Darade 2012-10-11 17:54:32 +05:30
parent 3af46ae612
commit a3920d6470
5 changed files with 721 additions and 0 deletions

1
.gitignore vendored
View File

@ -0,0 +1 @@
/liblognorm-0.3.4.tar.gz

View File

@ -0,0 +1,9 @@
--- x/lognorm.pc.in 2012-09-20 17:19:10.901594600 +0530
+++ y/lognorm.pc.in 2012-09-20 17:20:22.076596296 +0530
@@ -6,5 +6,5 @@
Name: lognorm
Description: fast samples-based log normalization library
Version: @VERSION@
-Libs: -L${libdir} -llognorm -lee -lestr
+Libs: -L${libdir} -llognorm
Cflags: -I${includedir}

View File

@ -0,0 +1,624 @@
diff -Naru a/src/lognormalizer.c b/src/lognormalizer.c
--- a/src/lognormalizer.c 1970-01-01 05:30:00.000000000 +0530
+++ b/src/lognormalizer.c 2012-09-20 14:45:09.780374402 +0530
@@ -0,0 +1,246 @@
+/**
+ * @file normalizer.c
+ * @brief A small tool to normalize data.
+ *
+ * This is the most basic example demonstrating how to use liblognorm.
+ * It loads log samples from the files specified on the command line,
+ * reads to-be-normalized data from stdin and writes the normalized
+ * form to stdout. Besides being an example, it also carries out useful
+ * processing.
+ *
+ * @author Rainer Gerhards <rgerhards@adiscon.com>
+ *
+ *//*
+ * liblognorm - a fast samples-based log normalization library
+ * Copyright 2010-2011 by Rainer Gerhards and Adiscon GmbH.
+ *
+ * This file is part of liblognorm.
+ *
+ * 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 Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * A copy of the LGPL v2.1 can be found in the file "COPYING" in this distribution.
+ */
+#include <stdio.h>
+#include <string.h>
+#include <getopt.h>
+#include <libestr.h>
+#include <libee/libee.h>
+#include "liblognorm.h"
+#include "ptree.h"
+#include "lognorm.h"
+
+static ln_ctx ctx;
+static ee_ctx eectx;
+
+static int verbose = 0;
+static int parsedOnly = 0; /**< output unparsed messages? */
+static int flatTags = 0; /**< output unparsed messages? */
+static FILE *fpDOT;
+static es_str_t *encFmt = NULL; /**< a format string for encoder use */
+static es_str_t *mandatoryTag = NULL; /**< tag which must be given so that mesg will
+ be output. NULL=all */
+static enum { f_syslog, f_json, f_xml, f_csv } outfmt = f_syslog;
+
+void
+dbgCallBack(void __attribute__((unused)) *cookie, char *msg,
+ size_t __attribute__((unused)) lenMsg)
+{
+ printf("liblognorm: %s\n", msg);
+}
+
+void errout(char *errmsg)
+{
+ fprintf(stderr, "%s\n", errmsg);
+ exit(1);
+}
+
+
+/* param str is just a performance enhancement, which saves us re-creation
+ * of the string on every call.
+ */
+static inline void
+outputEvent(struct ee_event *event)
+{
+ char *cstr;
+ es_str_t *str = NULL;
+
+ switch(outfmt) {
+ case f_json:
+ ee_fmtEventToJSON(event, &str);
+ break;
+ case f_syslog:
+ ee_fmtEventToRFC5424(event, &str);
+ break;
+ case f_xml:
+ ee_fmtEventToXML(event, &str);
+ break;
+ case f_csv:
+ ee_fmtEventToCSV(event, &str, encFmt);
+ break;
+ }
+ cstr = es_str2cstr(str, NULL);
+ if(verbose > 0) printf("normalized: '%s'\n", cstr);
+ printf("%s\n", cstr);
+ free(cstr);
+ es_deleteStr(str);
+}
+
+
+/* normalize input data
+ */
+void
+normalize(void)
+{
+ FILE *fp = stdin;
+ char buf[10*1024];
+ es_str_t *str;
+ struct ee_event *event = NULL;
+ es_str_t *constUnparsed;
+ long long unsigned numUnparsed = 0;
+ long long unsigned numWrongTag = 0;
+
+ constUnparsed = es_newStrFromBuf("unparsed-data", sizeof("unparsed-data") - 1);
+
+ while((fgets(buf, sizeof(buf), fp)) != NULL) {
+ buf[strlen(buf)-1] = '\0';
+ if(strlen(buf) > 0 && buf[strlen(buf)-1] == '\r')
+ buf[strlen(buf)-1] = '\0';
+ if(verbose > 0) printf("To normalize: '%s'\n", buf);
+ str = es_newStrFromCStr(buf, strlen(buf));
+ ln_normalize(ctx, str, &event);
+ //printf("normalize result: %d\n", ln_normalizeRec(ctx, ctx->ptree, str, 0, &event));
+ if(event != NULL) {
+ if( mandatoryTag == NULL
+ || (mandatoryTag != NULL && ee_EventHasTag(event, mandatoryTag))) {
+ if( parsedOnly == 1
+ && ee_getEventField(event, constUnparsed) != NULL){
+ numUnparsed++;
+ } else {
+ outputEvent(event);
+ }
+ } else {
+ numWrongTag++;
+ }
+ ee_deleteEvent(event);
+ event = NULL;
+ }
+ es_deleteStr(str);
+ }
+ if(numUnparsed > 0)
+ fprintf(stderr, "%llu unparsable entries\n", numUnparsed);
+ if(numWrongTag > 0)
+ fprintf(stderr, "%llu entries with wrong tag dropped\n", numWrongTag);
+ es_deleteStr(constUnparsed);
+}
+
+
+/**
+ * Generate a command file for the GNU DOT tools.
+ */
+static void
+genDOT()
+{
+ es_str_t *str;
+
+ str = es_newStr(1024);
+ ln_genDotPTreeGraph(ctx->ptree, &str);
+ fwrite(es_getBufAddr(str), 1, es_strlen(str), fpDOT);
+}
+
+
+int main(int argc, char *argv[])
+{
+ int opt;
+ char *repository = NULL;
+
+ while((opt = getopt(argc, argv, "d:e:r:E:vpt:T")) != -1) {
+ switch (opt) {
+ case 'd': /* generate DOT file */
+ if(!strcmp(optarg, "")) {
+ fpDOT = stdout;
+ } else {
+ if((fpDOT = fopen(optarg, "w")) == NULL) {
+ errout("cannot open DOT file");
+ }
+ }
+ case 'v':
+ verbose++;
+ break;
+ case 'E': /* encoder-specific format string (will be validated by encoder) */
+ encFmt = es_newStrFromCStr(optarg, strlen(optarg));
+ break;
+ case 'p':
+ parsedOnly = 1;
+ break;
+ case 'T':
+ flatTags = 1;
+ break;
+ case 'e': /* encoder to use */
+ if(!strcmp(optarg, "json")) {
+ outfmt = f_json;
+ } else if(!strcmp(optarg, "xml")) {
+ outfmt = f_xml;
+ } else if(!strcmp(optarg, "csv")) {
+ outfmt = f_csv;
+ }
+ break;
+ case 'r': /* rule base to use */
+ repository = optarg;
+ break;
+ case 't': /* if given, only messages tagged with the argument
+ are output */
+ mandatoryTag = es_newStrFromCStr(optarg, strlen(optarg));
+ break;
+ }
+ }
+
+ if(repository == NULL) {
+ errout("samples repository must be given");
+ }
+
+ if((ctx = ln_initCtx()) == NULL) {
+ errout("Could not initialize liblognorm context");
+ }
+
+ if((eectx = ee_initCtx()) == NULL) {
+ errout("Could not initialize libee context");
+ }
+ if(flatTags) {
+ ee_setFlags(eectx, EE_CTX_FLAG_INCLUDE_FLAT_TAGS);
+ }
+
+ if(verbose) {
+ ln_setDebugCB(ctx, dbgCallBack, NULL);
+ ln_enableDebug(ctx, 1);
+ }
+ ln_setEECtx(ctx, eectx);
+
+ ln_loadSamples(ctx, repository);
+
+ if(verbose > 0)
+ printf("number of tree nodes: %d\n", ctx->nNodes);
+
+ if(fpDOT != NULL) {
+ genDOT();
+ exit(1);
+ }
+
+ if(verbose > 2) ln_displayPTree(ctx->ptree, 0);
+
+ normalize();
+
+ ln_exitCtx(ctx);
+ return 0;
+}
diff -Naru a/src/Makefile.am b/src/Makefile.am
--- a/src/Makefile.am 2012-09-20 14:45:07.345374340 +0530
+++ b/src/Makefile.am 2012-09-20 14:48:25.492379050 +0530
@@ -4,12 +4,12 @@
#CFLAGS += $(DEBUG)
-# we need to clean the normalizer up once we have reached a decent
+# we need to clean the lognormalizer up once we have reached a decent
# milestone (latest at initial release!)
-bin_PROGRAMS = normalizer
-normalizer_SOURCES = normalizer.c
-normalizer_CPPFLAGS = -I$(top_srcdir) $(LIBEE_CFLAGS) $(LIBESTR_CFLAGS)
-normalizer_LDADD = $(LIBEE_LIBS) $(LIBLOGNORM_LIBS) $(LIBESTR_LIBS)
+bin_PROGRAMS = lognormalizer
+lognormalizer_SOURCES = lognormalizer.c
+lognormalizer_CPPFLAGS = -I$(top_srcdir) $(LIBEE_CFLAGS) $(LIBESTR_CFLAGS)
+lognormalizer_LDADD = $(LIBEE_LIBS) $(LIBLOGNORM_LIBS) $(LIBESTR_LIBS)
lib_LTLIBRARIES = liblognorm.la
diff -Naru a/src/Makefile.in b/src/Makefile.in
--- a/src/Makefile.in 2012-09-20 14:45:07.345374340 +0530
+++ b/src/Makefile.in 2012-09-20 14:48:00.210378450 +0530
@@ -36,7 +36,7 @@
POST_UNINSTALL = :
build_triplet = @build@
host_triplet = @host@
-bin_PROGRAMS = normalizer$(EXEEXT)
+bin_PROGRAMS = lognormalizer$(EXEEXT)
subdir = src
DIST_COMMON = $(include_HEADERS) $(srcdir)/Makefile.am \
$(srcdir)/Makefile.in
@@ -89,9 +89,9 @@
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
$(liblognorm_la_LDFLAGS) $(LDFLAGS) -o $@
PROGRAMS = $(bin_PROGRAMS)
-am_normalizer_OBJECTS = normalizer-normalizer.$(OBJEXT)
-normalizer_OBJECTS = $(am_normalizer_OBJECTS)
-normalizer_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+am_lognormalizer_OBJECTS = lognormalizer-lognormalizer.$(OBJEXT)
+lognormalizer_OBJECTS = $(am_lognormalizer_OBJECTS)
+lognormalizer_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
$(am__DEPENDENCIES_1)
DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
depcomp = $(SHELL) $(top_srcdir)/depcomp
@@ -119,8 +119,8 @@
AM_V_GEN = $(am__v_GEN_$(V))
am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
am__v_GEN_0 = @echo " GEN " $@;
-SOURCES = $(liblognorm_la_SOURCES) $(normalizer_SOURCES)
-DIST_SOURCES = $(liblognorm_la_SOURCES) $(normalizer_SOURCES)
+SOURCES = $(liblognorm_la_SOURCES) $(lognormalizer_SOURCES)
+DIST_SOURCES = $(liblognorm_la_SOURCES) $(lognormalizer_SOURCES)
HEADERS = $(include_HEADERS)
ETAGS = etags
CTAGS = ctags
@@ -250,9 +250,9 @@
# Uncomment for debugging
DEBUG = -g
PTHREADS_CFLAGS = -pthread
-normalizer_SOURCES = normalizer.c
-normalizer_CPPFLAGS = -I$(top_srcdir) $(LIBEE_CFLAGS) $(LIBESTR_CFLAGS)
-normalizer_LDADD = $(LIBEE_LIBS) $(LIBLOGNORM_LIBS) $(LIBESTR_LIBS)
+lognormalizer_SOURCES = lognormalizer.c
+lognormalizer_CPPFLAGS = -I$(top_srcdir) $(LIBEE_CFLAGS) $(LIBESTR_CFLAGS)
+lognormalizer_LDADD = $(LIBEE_LIBS) $(LIBLOGNORM_LIBS) $(LIBESTR_LIBS)
lib_LTLIBRARIES = liblognorm.la
liblognorm_la_SOURCES = \
liblognorm.c \
@@ -383,9 +383,9 @@
list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
echo " rm -f" $$list; \
rm -f $$list
-normalizer$(EXEEXT): $(normalizer_OBJECTS) $(normalizer_DEPENDENCIES)
- @rm -f normalizer$(EXEEXT)
- $(AM_V_CCLD)$(LINK) $(normalizer_OBJECTS) $(normalizer_LDADD) $(LIBS)
+lognormalizer$(EXEEXT): $(lognormalizer_OBJECTS) $(lognormalizer_DEPENDENCIES)
+ @rm -f lognormalizer$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(lognormalizer_OBJECTS) $(lognormalizer_LDADD) $(LIBS)
mostlyclean-compile:
-rm -f *.$(OBJEXT)
@@ -398,7 +398,7 @@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liblognorm_la-lognorm.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liblognorm_la-ptree.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liblognorm_la-samp.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/normalizer-normalizer.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lognormalizer-lognormalizer.Po@am__quote@
.c.o:
@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
@@ -464,21 +464,21 @@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liblognorm_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o liblognorm_la-lognorm.lo `test -f 'lognorm.c' || echo '$(srcdir)/'`lognorm.c
-normalizer-normalizer.o: normalizer.c
-@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(normalizer_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT normalizer-normalizer.o -MD -MP -MF $(DEPDIR)/normalizer-normalizer.Tpo -c -o normalizer-normalizer.o `test -f 'normalizer.c' || echo '$(srcdir)/'`normalizer.c
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/normalizer-normalizer.Tpo $(DEPDIR)/normalizer-normalizer.Po
+lognormalizer-lognormalizer.o: lognormalizer.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lognormalizer_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lognormalizer-lognormalizer.o -MD -MP -MF $(DEPDIR)/lognormalizer-lognormalizer.Tpo -c -o lognormalizer-lognormalizer.o `test -f 'lognormalizer.c' || echo '$(srcdir)/'`lognormalizer.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lognormalizer-lognormalizer.Tpo $(DEPDIR)/lognormalizer-lognormalizer.Po
@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='normalizer.c' object='normalizer-normalizer.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='lognormalizer.c' object='lognormalizer-lognormalizer.o' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(normalizer_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o normalizer-normalizer.o `test -f 'normalizer.c' || echo '$(srcdir)/'`normalizer.c
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lognormalizer_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lognormalizer-lognormalizer.o `test -f 'lognormalizer.c' || echo '$(srcdir)/'`lognormalizer.c
-normalizer-normalizer.obj: normalizer.c
-@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(normalizer_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT normalizer-normalizer.obj -MD -MP -MF $(DEPDIR)/normalizer-normalizer.Tpo -c -o normalizer-normalizer.obj `if test -f 'normalizer.c'; then $(CYGPATH_W) 'normalizer.c'; else $(CYGPATH_W) '$(srcdir)/normalizer.c'; fi`
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/normalizer-normalizer.Tpo $(DEPDIR)/normalizer-normalizer.Po
+lognormalizer-lognormalizer.obj: lognormalizer.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lognormalizer_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lognormalizer-lognormalizer.obj -MD -MP -MF $(DEPDIR)/lognormalizer-lognormalizer.Tpo -c -o lognormalizer-lognormalizer.obj `if test -f 'lognormalizer.c'; then $(CYGPATH_W) 'lognormalizer.c'; else $(CYGPATH_W) '$(srcdir)/lognormalizer.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lognormalizer-lognormalizer.Tpo $(DEPDIR)/lognormalizer-lognormalizer.Po
@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='normalizer.c' object='normalizer-normalizer.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='lognormalizer.c' object='lognormalizer-lognormalizer.obj' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(normalizer_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o normalizer-normalizer.obj `if test -f 'normalizer.c'; then $(CYGPATH_W) 'normalizer.c'; else $(CYGPATH_W) '$(srcdir)/normalizer.c'; fi`
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lognormalizer_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lognormalizer-lognormalizer.obj `if test -f 'lognormalizer.c'; then $(CYGPATH_W) 'lognormalizer.c'; else $(CYGPATH_W) '$(srcdir)/lognormalizer.c'; fi`
mostlyclean-libtool:
-rm -f *.lo
diff -Naru a/src/normalizer.c b/src/normalizer.c
--- a/src/normalizer.c 2012-09-20 14:45:07.345374340 +0530
+++ b/src/normalizer.c 1970-01-01 05:30:00.000000000 +0530
@@ -1,246 +0,0 @@
-/**
- * @file normalizer.c
- * @brief A small tool to normalize data.
- *
- * This is the most basic example demonstrating how to use liblognorm.
- * It loads log samples from the files specified on the command line,
- * reads to-be-normalized data from stdin and writes the normalized
- * form to stdout. Besides being an example, it also carries out useful
- * processing.
- *
- * @author Rainer Gerhards <rgerhards@adiscon.com>
- *
- *//*
- * liblognorm - a fast samples-based log normalization library
- * Copyright 2010-2011 by Rainer Gerhards and Adiscon GmbH.
- *
- * This file is part of liblognorm.
- *
- * 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 Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * A copy of the LGPL v2.1 can be found in the file "COPYING" in this distribution.
- */
-#include <stdio.h>
-#include <string.h>
-#include <getopt.h>
-#include <libestr.h>
-#include <libee/libee.h>
-#include "liblognorm.h"
-#include "ptree.h"
-#include "lognorm.h"
-
-static ln_ctx ctx;
-static ee_ctx eectx;
-
-static int verbose = 0;
-static int parsedOnly = 0; /**< output unparsed messages? */
-static int flatTags = 0; /**< output unparsed messages? */
-static FILE *fpDOT;
-static es_str_t *encFmt = NULL; /**< a format string for encoder use */
-static es_str_t *mandatoryTag = NULL; /**< tag which must be given so that mesg will
- be output. NULL=all */
-static enum { f_syslog, f_json, f_xml, f_csv } outfmt = f_syslog;
-
-void
-dbgCallBack(void __attribute__((unused)) *cookie, char *msg,
- size_t __attribute__((unused)) lenMsg)
-{
- printf("liblognorm: %s\n", msg);
-}
-
-void errout(char *errmsg)
-{
- fprintf(stderr, "%s\n", errmsg);
- exit(1);
-}
-
-
-/* param str is just a performance enhancement, which saves us re-creation
- * of the string on every call.
- */
-static inline void
-outputEvent(struct ee_event *event)
-{
- char *cstr;
- es_str_t *str = NULL;
-
- switch(outfmt) {
- case f_json:
- ee_fmtEventToJSON(event, &str);
- break;
- case f_syslog:
- ee_fmtEventToRFC5424(event, &str);
- break;
- case f_xml:
- ee_fmtEventToXML(event, &str);
- break;
- case f_csv:
- ee_fmtEventToCSV(event, &str, encFmt);
- break;
- }
- cstr = es_str2cstr(str, NULL);
- if(verbose > 0) printf("normalized: '%s'\n", cstr);
- printf("%s\n", cstr);
- free(cstr);
- es_deleteStr(str);
-}
-
-
-/* normalize input data
- */
-void
-normalize(void)
-{
- FILE *fp = stdin;
- char buf[10*1024];
- es_str_t *str;
- struct ee_event *event = NULL;
- es_str_t *constUnparsed;
- long long unsigned numUnparsed = 0;
- long long unsigned numWrongTag = 0;
-
- constUnparsed = es_newStrFromBuf("unparsed-data", sizeof("unparsed-data") - 1);
-
- while((fgets(buf, sizeof(buf), fp)) != NULL) {
- buf[strlen(buf)-1] = '\0';
- if(strlen(buf) > 0 && buf[strlen(buf)-1] == '\r')
- buf[strlen(buf)-1] = '\0';
- if(verbose > 0) printf("To normalize: '%s'\n", buf);
- str = es_newStrFromCStr(buf, strlen(buf));
- ln_normalize(ctx, str, &event);
- //printf("normalize result: %d\n", ln_normalizeRec(ctx, ctx->ptree, str, 0, &event));
- if(event != NULL) {
- if( mandatoryTag == NULL
- || (mandatoryTag != NULL && ee_EventHasTag(event, mandatoryTag))) {
- if( parsedOnly == 1
- && ee_getEventField(event, constUnparsed) != NULL){
- numUnparsed++;
- } else {
- outputEvent(event);
- }
- } else {
- numWrongTag++;
- }
- ee_deleteEvent(event);
- event = NULL;
- }
- es_deleteStr(str);
- }
- if(numUnparsed > 0)
- fprintf(stderr, "%llu unparsable entries\n", numUnparsed);
- if(numWrongTag > 0)
- fprintf(stderr, "%llu entries with wrong tag dropped\n", numWrongTag);
- es_deleteStr(constUnparsed);
-}
-
-
-/**
- * Generate a command file for the GNU DOT tools.
- */
-static void
-genDOT()
-{
- es_str_t *str;
-
- str = es_newStr(1024);
- ln_genDotPTreeGraph(ctx->ptree, &str);
- fwrite(es_getBufAddr(str), 1, es_strlen(str), fpDOT);
-}
-
-
-int main(int argc, char *argv[])
-{
- int opt;
- char *repository = NULL;
-
- while((opt = getopt(argc, argv, "d:e:r:E:vpt:T")) != -1) {
- switch (opt) {
- case 'd': /* generate DOT file */
- if(!strcmp(optarg, "")) {
- fpDOT = stdout;
- } else {
- if((fpDOT = fopen(optarg, "w")) == NULL) {
- errout("cannot open DOT file");
- }
- }
- case 'v':
- verbose++;
- break;
- case 'E': /* encoder-specific format string (will be validated by encoder) */
- encFmt = es_newStrFromCStr(optarg, strlen(optarg));
- break;
- case 'p':
- parsedOnly = 1;
- break;
- case 'T':
- flatTags = 1;
- break;
- case 'e': /* encoder to use */
- if(!strcmp(optarg, "json")) {
- outfmt = f_json;
- } else if(!strcmp(optarg, "xml")) {
- outfmt = f_xml;
- } else if(!strcmp(optarg, "csv")) {
- outfmt = f_csv;
- }
- break;
- case 'r': /* rule base to use */
- repository = optarg;
- break;
- case 't': /* if given, only messages tagged with the argument
- are output */
- mandatoryTag = es_newStrFromCStr(optarg, strlen(optarg));
- break;
- }
- }
-
- if(repository == NULL) {
- errout("samples repository must be given");
- }
-
- if((ctx = ln_initCtx()) == NULL) {
- errout("Could not initialize liblognorm context");
- }
-
- if((eectx = ee_initCtx()) == NULL) {
- errout("Could not initialize libee context");
- }
- if(flatTags) {
- ee_setFlags(eectx, EE_CTX_FLAG_INCLUDE_FLAT_TAGS);
- }
-
- if(verbose) {
- ln_setDebugCB(ctx, dbgCallBack, NULL);
- ln_enableDebug(ctx, 1);
- }
- ln_setEECtx(ctx, eectx);
-
- ln_loadSamples(ctx, repository);
-
- if(verbose > 0)
- printf("number of tree nodes: %d\n", ctx->nNodes);
-
- if(fpDOT != NULL) {
- genDOT();
- exit(1);
- }
-
- if(verbose > 2) ln_displayPTree(ctx->ptree, 0);
-
- normalize();
-
- ln_exitCtx(ctx);
- return 0;
-}

86
liblognorm.spec Normal file
View File

@ -0,0 +1,86 @@
Name: liblognorm
Version: 0.3.4
Release: 4%{?dist}
Summary: Fast samples-based log normalization library
License: LGPLv2+
URL: http://www.liblognorm.com
Source0: http://www.liblognorm.com/files/download/%{name}-%{version}.tar.gz
Patch0: liblognorm-0.3.4-rename-to-lognormalizer.patch
Patch1: liblognorm-0.3.4-pc-file.patch
BuildRequires: libestr-devel, libee-devel, chrpath
%description
Briefly described, liblognorm is a tool to normalize log data.
People who need to take a look at logs often have a common problem. Logs from
different machines (from different vendors) usually have different formats for
their logs. Even if it is the same type of log (e.g. from firewalls), the log
entries are so different, that it is pretty hard to read these. This is where
liblognorm comes into the game. With this tool you can normalize all your logs.
All you need is liblognorm and its dependencies and a sample database that fits
the logs you want to normalize.
%package devel
Summary: Development tools for programs using liblognorm library
Requires: %{name}%{?_isa} = %{version}-%{release}
Requires: libee-devel%{?_isa} libestr-devel%{?_isa}
%description devel
The liblognorm-devel package includes header files, libraries necessary for
developing programs which use liblognorm library.
%package utils
Summary: Lognormalizer utility for normalizing log files
Requires: %{name}%{?_isa} = %{version}-%{release}
%description utils
The lognormalizer is the core of liblognorm, it is a utility for normalizing
log files.
%prep
%setup -q
%patch0 -p1 -b .rename-to-lognormalizer.patch
%patch1 -p1 -b .pc-file.patch
%build
%configure
V=1 make
%install
make install INSTALL="install -p" DESTDIR=%{buildroot}
rm -f %{buildroot}/%{_libdir}/*.{a,la}
chrpath -d %{buildroot}/%{_bindir}/lognormalizer
chrpath -d %{buildroot}/%{_libdir}/liblognorm.so.0.0.0
%post -p /sbin/ldconfig
%postun -p /sbin/ldconfig
%files
%doc AUTHORS ChangeLog COPYING NEWS README
%{_libdir}/lib*.so.*
%files devel
%{_libdir}/lib*.so
%{_includedir}/*.h
%{_libdir}/pkgconfig/*.pc
%files utils
%{_bindir}/lognormalizer
%changelog
* Fri Oct 05 2012 mdarade <mdarade@redhat.com> - 0.3.4-4
- Modified description of main & util package
* Thu Sep 20 2012 Mahaveer Darade <mdarade@redhat.com> - 0.3.4-3
- Renamed normalizer binary to lognormalizer
- Updated pc file to exclude lee and lestr
* Mon Aug 27 2012 mdarade <mdarade@redhat.com> - 0.3.4-2
- Updated BuildRequires to contain libestr-devel
* Wed Aug 1 2012 Milan Bartos <mbartos@redhat.com> - 0.3.4-1
- initial port

View File

@ -0,0 +1 @@
d9943c1691d8953b13956d61ae8caa03 liblognorm-0.3.4.tar.gz