syslog-summary-commits Mailing List for SysLog Summary
Brought to you by:
dpaleino
You can subscribe to this list here.
| 2008 |
Jan
|
Feb
|
Mar
|
Apr
(4) |
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
|---|
|
From: <dpa...@us...> - 2008-04-26 16:15:54
|
Revision: 4
http://syslog-summary.svn.sourceforge.net/syslog-summary/?rev=4&view=rev
Author: dpaleino
Date: 2008-04-26 09:15:14 -0700 (Sat, 26 Apr 2008)
Log Message:
-----------
Added AUTHORS, NEWS, README.
Removed useless comments from the docbook source of the manpage.
Modified Paths:
--------------
trunk/syslog-summary.1.xml
Added Paths:
-----------
trunk/AUTHORS
trunk/NEWS
trunk/README
Added: trunk/AUTHORS
===================================================================
--- trunk/AUTHORS (rev 0)
+++ trunk/AUTHORS 2008-04-26 16:15:14 UTC (rev 4)
@@ -0,0 +1 @@
+David Paleino <d.p...@gm...>
Added: trunk/NEWS
===================================================================
Added: trunk/README
===================================================================
--- trunk/README (rev 0)
+++ trunk/README 2008-04-26 16:15:14 UTC (rev 4)
@@ -0,0 +1 @@
+Still to be written, sorry :(
Modified: trunk/syslog-summary.1.xml
===================================================================
--- trunk/syslog-summary.1.xml 2008-04-26 15:48:51 UTC (rev 3)
+++ trunk/syslog-summary.1.xml 2008-04-26 16:15:14 UTC (rev 4)
@@ -3,61 +3,12 @@
href="http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl"?>
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
-
-<!--
-
-`xsltproc -''-nonet \
- -''-param man.charmap.use.subset "0" \
- -''-param make.year.ranges "1" \
- -''-param make.single.year.ranges "1" \
- /usr/share/xml/docbook/stylesheet/nwalsh/manpages/docbook.xsl \
- manpage.xml'
-
-A manual page <package>.<section> will be generated. You may view the
-manual page with: nroff -man <package>.<section> | less'. A typical entry
-in a Makefile or Makefile.am is:
-
-DB2MAN = /usr/share/sgml/docbook/stylesheet/xsl/nwalsh/manpages/docbook.xsl
-XP = xsltproc -''-nonet -''-param man.charmap.use.subset "0"
-
-manpage.1: manpage.xml
- $(XP) $(DB2MAN) $<
-
-The xsltproc binary is found in the xsltproc package. The XSL files are in
-docbook-xsl. A description of the parameters you can use can be found in the
-docbook-xsl-doc-* packages. Please remember that if you create the nroff
-version in one of the debian/rules file targets (such as build), you will need
-to include xsltproc and docbook-xsl in your Build-Depends control field.
-Alternatively use the xmlto command/package. That will also automatically
-pull in xsltproc and docbook-xsl.
-
-Notes for using docbook2x: docbook2x-man does not automatically create the
-AUTHOR(S) and COPYRIGHT sections. In this case, please add them manually as
-<refsect1> ... </refsect1>.
-
-To disable the automatic creation of the AUTHOR(S) and COPYRIGHT sections
-read /usr/share/doc/docbook-xsl/doc/manpages/authors.html. This file can be
-found in the docbook-xsl-doc-html package.
-
-Validation can be done using: `xmllint -''-noout -''-valid manpage.xml`
-
-General documentation about man-pages and man-page-formatting:
-man(1), man(7), http://www.tldp.org/HOWTO/Man-Page/
-
--->
-
- <!-- Fill in your name for FIRSTNAME and SURNAME. -->
<!ENTITY dhfirstname "David">
<!ENTITY dhsurname "Paleino">
<!-- dhusername could also be set to "&firstname; &surname;". -->
<!ENTITY dhusername "David Paleino">
<!ENTITY dhemail "d.p...@gm...">
- <!-- SECTION should be 1-8, maybe w/ subsection other parameters are
- allowed: see man(7), man(1) and
- http://www.tldp.org/HOWTO/Man-Page/q2.html. -->
<!ENTITY dhsection "1">
- <!-- TITLE should be something like "User commands" or similar (see
- http://www.tldp.org/HOWTO/Man-Page/q2.html). -->
<!ENTITY dhtitle "Syslog-Summary User Manual">
<!ENTITY dhucpackage "SYSLOG-SUMMARY">
<!ENTITY dhpackage "syslog-summary">
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <dpa...@us...> - 2008-04-26 15:49:09
|
Revision: 3
http://syslog-summary.svn.sourceforge.net/syslog-summary/?rev=3&view=rev
Author: dpaleino
Date: 2008-04-26 08:48:51 -0700 (Sat, 26 Apr 2008)
Log Message:
-----------
* branches/, tags/ and trunk/ created
* Files moved under the new hierarchy.
Added Paths:
-----------
branches/
tags/
trunk/
trunk/ChangeLog
trunk/Makefile
trunk/ignore.rules
trunk/syslog-summary
trunk/syslog-summary.1
trunk/syslog-summary.1.xml
Removed Paths:
-------------
ChangeLog
Makefile
ignore.rules
syslog-summary
syslog-summary.1
syslog-summary.1.xml
Deleted: ChangeLog
===================================================================
--- ChangeLog 2008-04-26 15:46:22 UTC (rev 2)
+++ ChangeLog 2008-04-26 15:48:51 UTC (rev 3)
@@ -1,13 +0,0 @@
-syslog-summary (1.14)
-
- * Added ability to read gzip compressed files, using python-magic or, if
- unavailable, os.path.splitext as fallback.
- * Added this ChangeLog file to track changes made to the sourcecode.
- * Moved regexp matching (ignore rules) earlier in the code (i.e. right
- after reading the line).
- * Using hashlib (Python 2.5) instead of the deprecated md5 module
- * printable_md5() removed: using hexdigest() method of the hashlib object.
- * Using SHA-256 instead of MD5 now.
- * Imported into SourceForge's SVN repository.
-
- -- David Paleino <d.p...@gm...> Sat, 26 Apr 2008 17:45:51 +0200
Deleted: Makefile
===================================================================
--- Makefile 2008-04-26 15:46:22 UTC (rev 2)
+++ Makefile 2008-04-26 15:48:51 UTC (rev 3)
@@ -1,16 +0,0 @@
-XP = xsltproc --nonet \
- --param man.charmap.use.subset "0" \
- --param make.year.ranges "1" \
- --param make.single.year.ranges "1"
-
-install:
- install -m 755 syslog-summary $(DESTDIR)/usr/bin/syslog-summary
- install -m 644 ignore.rules $(DESTDIR)/etc/syslog-summary/ignore.rules
-
-uninstall:
- [ ! -f $(DESTDIR)/usr/bin/syslog-summary ] || rm -v $(DESTDIR)/usr/bin/syslog-summary
- [ ! -d $(DESTDIR)/etc/syslog-summary ] || rm -vrf $(DESTDIR)/etc/syslog-summary/
-
-syslog-summary.1: syslog-summary.1.xml
- $(XP) $<
-
Deleted: ignore.rules
===================================================================
--- ignore.rules 2008-04-26 15:46:22 UTC (rev 2)
+++ ignore.rules 2008-04-26 15:48:51 UTC (rev 3)
@@ -1,5 +0,0 @@
-#
-# Use this file to define regular expressions to ignore.
-#
-#last message repeated [0-9]* times
-#kernel: Checking 'hlt' instruction... Ok.
Deleted: syslog-summary
===================================================================
--- syslog-summary 2008-04-26 15:46:22 UTC (rev 2)
+++ syslog-summary 2008-04-26 15:48:51 UTC (rev 3)
@@ -1,310 +0,0 @@
-#!/usr/bin/env python2.5
-# -*- coding: utf-8 -*-
-
-# Copyright © 2008, David Paleino <d.p...@gm...>
-# © 2001-2008, Tommi Virtanen <tv...@de...>
-# © 1998-2000, Lars Wirzenius <li...@ik...>
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program 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 General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
-# MA 02110-1301, USA.
-
-"""Summarize the contents of a syslog log file.
-
-The syslog(3) service writes system log messages in a certain format:
-
- Jan 17 19:21:50 zeus kernel: klogd 1.3-3, log source = /proc/kmsg started.
-
-This program summarizes the contents of such a file, by displaying each
-unique (except for the time) line once, and also the number of times such
-a line occurs in the input. The lines are displayed in the order they occur
-in the input.
-
-Lars Wirzenius <li...@ik...>"""
-
-IGNORE_FILENAME = "/etc/syslog-summary/ignore"
-STATE_FILENAME = None
-REPEAT = False
-QUIET = False
-DEBUG = False
-
-version = "1.14"
-
-import sys
-import re
-import getopt
-import string
-import hashlib
-from gzip import open as gzopen
-
-datepats = [
- re.compile(r"^(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) [ 0-9][0-9] [ 0-9][0-9]:[0-9][0-9]:[0-9][0-9] "),
- re.compile(r"^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) [ 0-9][0-9][0-9][0-9]:[0-9][0-9] "),
- re.compile(r"^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) [ 0-9][0-9][0-9][0-9]:[0-9][0-9]:[0-9][0-9] "),
-]
-pidpat = re.compile(r"^([^ ]* [^ ]*)\[[0-9][0-9]*\]: ")
-repeatpat = re.compile(r"^[^ ]* last message repeated (\d+) times$")
-
-ignore_pats = []
-
-def io_error(err, filename, die=True):
- """Prints a nice error message, i.e. Tracebacks are ugly to end users"""
- import os, errno, traceback
- num = err.errno
- # DEBUG && die ensures that if it's a non-fatal exception, we don't
- # show all the traceback mess...
- if DEBUG:
- if die:
- traceback.print_exc(file=sys.stderr)
- else:
- print "[E] %s [%s(%s) - %s]" % (os.strerror(num), errno.errorcode[num], num, filename)
-
- if die:
- sys.exit(1)
-
-def read_patterns(filename):
- """Reads patterns to ignore from file specified by -i | --ignore="""
- pats = []
- try:
- f = open(filename, "r")
- except IOError, e:
- io_error(e, filename, False)
- return []
- for line in f:
- rule = line.strip()
- if rule[0:1] == "#":
- continue
- else:
- pats.append(re.compile(rule))
- f.close()
- return pats
-
-def read_states(filename):
- """Reads the previous state saved into the argument of -s | --state="""
- states = {}
- if not filename:
- return states
- try:
- f = open(filename, "r")
- except IOError, e:
- io_error(e, filename, False)
- return states
- for line in f:
- fields = string.split(line)
- states[fields[0]] = (string.atoi(fields[1]), fields[2])
- f.close()
- return states
-
-def save_states(filename, states):
- if not filename:
- return
- try:
- f = open(filename, "w")
- except IOError, e:
- io_error(e, filename, True)
- for filename in states.keys():
- value = states[filename]
- f.write("%s %d %s\n" % (filename, value[0], value[1]))
- f.close()
-
-def should_be_ignored(line):
- for pat in ignore_pats:
- if pat.search(line):
- return 1
- return 0
-
-def split_date(line):
- for pat in datepats:
- m = pat.match(line)
- if m:
- return line[:m.end()], line[m.end():]
- print "line has bad date", "<" + string.rstrip(line) + ">"
- return None, line
-
-def is_gzipped(filename):
- """Returns True if the filename is a gzipped compressed file"""
- try:
- import magic
- ms = magic.open(magic.MAGIC_NONE)
- ms.load()
- if re.search("^gzip compressed data.*", ms.file(filename)):
- return True
- else:
- return False
- except:
- from os.path import splitext
-
- if not QUIET:
- print "Using fallback detection... please install python-magic for better gzip detection."
-
- if splitext(filename)[1] == ".gz":
- return True
- else:
- return False
-
-def summarize(filename, states):
- counts = {}
- order = []
- ignored_count = 0
- if not QUIET:
- print "Summarizing %s" % filename
-
- # If the file is a gzipped log, open it
- # using the proper function from the gzip
- # module.
- try:
- if is_gzipped(filename):
- file = gzopen(filename, "rb")
- else:
- file = open(filename, "r")
- except IOError, e:
- io_error(e, filename, True)
-
- linecount = 0
-
- shaobj = hashlib.sha256()
- if filename in states:
- oldlines, oldsha = states[filename]
- for i in xrange(oldlines):
- line = file.readline()
- shaobj.update(line)
- print "OLD-new: %s" % shaobj.hexdigest()
- print "OLD-file: %s" % oldsha
- if shaobj.hexdigest() != oldsha:
- #file.seek(0, 0)
- file.seek(0)
- shaobj = hashlib.sha256()
- else:
- linecount = oldlines
- if not QUIET:
- print "%8d Lines skipped (already processed)" % linecount
-
- line = file.readline()
- previous = None
- print "BEFORE-while: %s" % shaobj.hexdigest()
- foo=0
- while line:
- foo+=1
- shaobj.update(line)
- linecount += 1
-
- if should_be_ignored(line):
- ignored_count += 1
- if DEBUG:
- print "Ignoring: %s" % line
- line = file.readline()
-
- date, rest = split_date(line)
- if date:
- found = pidpat.search(rest)
- if found:
- rest = found.group(1) + ": " + rest[found.end():]
-
- count = 1
- repeated = None
- if REPEAT:
- repeated = repeatpat.search(rest)
- if repeated and previous:
- count = int(repeated.group(1))
- rest = previous
-
- if counts.has_key(rest):
- counts[rest] = counts[rest] + count
- else:
- assert count == 1
- counts[rest] = count
- order.append(rest)
-
- if not repeated:
- previous = rest
- line = file.readline()
- file.close()
-
- print "TOT-lines: %d" % linecount
- print "TOT-ignor: %d" % ignored_count
- print "AFTER-while: %s" % shaobj.hexdigest()
- print foo
- states[filename] = (linecount + ignored_count, shaobj.hexdigest())
- print states
-
- if QUIET and order:
- print "Summarizing %s" % filename
- if not QUIET or order:
- print "%8d Patterns to ignore" % len(ignore_pats)
- print "%8d Ignored lines" % ignored_count
- for rest in order:
- print "%8d %s" % (counts[rest], rest),
- if not QUIET or order:
- print
-
-def show_usage(opt = ""):
- print """Syslog-Summary %s
-Usage: syslog-summary [options] <logfile> [<logfile> ...]
-
-Options available:
-
--i <arg>
---ignore=<arg> read regular expressions from <arg>, and ignore lines in the
- <logfile> that match them
--s <arg>
---state=<arg> read state information from filename (see the man page)
--r
---repeat merge "last message repeated x times" with the event repeated
--q
---quiet don't output anything, unless there were unmatched lines
--d
---debug shows additional messages in case of error
--h
---help show this help message and exit
-
-This program must be run with proper privileges to read log files!""" % version
-
- if opt:
- print "Option \"%s\" not recognized." % opt
-
- sys.exit(0)
-
-def main():
- global ignore_pats, IGNORE_FILENAME, STATE_FILENAME, REPEAT, QUIET, DEBUG
-
- opts, args = getopt.getopt(sys.argv[1:], "i:qs:rhd", [
- "ignore=", "quiet", "state=", "repeat", "help", "debug" ])
-
- if len(sys.argv) == 1:
- show_usage()
-
- for opt, optarg in opts:
- if opt == "-i" or opt == "--ignore":
- IGNORE_FILENAME = optarg
- elif opt == "-s" or opt == "--state":
- STATE_FILENAME = optarg
- elif opt == "-r" or opt == "--repeat":
- REPEAT = True
- elif opt == "-q" or opt == "--quiet":
- QUIET = True
- elif opt == "-h" or opt == "--help":
- show_usage()
- elif opt == "-d" or opt == "--debug":
- DEBUG = True
- else:
- show_usage(opt)
-
- ignore_pats = read_patterns(IGNORE_FILENAME)
- states = read_states(STATE_FILENAME)
- for filename in args:
- summarize(filename, states)
- save_states(STATE_FILENAME, states)
-
-if __name__ == "__main__":
- main()
Deleted: syslog-summary.1
===================================================================
--- syslog-summary.1 2008-04-26 15:46:22 UTC (rev 2)
+++ syslog-summary.1 2008-04-26 15:48:51 UTC (rev 3)
@@ -1,137 +0,0 @@
-.\" Title: SYSLOG-SUMMARY
-.\" Author: Lars Wirzenius <li...@ik...>
-.\" Generator: DocBook XSL Stylesheets v1.73.2 <http://docbook.sf.net/>
-.\" Date: 02/07/2008
-.\" Manual: Syslog-Summary User Manual
-.\" Source: syslog-summary
-.\"
-.TH "SYSLOG\-SUMMARY" "1" "02/07/2008" "syslog-summary" "Syslog-Summary User Manual"
-.\" disable hyphenation
-.nh
-.\" disable justification (adjust text to left margin only)
-.ad l
-.SH "NAME"
-syslog-summary - summarize the contents of a syslog log file
-.SH "SYNOPSIS"
-.HP 15
-\fBsyslog\-summary\fR [\fB\-s\fR\ |\ \fB\-\-state=\fR\ \fIfilename\fR] [\fB\-i\fR\ |\ \fB\-\-ignore=\fR\ \fIfilename\fR] [\fB\-d\fR\ |\ \fB\-\-debug\fR] [\fB\-r\fR\ |\ \fB\-\-repeat\fR] \fIlogfile\fR...
-.HP 15
-\fBsyslog\-summary\fR [\fB\-h\fR\ |\ \fB\-\-help\fR]
-.SH "DESCRIPTION"
-.PP
-This manual page documents briefly the
-\fBsyslog\-summary\fR
-command\.
-.PP
-\fBsyslog\-summary\fR
-summarizes the contents of log files via the
-\fBsyslog\fR(3)
-service, by displaying each unique (except for the time) line once, and also the number of times such a line occurs in the input\. The lines are displayed in the order they occur in the input\.
-.SH "OPTIONS"
-.PP
-\fB\-i \fR\fB\fIfilename\fR\fR, \fB\-\-ignore=\fR\fB\fIfilename\fR\fR
-.RS 4
-Read regular expressions from
-\fIfilename\fR
-and ignore lines in the logfiles that match them\.
-.RE
-.PP
-\fB\-s \fR\fB\fIfilename\fR\fR, \fB\-\-state=\fR\fB\fIfilename\fR\fR
-.RS 4
-Read state information from
-\fIfilename\fR\. The state contains information about the already reported parts of a log file, and prevents
-\fBsyslog\-summary\fR
-from reporting the same things many times\. This is useful when
-\fBsyslog\-summary\fR
-is run from
-\fBcrontab\fR
-every hour\. The file is created, if it doesn\'t exist already\.
-.RE
-.PP
-\fB\-r\fR, \fB\-\-repeat\fR
-.RS 4
-Merge "last message repeated * times" lines with the repeated event\.
-.RE
-.PP
-\fB\-d\fR, \fB\-\-debug\fR
-.RS 4
-Enable verbose messages when errors occur (i\.e\. "debug mode")\.
-.RE
-.PP
-\fB\-h\fR, \fB\-\-help\fR
-.RS 4
-Show summary of options\.
-.RE
-.SH "FILES"
-.PP
-\fI/etc/syslog\-summary/ignore\.rules\fR
-.RS 4
-Default ignore\.rules file with default regular expressions\.
-.RE
-.SH "DIAGNOSTICS"
-.PP
-When reporting a bug, please run
-\fBsyslog\-summary\fR
-with the
-\fB\-d\fR
-(or
-\fB\-\-debug\fR) flag enabled\.
-.PP
-\fBsyslog\-summary\fR
-provides some return codes, that can be used in scripts:
-.\" line length increase to cope w/ tbl weirdness
-.ll +(\n(LLu * 62u / 100u)
-.TS
-ll.
-\fICode\fR \fIDiagnostic\fR
-T{
-\fB0\fR
-T} T{
-Program exited successfully\.
-T}
-T{
-\fB1\fR
-T} T{
-Something went wrong, please run the program with the debug messages enabled\.
-T}
-.TE
-.\" line length decrease back to previous value
-.ll -(\n(LLu * 62u / 100u)
-.sp
-.SH "AUTHORS"
-.PP
-\fBLars Wirzenius\fR <\&liw@iki\.fi\&>
-.sp -1n
-.IP "" 4
-Wrote this manpage for the Debian system\.
-.sp -1n
-.IP "" 4
-Wrote the first version of syslog\-summary\.
-.sp -1n
-.IP "" 4
-Maintained the Debian package from 1998 to 2000\.
-.PP
-\fBTommi Virtanen\fR <\&tv@debian\.org\&>
-.sp -1n
-.IP "" 4
-Maintained the package from 2001 to early 2008\.
-.PP
-\fBDavid Paleino\fR <\&d\.paleino@gmail\.com\&>
-.sp -1n
-.IP "" 4
-Maintains the package since early 2008\.
-.SH "COPYRIGHT"
-Copyright \(co 2008 David Paleino
-.br
-Copyright \(co 2001-2007 Tommi Virtanen
-.br
-Copyright \(co 1998-2000 Lars Wirzenius
-.br
-.PP
-This manual page was written for the Debian system (but may be used by others)\.
-.PP
-Permission is granted to copy, distribute and/or modify this document under the terms of the GNU General Public License, Version 3 or (at your option) any later version published by the Free Software Foundation\.
-.PP
-On Debian systems, the complete text of the GNU General Public License can be found in
-\fI/usr/share/common\-licenses/GPL\fR\.
-.sp
Deleted: syslog-summary.1.xml
===================================================================
--- syslog-summary.1.xml 2008-04-26 15:46:22 UTC (rev 2)
+++ syslog-summary.1.xml 2008-04-26 15:48:51 UTC (rev 3)
@@ -1,276 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<?xml-stylesheet type="text/xsl"
- href="http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl"?>
-<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
-"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
-
-<!--
-
-`xsltproc -''-nonet \
- -''-param man.charmap.use.subset "0" \
- -''-param make.year.ranges "1" \
- -''-param make.single.year.ranges "1" \
- /usr/share/xml/docbook/stylesheet/nwalsh/manpages/docbook.xsl \
- manpage.xml'
-
-A manual page <package>.<section> will be generated. You may view the
-manual page with: nroff -man <package>.<section> | less'. A typical entry
-in a Makefile or Makefile.am is:
-
-DB2MAN = /usr/share/sgml/docbook/stylesheet/xsl/nwalsh/manpages/docbook.xsl
-XP = xsltproc -''-nonet -''-param man.charmap.use.subset "0"
-
-manpage.1: manpage.xml
- $(XP) $(DB2MAN) $<
-
-The xsltproc binary is found in the xsltproc package. The XSL files are in
-docbook-xsl. A description of the parameters you can use can be found in the
-docbook-xsl-doc-* packages. Please remember that if you create the nroff
-version in one of the debian/rules file targets (such as build), you will need
-to include xsltproc and docbook-xsl in your Build-Depends control field.
-Alternatively use the xmlto command/package. That will also automatically
-pull in xsltproc and docbook-xsl.
-
-Notes for using docbook2x: docbook2x-man does not automatically create the
-AUTHOR(S) and COPYRIGHT sections. In this case, please add them manually as
-<refsect1> ... </refsect1>.
-
-To disable the automatic creation of the AUTHOR(S) and COPYRIGHT sections
-read /usr/share/doc/docbook-xsl/doc/manpages/authors.html. This file can be
-found in the docbook-xsl-doc-html package.
-
-Validation can be done using: `xmllint -''-noout -''-valid manpage.xml`
-
-General documentation about man-pages and man-page-formatting:
-man(1), man(7), http://www.tldp.org/HOWTO/Man-Page/
-
--->
-
- <!-- Fill in your name for FIRSTNAME and SURNAME. -->
- <!ENTITY dhfirstname "David">
- <!ENTITY dhsurname "Paleino">
- <!-- dhusername could also be set to "&firstname; &surname;". -->
- <!ENTITY dhusername "David Paleino">
- <!ENTITY dhemail "d.p...@gm...">
- <!-- SECTION should be 1-8, maybe w/ subsection other parameters are
- allowed: see man(7), man(1) and
- http://www.tldp.org/HOWTO/Man-Page/q2.html. -->
- <!ENTITY dhsection "1">
- <!-- TITLE should be something like "User commands" or similar (see
- http://www.tldp.org/HOWTO/Man-Page/q2.html). -->
- <!ENTITY dhtitle "Syslog-Summary User Manual">
- <!ENTITY dhucpackage "SYSLOG-SUMMARY">
- <!ENTITY dhpackage "syslog-summary">
-]>
-
-<refentry>
- <refentryinfo>
- <title>&dhtitle;</title>
- <productname>&dhpackage;</productname>
- <authorgroup>
- <author>
- <firstname>Lars</firstname>
- <surname>Wirzenius</surname>
- <contrib>Wrote this manpage for the Debian system.</contrib>
- <contrib>Wrote the first version of &dhpackage;.</contrib>
- <contrib>Maintained the Debian package from 1998 to 2000.</contrib>
- <address>
- <email>li...@ik...</email>
- </address>
- </author>
- <author>
- <firstname>Tommi</firstname>
- <surname>Virtanen</surname>
- <contrib>Maintained the package from 2001 to early 2008.</contrib>
- <address>
- <email>tv...@de...</email>
- </address>
- </author>
- <author>
- <firstname>David</firstname>
- <surname>Paleino</surname>
- <contrib>Maintains the package since early 2008.</contrib>
- <address>
- <email>d.p...@gm...</email>
- </address>
- </author>
- </authorgroup>
- <copyright>
- <year>2008</year>
- <holder>David Paleino</holder>
- </copyright>
- <copyright>
- <year>2001</year>
- <year>2002</year>
- <year>2003</year>
- <year>2004</year>
- <year>2005</year>
- <year>2006</year>
- <year>2007</year>
- <holder>Tommi Virtanen</holder>
- </copyright>
- <copyright>
- <year>1998</year>
- <year>1999</year>
- <year>2000</year>
- <holder>Lars Wirzenius</holder>
- </copyright>
- <legalnotice>
- <para>This manual page was written for the Debian system
- (but may be used by others).</para>
- <para>Permission is granted to copy, distribute and/or modify this
- document under the terms of the GNU General Public License,
- Version 3 or (at your option) any later version published by
- the Free Software Foundation.</para>
- <para>On Debian systems, the complete text of the GNU General Public
- License can be found in
- <filename>/usr/share/common-licenses/GPL</filename>.</para>
- </legalnotice>
- </refentryinfo>
- <refmeta>
- <refentrytitle>&dhucpackage;</refentrytitle>
- <manvolnum>&dhsection;</manvolnum>
- </refmeta>
- <refnamediv>
- <refname>&dhpackage;</refname>
- <refpurpose>summarize the contents of a syslog log file</refpurpose>
- </refnamediv>
- <refsynopsisdiv>
- <cmdsynopsis>
- <command>&dhpackage;</command>
- <!-- These are several examples, how syntaxes could look -->
- <arg choice="opt">
- <group choice="plain">
- <arg choice="plain"><option>-s</option></arg>
- <arg choice="plain"><option>--state=</option></arg>
- </group>
- <replaceable class="option">filename</replaceable>
- </arg>
- <arg choice="opt">
- <group choice="plain">
- <arg choice="plain"><option>-i</option></arg>
- <arg choice="plain"><option>--ignore=</option></arg>
- </group>
- <replaceable class="option">filename</replaceable>
- </arg>
- <arg choice="opt">
- <group choice="plain">
- <arg choice="plain"><option>-d</option></arg>
- <arg choice="plain"><option>--debug</option></arg>
- </group>
- </arg>
- <arg choice="opt">
- <group choice="plain">
- <arg choice="plain"><option>-r</option></arg>
- <arg choice="plain"><option>--repeat</option></arg>
- </group>
- </arg>
- <arg choice="plain" rep="repeat"><replaceable>logfile</replaceable></arg>
- </cmdsynopsis>
- <cmdsynopsis>
- <command>&dhpackage;</command>
- <!-- Normally the help and version options make the programs stop
- right after outputting the requested information. -->
- <arg choice="opt">
- <group choice="plain">
- <arg choice="plain"><option>-h</option></arg>
- <arg choice="plain"><option>--help</option></arg>
- </group>
- </arg>
- </cmdsynopsis>
- </refsynopsisdiv>
- <refsect1 id="description">
- <title>DESCRIPTION</title>
- <para>This manual page documents briefly the
- <command>&dhpackage;</command> command.</para>
- <para><command>&dhpackage;</command> summarizes the contents of log files
- via the
- <citerefentry>
- <refentrytitle>syslog</refentrytitle>
- <manvolnum>3</manvolnum>
- </citerefentry>
- service, by displaying each unique (except for the time) line once, and also
- the number of times such a line occurs in the input. The lines are displayed
- in the order they occur in the input.</para>
- </refsect1>
- <refsect1 id="options">
- <title>OPTIONS</title>
- <variablelist>
- <!-- Use the variablelist.term.separator and the
- variablelist.term.break.after parameters to
- control the term elements. -->
- <varlistentry>
- <term><option>-i <replaceable>filename</replaceable></option></term>
- <term><option>--ignore=<replaceable>filename</replaceable></option></term>
- <listitem>
- <para>Read regular expressions from <replaceable>filename</replaceable>
- and ignore lines in the logfiles that match them.</para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><option>-s <replaceable>filename</replaceable></option></term>
- <term><option>--state=<replaceable>filename</replaceable></option></term>
- <listitem>
- <para>Read state information from <replaceable>filename</replaceable>.
- The state contains information about the already reported parts of a log
- file, and prevents <command>syslog-summary</command> from reporting the
- same things many times. This is useful when <command>syslog-summary</command>
- is run from <command>crontab</command> every hour. The file is created,
- if it doesn't exist already.</para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><option>-r</option></term>
- <term><option>--repeat</option></term>
- <listitem>
- <para>Merge "last message repeated * times" lines with the repeated
- event.</para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><option>-d</option></term>
- <term><option>--debug</option></term>
- <listitem>
- <para>Enable verbose messages when errors occur (i.e. "debug mode").</para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><option>-h</option></term>
- <term><option>--help</option></term>
- <listitem>
- <para>Show summary of options.</para>
- </listitem>
- </varlistentry>
- </variablelist>
- </refsect1>
- <refsect1 id="files">
- <title>FILES</title>
- <variablelist>
- <varlistentry>
- <term><filename>/etc/syslog-summary/ignore.rules</filename></term>
- <listitem>
- <para>Default ignore.rules file with default regular expressions.</para>
- </listitem>
- </varlistentry>
- </variablelist>
- </refsect1>
- <refsect1 id="diagnostics">
- <title>DIAGNOSTICS</title>
- <para>When reporting a bug, please run <command>syslog-summary</command>
- with the <option>-d</option> (or <option>--debug</option>) flag enabled.</para>
- <para><command>&dhpackage;</command> provides some return codes, that can
- be used in scripts:</para>
- <segmentedlist>
- <segtitle>Code</segtitle>
- <segtitle>Diagnostic</segtitle>
- <seglistitem>
- <seg><errorcode>0</errorcode></seg>
- <seg>Program exited successfully.</seg>
- </seglistitem>
- <seglistitem>
- <seg><errorcode>1</errorcode></seg>
- <seg>Something went wrong, please run the program with the debug messages enabled.</seg>
- </seglistitem>
- </segmentedlist>
- </refsect1>
-</refentry>
Copied: trunk/ChangeLog (from rev 2, ChangeLog)
===================================================================
--- trunk/ChangeLog (rev 0)
+++ trunk/ChangeLog 2008-04-26 15:48:51 UTC (rev 3)
@@ -0,0 +1,13 @@
+syslog-summary (1.14)
+
+ * Added ability to read gzip compressed files, using python-magic or, if
+ unavailable, os.path.splitext as fallback.
+ * Added this ChangeLog file to track changes made to the sourcecode.
+ * Moved regexp matching (ignore rules) earlier in the code (i.e. right
+ after reading the line).
+ * Using hashlib (Python 2.5) instead of the deprecated md5 module
+ * printable_md5() removed: using hexdigest() method of the hashlib object.
+ * Using SHA-256 instead of MD5 now.
+ * Imported into SourceForge's SVN repository.
+
+ -- David Paleino <d.p...@gm...> Sat, 26 Apr 2008 17:45:51 +0200
Copied: trunk/Makefile (from rev 1, Makefile)
===================================================================
--- trunk/Makefile (rev 0)
+++ trunk/Makefile 2008-04-26 15:48:51 UTC (rev 3)
@@ -0,0 +1,16 @@
+XP = xsltproc --nonet \
+ --param man.charmap.use.subset "0" \
+ --param make.year.ranges "1" \
+ --param make.single.year.ranges "1"
+
+install:
+ install -m 755 syslog-summary $(DESTDIR)/usr/bin/syslog-summary
+ install -m 644 ignore.rules $(DESTDIR)/etc/syslog-summary/ignore.rules
+
+uninstall:
+ [ ! -f $(DESTDIR)/usr/bin/syslog-summary ] || rm -v $(DESTDIR)/usr/bin/syslog-summary
+ [ ! -d $(DESTDIR)/etc/syslog-summary ] || rm -vrf $(DESTDIR)/etc/syslog-summary/
+
+syslog-summary.1: syslog-summary.1.xml
+ $(XP) $<
+
Copied: trunk/ignore.rules (from rev 1, ignore.rules)
===================================================================
--- trunk/ignore.rules (rev 0)
+++ trunk/ignore.rules 2008-04-26 15:48:51 UTC (rev 3)
@@ -0,0 +1,5 @@
+#
+# Use this file to define regular expressions to ignore.
+#
+#last message repeated [0-9]* times
+#kernel: Checking 'hlt' instruction... Ok.
Copied: trunk/syslog-summary (from rev 1, syslog-summary)
===================================================================
--- trunk/syslog-summary (rev 0)
+++ trunk/syslog-summary 2008-04-26 15:48:51 UTC (rev 3)
@@ -0,0 +1,310 @@
+#!/usr/bin/env python2.5
+# -*- coding: utf-8 -*-
+
+# Copyright © 2008, David Paleino <d.p...@gm...>
+# © 2001-2008, Tommi Virtanen <tv...@de...>
+# © 1998-2000, Lars Wirzenius <li...@ik...>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+# MA 02110-1301, USA.
+
+"""Summarize the contents of a syslog log file.
+
+The syslog(3) service writes system log messages in a certain format:
+
+ Jan 17 19:21:50 zeus kernel: klogd 1.3-3, log source = /proc/kmsg started.
+
+This program summarizes the contents of such a file, by displaying each
+unique (except for the time) line once, and also the number of times such
+a line occurs in the input. The lines are displayed in the order they occur
+in the input.
+
+Lars Wirzenius <li...@ik...>"""
+
+IGNORE_FILENAME = "/etc/syslog-summary/ignore"
+STATE_FILENAME = None
+REPEAT = False
+QUIET = False
+DEBUG = False
+
+version = "1.14"
+
+import sys
+import re
+import getopt
+import string
+import hashlib
+from gzip import open as gzopen
+
+datepats = [
+ re.compile(r"^(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) [ 0-9][0-9] [ 0-9][0-9]:[0-9][0-9]:[0-9][0-9] "),
+ re.compile(r"^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) [ 0-9][0-9][0-9][0-9]:[0-9][0-9] "),
+ re.compile(r"^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) [ 0-9][0-9][0-9][0-9]:[0-9][0-9]:[0-9][0-9] "),
+]
+pidpat = re.compile(r"^([^ ]* [^ ]*)\[[0-9][0-9]*\]: ")
+repeatpat = re.compile(r"^[^ ]* last message repeated (\d+) times$")
+
+ignore_pats = []
+
+def io_error(err, filename, die=True):
+ """Prints a nice error message, i.e. Tracebacks are ugly to end users"""
+ import os, errno, traceback
+ num = err.errno
+ # DEBUG && die ensures that if it's a non-fatal exception, we don't
+ # show all the traceback mess...
+ if DEBUG:
+ if die:
+ traceback.print_exc(file=sys.stderr)
+ else:
+ print "[E] %s [%s(%s) - %s]" % (os.strerror(num), errno.errorcode[num], num, filename)
+
+ if die:
+ sys.exit(1)
+
+def read_patterns(filename):
+ """Reads patterns to ignore from file specified by -i | --ignore="""
+ pats = []
+ try:
+ f = open(filename, "r")
+ except IOError, e:
+ io_error(e, filename, False)
+ return []
+ for line in f:
+ rule = line.strip()
+ if rule[0:1] == "#":
+ continue
+ else:
+ pats.append(re.compile(rule))
+ f.close()
+ return pats
+
+def read_states(filename):
+ """Reads the previous state saved into the argument of -s | --state="""
+ states = {}
+ if not filename:
+ return states
+ try:
+ f = open(filename, "r")
+ except IOError, e:
+ io_error(e, filename, False)
+ return states
+ for line in f:
+ fields = string.split(line)
+ states[fields[0]] = (string.atoi(fields[1]), fields[2])
+ f.close()
+ return states
+
+def save_states(filename, states):
+ if not filename:
+ return
+ try:
+ f = open(filename, "w")
+ except IOError, e:
+ io_error(e, filename, True)
+ for filename in states.keys():
+ value = states[filename]
+ f.write("%s %d %s\n" % (filename, value[0], value[1]))
+ f.close()
+
+def should_be_ignored(line):
+ for pat in ignore_pats:
+ if pat.search(line):
+ return 1
+ return 0
+
+def split_date(line):
+ for pat in datepats:
+ m = pat.match(line)
+ if m:
+ return line[:m.end()], line[m.end():]
+ print "line has bad date", "<" + string.rstrip(line) + ">"
+ return None, line
+
+def is_gzipped(filename):
+ """Returns True if the filename is a gzipped compressed file"""
+ try:
+ import magic
+ ms = magic.open(magic.MAGIC_NONE)
+ ms.load()
+ if re.search("^gzip compressed data.*", ms.file(filename)):
+ return True
+ else:
+ return False
+ except:
+ from os.path import splitext
+
+ if not QUIET:
+ print "Using fallback detection... please install python-magic for better gzip detection."
+
+ if splitext(filename)[1] == ".gz":
+ return True
+ else:
+ return False
+
+def summarize(filename, states):
+ counts = {}
+ order = []
+ ignored_count = 0
+ if not QUIET:
+ print "Summarizing %s" % filename
+
+ # If the file is a gzipped log, open it
+ # using the proper function from the gzip
+ # module.
+ try:
+ if is_gzipped(filename):
+ file = gzopen(filename, "rb")
+ else:
+ file = open(filename, "r")
+ except IOError, e:
+ io_error(e, filename, True)
+
+ linecount = 0
+
+ shaobj = hashlib.sha256()
+ if filename in states:
+ oldlines, oldsha = states[filename]
+ for i in xrange(oldlines):
+ line = file.readline()
+ shaobj.update(line)
+ print "OLD-new: %s" % shaobj.hexdigest()
+ print "OLD-file: %s" % oldsha
+ if shaobj.hexdigest() != oldsha:
+ #file.seek(0, 0)
+ file.seek(0)
+ shaobj = hashlib.sha256()
+ else:
+ linecount = oldlines
+ if not QUIET:
+ print "%8d Lines skipped (already processed)" % linecount
+
+ line = file.readline()
+ previous = None
+ print "BEFORE-while: %s" % shaobj.hexdigest()
+ foo=0
+ while line:
+ foo+=1
+ shaobj.update(line)
+ linecount += 1
+
+ if should_be_ignored(line):
+ ignored_count += 1
+ if DEBUG:
+ print "Ignoring: %s" % line
+ line = file.readline()
+
+ date, rest = split_date(line)
+ if date:
+ found = pidpat.search(rest)
+ if found:
+ rest = found.group(1) + ": " + rest[found.end():]
+
+ count = 1
+ repeated = None
+ if REPEAT:
+ repeated = repeatpat.search(rest)
+ if repeated and previous:
+ count = int(repeated.group(1))
+ rest = previous
+
+ if counts.has_key(rest):
+ counts[rest] = counts[rest] + count
+ else:
+ assert count == 1
+ counts[rest] = count
+ order.append(rest)
+
+ if not repeated:
+ previous = rest
+ line = file.readline()
+ file.close()
+
+ print "TOT-lines: %d" % linecount
+ print "TOT-ignor: %d" % ignored_count
+ print "AFTER-while: %s" % shaobj.hexdigest()
+ print foo
+ states[filename] = (linecount + ignored_count, shaobj.hexdigest())
+ print states
+
+ if QUIET and order:
+ print "Summarizing %s" % filename
+ if not QUIET or order:
+ print "%8d Patterns to ignore" % len(ignore_pats)
+ print "%8d Ignored lines" % ignored_count
+ for rest in order:
+ print "%8d %s" % (counts[rest], rest),
+ if not QUIET or order:
+ print
+
+def show_usage(opt = ""):
+ print """Syslog-Summary %s
+Usage: syslog-summary [options] <logfile> [<logfile> ...]
+
+Options available:
+
+-i <arg>
+--ignore=<arg> read regular expressions from <arg>, and ignore lines in the
+ <logfile> that match them
+-s <arg>
+--state=<arg> read state information from filename (see the man page)
+-r
+--repeat merge "last message repeated x times" with the event repeated
+-q
+--quiet don't output anything, unless there were unmatched lines
+-d
+--debug shows additional messages in case of error
+-h
+--help show this help message and exit
+
+This program must be run with proper privileges to read log files!""" % version
+
+ if opt:
+ print "Option \"%s\" not recognized." % opt
+
+ sys.exit(0)
+
+def main():
+ global ignore_pats, IGNORE_FILENAME, STATE_FILENAME, REPEAT, QUIET, DEBUG
+
+ opts, args = getopt.getopt(sys.argv[1:], "i:qs:rhd", [
+ "ignore=", "quiet", "state=", "repeat", "help", "debug" ])
+
+ if len(sys.argv) == 1:
+ show_usage()
+
+ for opt, optarg in opts:
+ if opt == "-i" or opt == "--ignore":
+ IGNORE_FILENAME = optarg
+ elif opt == "-s" or opt == "--state":
+ STATE_FILENAME = optarg
+ elif opt == "-r" or opt == "--repeat":
+ REPEAT = True
+ elif opt == "-q" or opt == "--quiet":
+ QUIET = True
+ elif opt == "-h" or opt == "--help":
+ show_usage()
+ elif opt == "-d" or opt == "--debug":
+ DEBUG = True
+ else:
+ show_usage(opt)
+
+ ignore_pats = read_patterns(IGNORE_FILENAME)
+ states = read_states(STATE_FILENAME)
+ for filename in args:
+ summarize(filename, states)
+ save_states(STATE_FILENAME, states)
+
+if __name__ == "__main__":
+ main()
Copied: trunk/syslog-summary.1 (from rev 1, syslog-summary.1)
===================================================================
--- trunk/syslog-summary.1 (rev 0)
+++ trunk/syslog-summary.1 2008-04-26 15:48:51 UTC (rev 3)
@@ -0,0 +1,137 @@
+.\" Title: SYSLOG-SUMMARY
+.\" Author: Lars Wirzenius <li...@ik...>
+.\" Generator: DocBook XSL Stylesheets v1.73.2 <http://docbook.sf.net/>
+.\" Date: 02/07/2008
+.\" Manual: Syslog-Summary User Manual
+.\" Source: syslog-summary
+.\"
+.TH "SYSLOG\-SUMMARY" "1" "02/07/2008" "syslog-summary" "Syslog-Summary User Manual"
+.\" disable hyphenation
+.nh
+.\" disable justification (adjust text to left margin only)
+.ad l
+.SH "NAME"
+syslog-summary - summarize the contents of a syslog log file
+.SH "SYNOPSIS"
+.HP 15
+\fBsyslog\-summary\fR [\fB\-s\fR\ |\ \fB\-\-state=\fR\ \fIfilename\fR] [\fB\-i\fR\ |\ \fB\-\-ignore=\fR\ \fIfilename\fR] [\fB\-d\fR\ |\ \fB\-\-debug\fR] [\fB\-r\fR\ |\ \fB\-\-repeat\fR] \fIlogfile\fR...
+.HP 15
+\fBsyslog\-summary\fR [\fB\-h\fR\ |\ \fB\-\-help\fR]
+.SH "DESCRIPTION"
+.PP
+This manual page documents briefly the
+\fBsyslog\-summary\fR
+command\.
+.PP
+\fBsyslog\-summary\fR
+summarizes the contents of log files via the
+\fBsyslog\fR(3)
+service, by displaying each unique (except for the time) line once, and also the number of times such a line occurs in the input\. The lines are displayed in the order they occur in the input\.
+.SH "OPTIONS"
+.PP
+\fB\-i \fR\fB\fIfilename\fR\fR, \fB\-\-ignore=\fR\fB\fIfilename\fR\fR
+.RS 4
+Read regular expressions from
+\fIfilename\fR
+and ignore lines in the logfiles that match them\.
+.RE
+.PP
+\fB\-s \fR\fB\fIfilename\fR\fR, \fB\-\-state=\fR\fB\fIfilename\fR\fR
+.RS 4
+Read state information from
+\fIfilename\fR\. The state contains information about the already reported parts of a log file, and prevents
+\fBsyslog\-summary\fR
+from reporting the same things many times\. This is useful when
+\fBsyslog\-summary\fR
+is run from
+\fBcrontab\fR
+every hour\. The file is created, if it doesn\'t exist already\.
+.RE
+.PP
+\fB\-r\fR, \fB\-\-repeat\fR
+.RS 4
+Merge "last message repeated * times" lines with the repeated event\.
+.RE
+.PP
+\fB\-d\fR, \fB\-\-debug\fR
+.RS 4
+Enable verbose messages when errors occur (i\.e\. "debug mode")\.
+.RE
+.PP
+\fB\-h\fR, \fB\-\-help\fR
+.RS 4
+Show summary of options\.
+.RE
+.SH "FILES"
+.PP
+\fI/etc/syslog\-summary/ignore\.rules\fR
+.RS 4
+Default ignore\.rules file with default regular expressions\.
+.RE
+.SH "DIAGNOSTICS"
+.PP
+When reporting a bug, please run
+\fBsyslog\-summary\fR
+with the
+\fB\-d\fR
+(or
+\fB\-\-debug\fR) flag enabled\.
+.PP
+\fBsyslog\-summary\fR
+provides some return codes, that can be used in scripts:
+.\" line length increase to cope w/ tbl weirdness
+.ll +(\n(LLu * 62u / 100u)
+.TS
+ll.
+\fICode\fR \fIDiagnostic\fR
+T{
+\fB0\fR
+T} T{
+Program exited successfully\.
+T}
+T{
+\fB1\fR
+T} T{
+Something went wrong, please run the program with the debug messages enabled\.
+T}
+.TE
+.\" line length decrease back to previous value
+.ll -(\n(LLu * 62u / 100u)
+.sp
+.SH "AUTHORS"
+.PP
+\fBLars Wirzenius\fR <\&liw@iki\.fi\&>
+.sp -1n
+.IP "" 4
+Wrote this manpage for the Debian system\.
+.sp -1n
+.IP "" 4
+Wrote the first version of syslog\-summary\.
+.sp -1n
+.IP "" 4
+Maintained the Debian package from 1998 to 2000\.
+.PP
+\fBTommi Virtanen\fR <\&tv@debian\.org\&>
+.sp -1n
+.IP "" 4
+Maintained the package from 2001 to early 2008\.
+.PP
+\fBDavid Paleino\fR <\&d\.paleino@gmail\.com\&>
+.sp -1n
+.IP "" 4
+Maintains the package since early 2008\.
+.SH "COPYRIGHT"
+Copyright \(co 2008 David Paleino
+.br
+Copyright \(co 2001-2007 Tommi Virtanen
+.br
+Copyright \(co 1998-2000 Lars Wirzenius
+.br
+.PP
+This manual page was written for the Debian system (but may be used by others)\.
+.PP
+Permission is granted to copy, distribute and/or modify this document under the terms of the GNU General Public License, Version 3 or (at your option) any later version published by the Free Software Foundation\.
+.PP
+On Debian systems, the complete text of the GNU General Public License can be found in
+\fI/usr/share/common\-licenses/GPL\fR\.
+.sp
Copied: trunk/syslog-summary.1.xml (from rev 1, syslog-summary.1.xml)
===================================================================
--- trunk/syslog-summary.1.xml (rev 0)
+++ trunk/syslog-summary.1.xml 2008-04-26 15:48:51 UTC (rev 3)
@@ -0,0 +1,276 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<?xml-stylesheet type="text/xsl"
+ href="http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl"?>
+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
+"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+
+<!--
+
+`xsltproc -''-nonet \
+ -''-param man.charmap.use.subset "0" \
+ -''-param make.year.ranges "1" \
+ -''-param make.single.year.ranges "1" \
+ /usr/share/xml/docbook/stylesheet/nwalsh/manpages/docbook.xsl \
+ manpage.xml'
+
+A manual page <package>.<section> will be generated. You may view the
+manual page with: nroff -man <package>.<section> | less'. A typical entry
+in a Makefile or Makefile.am is:
+
+DB2MAN = /usr/share/sgml/docbook/stylesheet/xsl/nwalsh/manpages/docbook.xsl
+XP = xsltproc -''-nonet -''-param man.charmap.use.subset "0"
+
+manpage.1: manpage.xml
+ $(XP) $(DB2MAN) $<
+
+The xsltproc binary is found in the xsltproc package. The XSL files are in
+docbook-xsl. A description of the parameters you can use can be found in the
+docbook-xsl-doc-* packages. Please remember that if you create the nroff
+version in one of the debian/rules file targets (such as build), you will need
+to include xsltproc and docbook-xsl in your Build-Depends control field.
+Alternatively use the xmlto command/package. That will also automatically
+pull in xsltproc and docbook-xsl.
+
+Notes for using docbook2x: docbook2x-man does not automatically create the
+AUTHOR(S) and COPYRIGHT sections. In this case, please add them manually as
+<refsect1> ... </refsect1>.
+
+To disable the automatic creation of the AUTHOR(S) and COPYRIGHT sections
+read /usr/share/doc/docbook-xsl/doc/manpages/authors.html. This file can be
+found in the docbook-xsl-doc-html package.
+
+Validation can be done using: `xmllint -''-noout -''-valid manpage.xml`
+
+General documentation about man-pages and man-page-formatting:
+man(1), man(7), http://www.tldp.org/HOWTO/Man-Page/
+
+-->
+
+ <!-- Fill in your name for FIRSTNAME and SURNAME. -->
+ <!ENTITY dhfirstname "David">
+ <!ENTITY dhsurname "Paleino">
+ <!-- dhusername could also be set to "&firstname; &surname;". -->
+ <!ENTITY dhusername "David Paleino">
+ <!ENTITY dhemail "d.p...@gm...">
+ <!-- SECTION should be 1-8, maybe w/ subsection other parameters are
+ allowed: see man(7), man(1) and
+ http://www.tldp.org/HOWTO/Man-Page/q2.html. -->
+ <!ENTITY dhsection "1">
+ <!-- TITLE should be something like "User commands" or similar (see
+ http://www.tldp.org/HOWTO/Man-Page/q2.html). -->
+ <!ENTITY dhtitle "Syslog-Summary User Manual">
+ <!ENTITY dhucpackage "SYSLOG-SUMMARY">
+ <!ENTITY dhpackage "syslog-summary">
+]>
+
+<refentry>
+ <refentryinfo>
+ <title>&dhtitle;</title>
+ <productname>&dhpackage;</productname>
+ <authorgroup>
+ <author>
+ <firstname>Lars</firstname>
+ <surname>Wirzenius</surname>
+ <contrib>Wrote this manpage for the Debian system.</contrib>
+ <contrib>Wrote the first version of &dhpackage;.</contrib>
+ <contrib>Maintained the Debian package from 1998 to 2000.</contrib>
+ <address>
+ <email>li...@ik...</email>
+ </address>
+ </author>
+ <author>
+ <firstname>Tommi</firstname>
+ <surname>Virtanen</surname>
+ <contrib>Maintained the package from 2001 to early 2008.</contrib>
+ <address>
+ <email>tv...@de...</email>
+ </address>
+ </author>
+ <author>
+ <firstname>David</firstname>
+ <surname>Paleino</surname>
+ <contrib>Maintains the package since early 2008.</contrib>
+ <address>
+ <email>d.p...@gm...</email>
+ </address>
+ </author>
+ </authorgroup>
+ <copyright>
+ <year>2008</year>
+ <holder>David Paleino</holder>
+ </copyright>
+ <copyright>
+ <year>2001</year>
+ <year>2002</year>
+ <year>2003</year>
+ <year>2004</year>
+ <year>2005</year>
+ <year>2006</year>
+ <year>2007</year>
+ <holder>Tommi Virtanen</holder>
+ </copyright>
+ <copyright>
+ <year>1998</year>
+ <year>1999</year>
+ <year>2000</year>
+ <holder>Lars Wirzenius</holder>
+ </copyright>
+ <legalnotice>
+ <para>This manual page was written for the Debian system
+ (but may be used by others).</para>
+ <para>Permission is granted to copy, distribute and/or modify this
+ document under the terms of the GNU General Public License,
+ Version 3 or (at your option) any later version published by
+ the Free Software Foundation.</para>
+ <para>On Debian systems, the complete text of the GNU General Public
+ License can be found in
+ <filename>/usr/share/common-licenses/GPL</filename>.</para>
+ </legalnotice>
+ </refentryinfo>
+ <refmeta>
+ <refentrytitle>&dhucpackage;</refentrytitle>
+ <manvolnum>&dhsection;</manvolnum>
+ </refmeta>
+ <refnamediv>
+ <refname>&dhpackage;</refname>
+ <refpurpose>summarize the contents of a syslog log file</refpurpose>
+ </refnamediv>
+ <refsynopsisdiv>
+ <cmdsynopsis>
+ <command>&dhpackage;</command>
+ <!-- These are several examples, how syntaxes could look -->
+ <arg choice="opt">
+ <group choice="plain">
+ <arg choice="plain"><option>-s</option></arg>
+ <arg choice="plain"><option>--state=</option></arg>
+ </group>
+ <replaceable class="option">filename</replaceable>
+ </arg>
+ <arg choice="opt">
+ <group choice="plain">
+ <arg choice="plain"><option>-i</option></arg>
+ <arg choice="plain"><option>--ignore=</option></arg>
+ </group>
+ <replaceable class="option">filename</replaceable>
+ </arg>
+ <arg choice="opt">
+ <group choice="plain">
+ <arg choice="plain"><option>-d</option></arg>
+ <arg choice="plain"><option>--debug</option></arg>
+ </group>
+ </arg>
+ <arg choice="opt">
+ <group choice="plain">
+ <arg choice="plain"><option>-r</option></arg>
+ <arg choice="plain"><option>--repeat</option></arg>
+ </group>
+ </arg>
+ <arg choice="plain" rep="repeat"><replaceable>logfile</replaceable></arg>
+ </cmdsynopsis>
+ <cmdsynopsis>
+ <command>&dhpackage;</command>
+ <!-- Normally the help and version options make the programs stop
+ right after outputting the requested information. -->
+ <arg choice="opt">
+ <group choice="plain">
+ <arg choice="plain"><option>-h</option></arg>
+ <arg choice="plain"><option>--help</option></arg>
+ </group>
+ </arg>
+ </cmdsynopsis>
+ </refsynopsisdiv>
+ <refsect1 id="description">
+ <title>DESCRIPTION</title>
+ <para>This manual page documents briefly the
+ <command>&dhpackage;</command> command.</para>
+ <para><command>&dhpackage;</command> summarizes the contents of log files
+ via the
+ <citerefentry>
+ <refentrytitle>syslog</refentrytitle>
+ <manvolnum>3</manvolnum>
+ </citerefentry>
+ service, by displaying each unique (except for the time) line once, and also
+ the number of times such a line occurs in the input. The lines are displayed
+ in the order they occur in the input.</para>
+ </refsect1>
+ <refsect1 id="options">
+ <title>OPTIONS</title>
+ <variablelist>
+ <!-- Use the variablelist.term.separator and the
+ variablelist.term.break.after parameters to
+ control the term elements. -->
+ <varlistentry>
+ <term><option>-i <replaceable>filename</replaceable></option></term>
+ <term><option>--ignore=<replaceable>filename</replaceable></option></term>
+ <listitem>
+ <para>Read regular expressions from <replaceable>filename</replaceable>
+ and ignore lines in the logfiles that match them.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><option>-s <replaceable>filename</replaceable></option></term>
+ <term><option>--state=<replaceable>filename</replaceable></option></term>
+ <listitem>
+ <para>Read state information from <replaceable>filename</replaceable>.
+ The state contains information about the already reported parts of a log
+ file, and prevents <command>syslog-summary</command> from reporting the
+ same things many times. This is useful when <command>syslog-summary</command>
+ is run from <command>crontab</command> every hour. The file is created,
+ if it doesn't exist already.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><option>-r</option></term>
+ <term><option>--repeat</option></term>
+ <listitem>
+ <para>Merge "last message repeated * times" lines with the repeated
+ event.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><option>-d</option></term>
+ <term><option>--debug</option></term>
+ <listitem>
+ <para>Enable verbose messages when errors occur (i.e. "debug mode").</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><option>-h</option></term>
+ <term><option>--help</option></term>
+ <listitem>
+ <para>Show summary of options.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refsect1>
+ <refsect1 id="files">
+ <title>FILES</title>
+ <variablelist>
+ <varlistentry>
+ <term><filename>/etc/syslog-summary/ignore.rules</filename></term>
+ <listitem>
+ <para>Default ignore.rules file with default regular expressions.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refsect1>
+ <refsect1 id="diagnostics">
+ <title>DIAGNOSTICS</title>
+ <para>When reporting a bug, please run <command>syslog-summary</command>
+ with the <option>-d</option> (or <option>--debug</option>) flag enabled.</para>
+ <para><command>&dhpackage;</command> provides some return codes, that can
+ be used in scripts:</para>
+ <segmentedlist>
+ <segtitle>Code</segtitle>
+ <segtitle>Diagnostic</segtitle>
+ <seglistitem>
+ <seg><errorcode>0</errorcode></seg>
+ <seg>Program exited successfully.</seg>
+ </seglistitem>
+ <seglistitem>
+ <seg><errorcode>1</errorcode></seg>
+ <seg>Something went wrong, please run the program with the debug messages enabled.</seg>
+ </seglistitem>
+ </segmentedlist>
+ </refsect1>
+</refentry>
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <dpa...@us...> - 2008-04-26 15:46:39
|
Revision: 2
http://syslog-summary.svn.sourceforge.net/syslog-summary/?rev=2&view=rev
Author: dpaleino
Date: 2008-04-26 08:46:22 -0700 (Sat, 26 Apr 2008)
Log Message:
-----------
Changelog updated: information about SVN repository available.
Modified Paths:
--------------
ChangeLog
Modified: ChangeLog
===================================================================
--- ChangeLog 2008-04-26 15:43:34 UTC (rev 1)
+++ ChangeLog 2008-04-26 15:46:22 UTC (rev 2)
@@ -8,5 +8,6 @@
* Using hashlib (Python 2.5) instead of the deprecated md5 module
* printable_md5() removed: using hexdigest() method of the hashlib object.
* Using SHA-256 instead of MD5 now.
+ * Imported into SourceForge's SVN repository.
- -- David Paleino <d.p...@gm...> Sun, 24 Feb 2008 17:44:06 +0100
+ -- David Paleino <d.p...@gm...> Sat, 26 Apr 2008 17:45:51 +0200
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <dpa...@us...> - 2008-04-26 15:43:41
|
Revision: 1
http://syslog-summary.svn.sourceforge.net/syslog-summary/?rev=1&view=rev
Author: dpaleino
Date: 2008-04-26 08:43:34 -0700 (Sat, 26 Apr 2008)
Log Message:
-----------
First sourcecode commit
Added Paths:
-----------
ChangeLog
Makefile
ignore.rules
syslog-summary
syslog-summary.1
syslog-summary.1.xml
Added: ChangeLog
===================================================================
--- ChangeLog (rev 0)
+++ ChangeLog 2008-04-26 15:43:34 UTC (rev 1)
@@ -0,0 +1,12 @@
+syslog-summary (1.14)
+
+ * Added ability to read gzip compressed files, using python-magic or, if
+ unavailable, os.path.splitext as fallback.
+ * Added this ChangeLog file to track changes made to the sourcecode.
+ * Moved regexp matching (ignore rules) earlier in the code (i.e. right
+ after reading the line).
+ * Using hashlib (Python 2.5) instead of the deprecated md5 module
+ * printable_md5() removed: using hexdigest() method of the hashlib object.
+ * Using SHA-256 instead of MD5 now.
+
+ -- David Paleino <d.p...@gm...> Sun, 24 Feb 2008 17:44:06 +0100
Property changes on: ChangeLog
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: Makefile
===================================================================
--- Makefile (rev 0)
+++ Makefile 2008-04-26 15:43:34 UTC (rev 1)
@@ -0,0 +1,16 @@
+XP = xsltproc --nonet \
+ --param man.charmap.use.subset "0" \
+ --param make.year.ranges "1" \
+ --param make.single.year.ranges "1"
+
+install:
+ install -m 755 syslog-summary $(DESTDIR)/usr/bin/syslog-summary
+ install -m 644 ignore.rules $(DESTDIR)/etc/syslog-summary/ignore.rules
+
+uninstall:
+ [ ! -f $(DESTDIR)/usr/bin/syslog-summary ] || rm -v $(DESTDIR)/usr/bin/syslog-summary
+ [ ! -d $(DESTDIR)/etc/syslog-summary ] || rm -vrf $(DESTDIR)/etc/syslog-summary/
+
+syslog-summary.1: syslog-summary.1.xml
+ $(XP) $<
+
Property changes on: Makefile
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: ignore.rules
===================================================================
--- ignore.rules (rev 0)
+++ ignore.rules 2008-04-26 15:43:34 UTC (rev 1)
@@ -0,0 +1,5 @@
+#
+# Use this file to define regular expressions to ignore.
+#
+#last message repeated [0-9]* times
+#kernel: Checking 'hlt' instruction... Ok.
Property changes on: ignore.rules
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: syslog-summary
===================================================================
--- syslog-summary (rev 0)
+++ syslog-summary 2008-04-26 15:43:34 UTC (rev 1)
@@ -0,0 +1,310 @@
+#!/usr/bin/env python2.5
+# -*- coding: utf-8 -*-
+
+# Copyright © 2008, David Paleino <d.p...@gm...>
+# © 2001-2008, Tommi Virtanen <tv...@de...>
+# © 1998-2000, Lars Wirzenius <li...@ik...>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+# MA 02110-1301, USA.
+
+"""Summarize the contents of a syslog log file.
+
+The syslog(3) service writes system log messages in a certain format:
+
+ Jan 17 19:21:50 zeus kernel: klogd 1.3-3, log source = /proc/kmsg started.
+
+This program summarizes the contents of such a file, by displaying each
+unique (except for the time) line once, and also the number of times such
+a line occurs in the input. The lines are displayed in the order they occur
+in the input.
+
+Lars Wirzenius <li...@ik...>"""
+
+IGNORE_FILENAME = "/etc/syslog-summary/ignore"
+STATE_FILENAME = None
+REPEAT = False
+QUIET = False
+DEBUG = False
+
+version = "1.14"
+
+import sys
+import re
+import getopt
+import string
+import hashlib
+from gzip import open as gzopen
+
+datepats = [
+ re.compile(r"^(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) [ 0-9][0-9] [ 0-9][0-9]:[0-9][0-9]:[0-9][0-9] "),
+ re.compile(r"^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) [ 0-9][0-9][0-9][0-9]:[0-9][0-9] "),
+ re.compile(r"^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) [ 0-9][0-9][0-9][0-9]:[0-9][0-9]:[0-9][0-9] "),
+]
+pidpat = re.compile(r"^([^ ]* [^ ]*)\[[0-9][0-9]*\]: ")
+repeatpat = re.compile(r"^[^ ]* last message repeated (\d+) times$")
+
+ignore_pats = []
+
+def io_error(err, filename, die=True):
+ """Prints a nice error message, i.e. Tracebacks are ugly to end users"""
+ import os, errno, traceback
+ num = err.errno
+ # DEBUG && die ensures that if it's a non-fatal exception, we don't
+ # show all the traceback mess...
+ if DEBUG:
+ if die:
+ traceback.print_exc(file=sys.stderr)
+ else:
+ print "[E] %s [%s(%s) - %s]" % (os.strerror(num), errno.errorcode[num], num, filename)
+
+ if die:
+ sys.exit(1)
+
+def read_patterns(filename):
+ """Reads patterns to ignore from file specified by -i | --ignore="""
+ pats = []
+ try:
+ f = open(filename, "r")
+ except IOError, e:
+ io_error(e, filename, False)
+ return []
+ for line in f:
+ rule = line.strip()
+ if rule[0:1] == "#":
+ continue
+ else:
+ pats.append(re.compile(rule))
+ f.close()
+ return pats
+
+def read_states(filename):
+ """Reads the previous state saved into the argument of -s | --state="""
+ states = {}
+ if not filename:
+ return states
+ try:
+ f = open(filename, "r")
+ except IOError, e:
+ io_error(e, filename, False)
+ return states
+ for line in f:
+ fields = string.split(line)
+ states[fields[0]] = (string.atoi(fields[1]), fields[2])
+ f.close()
+ return states
+
+def save_states(filename, states):
+ if not filename:
+ return
+ try:
+ f = open(filename, "w")
+ except IOError, e:
+ io_error(e, filename, True)
+ for filename in states.keys():
+ value = states[filename]
+ f.write("%s %d %s\n" % (filename, value[0], value[1]))
+ f.close()
+
+def should_be_ignored(line):
+ for pat in ignore_pats:
+ if pat.search(line):
+ return 1
+ return 0
+
+def split_date(line):
+ for pat in datepats:
+ m = pat.match(line)
+ if m:
+ return line[:m.end()], line[m.end():]
+ print "line has bad date", "<" + string.rstrip(line) + ">"
+ return None, line
+
+def is_gzipped(filename):
+ """Returns True if the filename is a gzipped compressed file"""
+ try:
+ import magic
+ ms = magic.open(magic.MAGIC_NONE)
+ ms.load()
+ if re.search("^gzip compressed data.*", ms.file(filename)):
+ return True
+ else:
+ return False
+ except:
+ from os.path import splitext
+
+ if not QUIET:
+ print "Using fallback detection... please install python-magic for better gzip detection."
+
+ if splitext(filename)[1] == ".gz":
+ return True
+ else:
+ return False
+
+def summarize(filename, states):
+ counts = {}
+ order = []
+ ignored_count = 0
+ if not QUIET:
+ print "Summarizing %s" % filename
+
+ # If the file is a gzipped log, open it
+ # using the proper function from the gzip
+ # module.
+ try:
+ if is_gzipped(filename):
+ file = gzopen(filename, "rb")
+ else:
+ file = open(filename, "r")
+ except IOError, e:
+ io_error(e, filename, True)
+
+ linecount = 0
+
+ shaobj = hashlib.sha256()
+ if filename in states:
+ oldlines, oldsha = states[filename]
+ for i in xrange(oldlines):
+ line = file.readline()
+ shaobj.update(line)
+ print "OLD-new: %s" % shaobj.hexdigest()
+ print "OLD-file: %s" % oldsha
+ if shaobj.hexdigest() != oldsha:
+ #file.seek(0, 0)
+ file.seek(0)
+ shaobj = hashlib.sha256()
+ else:
+ linecount = oldlines
+ if not QUIET:
+ print "%8d Lines skipped (already processed)" % linecount
+
+ line = file.readline()
+ previous = None
+ print "BEFORE-while: %s" % shaobj.hexdigest()
+ foo=0
+ while line:
+ foo+=1
+ shaobj.update(line)
+ linecount += 1
+
+ if should_be_ignored(line):
+ ignored_count += 1
+ if DEBUG:
+ print "Ignoring: %s" % line
+ line = file.readline()
+
+ date, rest = split_date(line)
+ if date:
+ found = pidpat.search(rest)
+ if found:
+ rest = found.group(1) + ": " + rest[found.end():]
+
+ count = 1
+ repeated = None
+ if REPEAT:
+ repeated = repeatpat.search(rest)
+ if repeated and previous:
+ count = int(repeated.group(1))
+ rest = previous
+
+ if counts.has_key(rest):
+ counts[rest] = counts[rest] + count
+ else:
+ assert count == 1
+ counts[rest] = count
+ order.append(rest)
+
+ if not repeated:
+ previous = rest
+ line = file.readline()
+ file.close()
+
+ print "TOT-lines: %d" % linecount
+ print "TOT-ignor: %d" % ignored_count
+ print "AFTER-while: %s" % shaobj.hexdigest()
+ print foo
+ states[filename] = (linecount + ignored_count, shaobj.hexdigest())
+ print states
+
+ if QUIET and order:
+ print "Summarizing %s" % filename
+ if not QUIET or order:
+ print "%8d Patterns to ignore" % len(ignore_pats)
+ print "%8d Ignored lines" % ignored_count
+ for rest in order:
+ print "%8d %s" % (counts[rest], rest),
+ if not QUIET or order:
+ print
+
+def show_usage(opt = ""):
+ print """Syslog-Summary %s
+Usage: syslog-summary [options] <logfile> [<logfile> ...]
+
+Options available:
+
+-i <arg>
+--ignore=<arg> read regular expressions from <arg>, and ignore lines in the
+ <logfile> that match them
+-s <arg>
+--state=<arg> read state information from filename (see the man page)
+-r
+--repeat merge "last message repeated x times" with the event repeated
+-q
+--quiet don't output anything, unless there were unmatched lines
+-d
+--debug shows additional messages in case of error
+-h
+--help show this help message and exit
+
+This program must be run with proper privileges to read log files!""" % version
+
+ if opt:
+ print "Option \"%s\" not recognized." % opt
+
+ sys.exit(0)
+
+def main():
+ global ignore_pats, IGNORE_FILENAME, STATE_FILENAME, REPEAT, QUIET, DEBUG
+
+ opts, args = getopt.getopt(sys.argv[1:], "i:qs:rhd", [
+ "ignore=", "quiet", "state=", "repeat", "help", "debug" ])
+
+ if len(sys.argv) == 1:
+ show_usage()
+
+ for opt, optarg in opts:
+ if opt == "-i" or opt == "--ignore":
+ IGNORE_FILENAME = optarg
+ elif opt == "-s" or opt == "--state":
+ STATE_FILENAME = optarg
+ elif opt == "-r" or opt == "--repeat":
+ REPEAT = True
+ elif opt == "-q" or opt == "--quiet":
+ QUIET = True
+ elif opt == "-h" or opt == "--help":
+ show_usage()
+ elif opt == "-d" or opt == "--debug":
+ DEBUG = True
+ else:
+ show_usage(opt)
+
+ ignore_pats = read_patterns(IGNORE_FILENAME)
+ states = read_states(STATE_FILENAME)
+ for filename in args:
+ summarize(filename, states)
+ save_states(STATE_FILENAME, states)
+
+if __name__ == "__main__":
+ main()
Property changes on: syslog-summary
___________________________________________________________________
Name: svn:executable
+ *
Added: syslog-summary.1
===================================================================
--- syslog-summary.1 (rev 0)
+++ syslog-summary.1 2008-04-26 15:43:34 UTC (rev 1)
@@ -0,0 +1,137 @@
+.\" Title: SYSLOG-SUMMARY
+.\" Author: Lars Wirzenius <li...@ik...>
+.\" Generator: DocBook XSL Stylesheets v1.73.2 <http://docbook.sf.net/>
+.\" Date: 02/07/2008
+.\" Manual: Syslog-Summary User Manual
+.\" Source: syslog-summary
+.\"
+.TH "SYSLOG\-SUMMARY" "1" "02/07/2008" "syslog-summary" "Syslog-Summary User Manual"
+.\" disable hyphenation
+.nh
+.\" disable justification (adjust text to left margin only)
+.ad l
+.SH "NAME"
+syslog-summary - summarize the contents of a syslog log file
+.SH "SYNOPSIS"
+.HP 15
+\fBsyslog\-summary\fR [\fB\-s\fR\ |\ \fB\-\-state=\fR\ \fIfilename\fR] [\fB\-i\fR\ |\ \fB\-\-ignore=\fR\ \fIfilename\fR] [\fB\-d\fR\ |\ \fB\-\-debug\fR] [\fB\-r\fR\ |\ \fB\-\-repeat\fR] \fIlogfile\fR...
+.HP 15
+\fBsyslog\-summary\fR [\fB\-h\fR\ |\ \fB\-\-help\fR]
+.SH "DESCRIPTION"
+.PP
+This manual page documents briefly the
+\fBsyslog\-summary\fR
+command\.
+.PP
+\fBsyslog\-summary\fR
+summarizes the contents of log files via the
+\fBsyslog\fR(3)
+service, by displaying each unique (except for the time) line once, and also the number of times such a line occurs in the input\. The lines are displayed in the order they occur in the input\.
+.SH "OPTIONS"
+.PP
+\fB\-i \fR\fB\fIfilename\fR\fR, \fB\-\-ignore=\fR\fB\fIfilename\fR\fR
+.RS 4
+Read regular expressions from
+\fIfilename\fR
+and ignore lines in the logfiles that match them\.
+.RE
+.PP
+\fB\-s \fR\fB\fIfilename\fR\fR, \fB\-\-state=\fR\fB\fIfilename\fR\fR
+.RS 4
+Read state information from
+\fIfilename\fR\. The state contains information about the already reported parts of a log file, and prevents
+\fBsyslog\-summary\fR
+from reporting the same things many times\. This is useful when
+\fBsyslog\-summary\fR
+is run from
+\fBcrontab\fR
+every hour\. The file is created, if it doesn\'t exist already\.
+.RE
+.PP
+\fB\-r\fR, \fB\-\-repeat\fR
+.RS 4
+Merge "last message repeated * times" lines with the repeated event\.
+.RE
+.PP
+\fB\-d\fR, \fB\-\-debug\fR
+.RS 4
+Enable verbose messages when errors occur (i\.e\. "debug mode")\.
+.RE
+.PP
+\fB\-h\fR, \fB\-\-help\fR
+.RS 4
+Show summary of options\.
+.RE
+.SH "FILES"
+.PP
+\fI/etc/syslog\-summary/ignore\.rules\fR
+.RS 4
+Default ignore\.rules file with default regular expressions\.
+.RE
+.SH "DIAGNOSTICS"
+.PP
+When reporting a bug, please run
+\fBsyslog\-summary\fR
+with the
+\fB\-d\fR
+(or
+\fB\-\-debug\fR) flag enabled\.
+.PP
+\fBsyslog\-summary\fR
+provides some return codes, that can be used in scripts:
+.\" line length increase to cope w/ tbl weirdness
+.ll +(\n(LLu * 62u / 100u)
+.TS
+ll.
+\fICode\fR \fIDiagnostic\fR
+T{
+\fB0\fR
+T} T{
+Program exited successfully\.
+T}
+T{
+\fB1\fR
+T} T{
+Something went wrong, please run the program with the debug messages enabled\.
+T}
+.TE
+.\" line length decrease back to previous value
+.ll -(\n(LLu * 62u / 100u)
+.sp
+.SH "AUTHORS"
+.PP
+\fBLars Wirzenius\fR <\&liw@iki\.fi\&>
+.sp -1n
+.IP "" 4
+Wrote this manpage for the Debian system\.
+.sp -1n
+.IP "" 4
+Wrote the first version of syslog\-summary\.
+.sp -1n
+.IP "" 4
+Maintained the Debian package from 1998 to 2000\.
+.PP
+\fBTommi Virtanen\fR <\&tv@debian\.org\&>
+.sp -1n
+.IP "" 4
+Maintained the package from 2001 to early 2008\.
+.PP
+\fBDavid Paleino\fR <\&d\.paleino@gmail\.com\&>
+.sp -1n
+.IP "" 4
+Maintains the package since early 2008\.
+.SH "COPYRIGHT"
+Copyright \(co 2008 David Paleino
+.br
+Copyright \(co 2001-2007 Tommi Virtanen
+.br
+Copyright \(co 1998-2000 Lars Wirzenius
+.br
+.PP
+This manual page was written for the Debian system (but may be used by others)\.
+.PP
+Permission is granted to copy, distribute and/or modify this document under the terms of the GNU General Public License, Version 3 or (at your option) any later version published by the Free Software Foundation\.
+.PP
+On Debian systems, the complete text of the GNU General Public License can be found in
+\fI/usr/share/common\-licenses/GPL\fR\.
+.sp
Property changes on: syslog-summary.1
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: syslog-summary.1.xml
===================================================================
--- syslog-summary.1.xml (rev 0)
+++ syslog-summary.1.xml 2008-04-26 15:43:34 UTC (rev 1)
@@ -0,0 +1,276 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<?xml-stylesheet type="text/xsl"
+ href="http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl"?>
+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
+"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+
+<!--
+
+`xsltproc -''-nonet \
+ -''-param man.charmap.use.subset "0" \
+ -''-param make.year.ranges "1" \
+ -''-param make.single.year.ranges "1" \
+ /usr/share/xml/docbook/stylesheet/nwalsh/manpages/docbook.xsl \
+ manpage.xml'
+
+A manual page <package>.<section> will be generated. You may view the
+manual page with: nroff -man <package>.<section> | less'. A typical entry
+in a Makefile or Makefile.am is:
+
+DB2MAN = /usr/share/sgml/docbook/stylesheet/xsl/nwalsh/manpages/docbook.xsl
+XP = xsltproc -''-nonet -''-param man.charmap.use.subset "0"
+
+manpage.1: manpage.xml
+ $(XP) $(DB2MAN) $<
+
+The xsltproc binary is found in the xsltproc package. The XSL files are in
+docbook-xsl. A description of the parameters you can use can be found in the
+docbook-xsl-doc-* packages. Please remember that if you create the nroff
+version in one of the debian/rules file targets (such as build), you will need
+to include xsltproc and docbook-xsl in your Build-Depends control field.
+Alternatively use the xmlto command/package. That will also automatically
+pull in xsltproc and docbook-xsl.
+
+Notes for using docbook2x: docbook2x-man does not automatically create the
+AUTHOR(S) and COPYRIGHT sections. In this case, please add them manually as
+<refsect1> ... </refsect1>.
+
+To disable the automatic creation of the AUTHOR(S) and COPYRIGHT sections
+read /usr/share/doc/docbook-xsl/doc/manpages/authors.html. This file can be
+found in the docbook-xsl-doc-html package.
+
+Validation can be done using: `xmllint -''-noout -''-valid manpage.xml`
+
+General documentation about man-pages and man-page-formatting:
+man(1), man(7), http://www.tldp.org/HOWTO/Man-Page/
+
+-->
+
+ <!-- Fill in your name for FIRSTNAME and SURNAME. -->
+ <!ENTITY dhfirstname "David">
+ <!ENTITY dhsurname "Paleino">
+ <!-- dhusername could also be set to "&firstname; &surname;". -->
+ <!ENTITY dhusername "David Paleino">
+ <!ENTITY dhemail "d.p...@gm...">
+ <!-- SECTION should be 1-8, maybe w/ subsection other parameters are
+ allowed: see man(7), man(1) and
+ http://www.tldp.org/HOWTO/Man-Page/q2.html. -->
+ <!ENTITY dhsection "1">
+ <!-- TITLE should be something like "User commands" or similar (see
+ http://www.tldp.org/HOWTO/Man-Page/q2.html). -->
+ <!ENTITY dhtitle "Syslog-Summary User Manual">
+ <!ENTITY dhucpackage "SYSLOG-SUMMARY">
+ <!ENTITY dhpackage "syslog-summary">
+]>
+
+<refentry>
+ <refentryinfo>
+ <title>&dhtitle;</title>
+ <productname>&dhpackage;</productname>
+ <authorgroup>
+ <author>
+ <firstname>Lars</firstname>
+ <surname>Wirzenius</surname>
+ <contrib>Wrote this manpage for the Debian system.</contrib>
+ <contrib>Wrote the first version of &dhpackage;.</contrib>
+ <contrib>Maintained the Debian package from 1998 to 2000.</contrib>
+ <address>
+ <email>li...@ik...</email>
+ </address>
+ </author>
+ <author>
+ <firstname>Tommi</firstname>
+ <surname>Virtanen</surname>
+ <contrib>Maintained the package from 2001 to early 2008.</contrib>
+ <address>
+ <email>tv...@de...</email>
+ </address>
+ </author>
+ <author>
+ <firstname>David</firstname>
+ <surname>Paleino</surname>
+ <contrib>Maintains the package since early 2008.</contrib>
+ <address>
+ <email>d.p...@gm...</email>
+ </address>
+ </author>
+ </authorgroup>
+ <copyright>
+ <year>2008</year>
+ <holder>David Paleino</holder>
+ </copyright>
+ <copyright>
+ <year>2001</year>
+ <year>2002</year>
+ <year>2003</year>
+ <year>2004</year>
+ <year>2005</year>
+ <year>2006</year>
+ <year>2007</year>
+ <holder>Tommi Virtanen</holder>
+ </copyright>
+ <copyright>
+ <year>1998</year>
+ <year>1999</year>
+ <year>2000</year>
+ <holder>Lars Wirzenius</holder>
+ </copyright>
+ <legalnotice>
+ <para>This manual page was written for the Debian system
+ (but may be used by others).</para>
+ <para>Permission is granted to copy, distribute and/or modify this
+ document under the terms of the GNU General Public License,
+ Version 3 or (at your option) any later version published by
+ the Free Software Foundation.</para>
+ <para>On Debian systems, the complete text of the GNU General Public
+ License can be found in
+ <filename>/usr/share/common-licenses/GPL</filename>.</para>
+ </legalnotice>
+ </refentryinfo>
+ <refmeta>
+ <refentrytitle>&dhucpackage;</refentrytitle>
+ <manvolnum>&dhsection;</manvolnum>
+ </refmeta>
+ <refnamediv>
+ <refname>&dhpackage;</refname>
+ <refpurpose>summarize the contents of a syslog log file</refpurpose>
+ </refnamediv>
+ <refsynopsisdiv>
+ <cmdsynopsis>
+ <command>&dhpackage;</command>
+ <!-- These are several examples, how syntaxes could look -->
+ <arg choice="opt">
+ <group choice="plain">
+ <arg choice="plain"><option>-s</option></arg>
+ <arg choice="plain"><option>--state=</option></arg>
+ </group>
+ <replaceable class="option">filename</replaceable>
+ </arg>
+ <arg choice="opt">
+ <group choice="plain">
+ <arg choice="plain"><option>-i</option></arg>
+ <arg choice="plain"><option>--ignore=</option></arg>
+ </group>
+ <replaceable class="option">filename</replaceable>
+ </arg>
+ <arg choice="opt">
+ <group choice="plain">
+ <arg choice="plain"><option>-d</option></arg>
+ <arg choice="plain"><option>--debug</option></arg>
+ </group>
+ </arg>
+ <arg choice="opt">
+ <group choice="plain">
+ <arg choice="plain"><option>-r</option></arg>
+ <arg choice="plain"><option>--repeat</option></arg>
+ </group>
+ </arg>
+ <arg choice="plain" rep="repeat"><replaceable>logfile</replaceable></arg>
+ </cmdsynopsis>
+ <cmdsynopsis>
+ <command>&dhpackage;</command>
+ <!-- Normally the help and version options make the programs stop
+ right after outputting the requested information. -->
+ <arg choice="opt">
+ <group choice="plain">
+ <arg choice="plain"><option>-h</option></arg>
+ <arg choice="plain"><option>--help</option></arg>
+ </group>
+ </arg>
+ </cmdsynopsis>
+ </refsynopsisdiv>
+ <refsect1 id="description">
+ <title>DESCRIPTION</title>
+ <para>This manual page documents briefly the
+ <command>&dhpackage;</command> command.</para>
+ <para><command>&dhpackage;</command> summarizes the contents of log files
+ via the
+ <citerefentry>
+ <refentrytitle>syslog</refentrytitle>
+ <manvolnum>3</manvolnum>
+ </citerefentry>
+ service, by displaying each unique (except for the time) line once, and also
+ the number of times such a line occurs in the input. The lines are displayed
+ in the order they occur in the input.</para>
+ </refsect1>
+ <refsect1 id="options">
+ <title>OPTIONS</title>
+ <variablelist>
+ <!-- Use the variablelist.term.separator and the
+ variablelist.term.break.after parameters to
+ control the term elements. -->
+ <varlistentry>
+ <term><option>-i <replaceable>filename</replaceable></option></term>
+ <term><option>--ignore=<replaceable>filename</replaceable></option></term>
+ <listitem>
+ <para>Read regular expressions from <replaceable>filename</replaceable>
+ and ignore lines in the logfiles that match them.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><option>-s <replaceable>filename</replaceable></option></term>
+ <term><option>--state=<replaceable>filename</replaceable></option></term>
+ <listitem>
+ <para>Read state information from <replaceable>filename</replaceable>.
+ The state contains information about the already reported parts of a log
+ file, and prevents <command>syslog-summary</command> from reporting the
+ same things many times. This is useful when <command>syslog-summary</command>
+ is run from <command>crontab</command> every hour. The file is created,
+ if it doesn't exist already.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><option>-r</option></term>
+ <term><option>--repeat</option></term>
+ <listitem>
+ <para>Merge "last message repeated * times" lines with the repeated
+ event.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><option>-d</option></term>
+ <term><option>--debug</option></term>
+ <listitem>
+ <para>Enable verbose messages when errors occur (i.e. "debug mode").</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><option>-h</option></term>
+ <term><option>--help</option></term>
+ <listitem>
+ <para>Show summary of options.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refsect1>
+ <refsect1 id="files">
+ <title>FILES</title>
+ <variablelist>
+ <varlistentry>
+ <term><filename>/etc/syslog-summary/ignore.rules</filename></term>
+ <listitem>
+ <para>Default ignore.rules file with default regular expressions.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refsect1>
+ <refsect1 id="diagnostics">
+ <title>DIAGNOSTICS</title>
+ <para>When reporting a bug, please run <command>syslog-summary</command>
+ with the <option>-d</option> (or <option>--debug</option>) flag enabled.</para>
+ <para><command>&dhpackage;</command> provides some return codes, that can
+ be used in scripts:</para>
+ <segmentedlist>
+ <segtitle>Code</segtitle>
+ <segtitle>Diagnostic</segtitle>
+ <seglistitem>
+ <seg><errorcode>0</errorcode></seg>
+ <seg>Program exited successfully.</seg>
+ </seglistitem>
+ <seglistitem>
+ <seg><errorcode>1</errorcode></seg>
+ <seg>Something went wrong, please run the program with the debug messages enabled.</seg>
+ </seglistitem>
+ </segmentedlist>
+ </refsect1>
+</refentry>
Property changes on: syslog-summary.1.xml
___________________________________________________________________
Name: svn:mime-type
+ text/plain
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|