<?xml version="1.0" encoding="utf8"?>
<!DOCTYPE eolas SYSTEM "/_xs/eolas/DTD">
<eolas xmlns:xlink="http://www.w3.org/1999/xlink">
  <summary>
    <title>Central Logging for Unix</title>
    <description>Thoughts on how to manage central logs for the Seattle SAGE Group.</description>
    <author xlink:href="http://sial.org/contact/">
      <first-name>Jeremy</first-name>
      <last-name>Mates</last-name>
    </author>
    <date>2004-08-12</date>
    <rights>The author disclaims all copyrights and releases this document into the public domain.</rights>
    <source xlink:href="http://sial.org/talks/central-logging/"/>
    <version>$Id: central-logging.xml,v 1.10 2004/08/12 23:20:28 jmates Exp $</version>
  </summary>
  <section>
    <title>Background</title>
    <list>
      <li>What is Logging?</li>
      <data>
        <shell prefix="$ ">ktrace logger -it "this is a log message"</shell>
        <shell prefix="$ ">kdump -f ktrace.out</shell>
      </data>
      <li>What is Logged?</li>
      <info>Too much, too little, and everything between (± bugs).</info>
      <li>What do you want?</li>
      <info>It depends!</info>
    </list>
    <section>
      <title>My Experience</title>
      <list>
        <li>Educational environment: mainly Linux.</li>
        <li>210 systems logging to central <host>loghost</host>.</li>
        <list>
          <li>35 servers</li>
          <li>30 printers</li>
          <li>85 cluster hosts</li>
          <li>rest desktops, miscellaneous</li>
        </list>
        <li><host>loghost</host>, log proxies for private cluster, build networks.</li>
      </list>
    </section>
    <section>
      <title>Logging Goals</title>
      <list>
        <li>Easy to get started with <man section="8">syslogd</man>:</li>
        <data>
          <line>*.info                                                    @loghost.example.org</line>
        </data>
        <li>Logfile analysis gains</li>
        <list>
          <li>Detect problems before users!</li>
          <li>Detect unknown problems?</li>
        </list>
        <li>Security Benefits</li>
        <list>
          <li>Remote Duplication</li>
          <li>Correlation</li>
        </list>
      </list>
    </section>
    <section>
      <title>Logging Requirements</title>
      <list>
        <li>Limit access to <host>loghost</host>.</li>
        <li>Time syncronization.</li>
        <list>
          <li><acronym><abbr>NTP</abbr><name>Network Time Protocol</name></acronym>.
          </li>
          <li>Or, <cmd>syslog-ng</cmd> option:</li>
          <data>
            <line>options { use_time_recvd(yes); };</line>
          </data>
        </list>
        <li>Modest <host>loghost</host> hardware needs (210 clients):</li>
        <list>
          <li>Pentium II 350, 128M RAM, 60G IDE disk.</li>
          <li>175,000 messages/day (mean over last seven days).</li>
          <li>Gigabyte/month data uncompressed.</li>
        </list>
      </list>
    </section>
  </section>
  <section>
    <title>Log Distribution &amp; Collection</title>
    <info>
      <image xlink:href="logging-team.jpg" width="227" height="182"/>
    </info>
    <section>
      <title>Problems with <cmd>syslogd</cmd></title>
      <info>
        <link xlink:href="http://sial.org/howto/logging/syslogd-problems/">http://sial.org/howto/logging/syslogd-problems/</link>
      </info>
      <list>
        <li>Limited configuration possible: <file>/etc/syslog.conf</file>.</li>
        <data>
          <line>*.err;kern.debug;auth.notice;mail.crit          /dev/console</line>
          <line>*.info;kern.debug;mail.none                     /var/log/messages</line>
          <line>mail.info                                       /var/log/maillog</line>
          <line>*.emerg                                         *</line>
        </data>
        <li>No retention of hostnames across proxies.</li>
        <li>Only <acronym><abbr>UDP</abbr><name>User Datagram Protocol</name></acronym> supported.</li>
        <li>Logfiles also problematic…</li>
      </list>
    </section>
    <section>
      <title>Problems with Logfiles</title>
      <list>
        <li>No year, timezone, facility, nor priority in logfile.</li>
        <data>
          <line>Apr 15 15:06:50 server sshd[58101]: Connection closed by 192.0.2.151</line>
        </data>
        <li>Hard to find rotated logs, hard to <cmd>rsync</cmd>.</li>
        <data>
          <line>messages        messages.11     messages.15     messages.4      messages.8</line>
          <line>messages.0      messages.12     messages.16     messages.5      messages.9</line>
          <line>messages.1      messages.13     messages.2      messages.6</line>
          <line>messages.10     messages.14     messages.3      messages.7</line>
        </data>
      </list>
      <info>We can do better! Because…</info>
    </section>
    <section>
      <title>Hope is on the way!</title>
      <list>
        <li>New protocol work</li>
        <list>
          <li>
            <link xlink:href="http://www.syslog.cc/ietf/protocol.html">http://www.syslog.cc/ietf/protocol.html</link>
          </li>
          <li>
            <link xlink:href="http://www.ietf.org/html.charters/syslog-charter.html">http://www.ietf.org/html.charters/syslog-charter.html</link>
          </li>
        </list>
        <li><link xlink:href="http://lists.shmoo.com/mailman/listinfo/loganalysis">LogAnalysis Mailing List</link> - discussion, flamewars, &amp; pointers
      </li>
        <li>Short term: consider <cmd>syslog-ng</cmd>.</li>
      </list>
    </section>
    <section>
      <title>Advantages of <cmd>syslog-ng</cmd></title>
      <info>
        <link xlink:href="http://sial.org/howto/logging/syslog-ng/">http://sial.org/howto/logging/syslog-ng/</link>
      </info>
      <list>
        <li>Hostname retention (or chaining).</li>
        <li>Custom <acronym><abbr>TCP</abbr><name>Transmission Control Protocol</name></acronym> logging.</li>
        <li>Configuration much more featureful: <file>syslog-ng.conf</file></li>
        <data>
          <line>destination mail {</line>
          <line>  file("/var/log/archive/mail/$YEAR/$MONTH/$YEAR-$MONTH-$DAY"</line>
          <line>    template("$ISODATE &lt;$FACILITY.$PRIORITY&gt; $HOST $MSG\n") template_escape(no) ); };</line>
        </data>
        <li>Log format customization: year, timezone, etc.</li>
        <data>
          <line>2004-04-15T15:06:50-0700 &lt;daemon.info&gt; server.example.org sshd[58101]: Connection<rbr/> closed by 192.0.2.151</line>
        </data>
        <li>Easy insert to database.</li>
      </list>
    </section>
    <section>
      <title>Disadvantages of <cmd>syslog-ng</cmd></title>
      <list>
        <li>Extra work to install, maintain.</li>
        <li>Custom logpaths: custom tools needed.</li>
        <li>Log analysis tools assume <cmd>syslogd</cmd> format.</li>
        <list>
          <li><code>&lt;$FACILITY.$PRIORITY&gt;</code> okay.</li>
          <li><code>$ISODATE</code> more problematic.</li>
        </list>
        <li>Reveals buggy client implementations.</li>
      </list>
    </section>
    <section>
      <title>Buggy Client Logs</title>
      <list>
        <li>SSH on Solaris, Gnome log problems:</li>
        <data>
          <line>2004-08-12T12:41:45-0800 &lt;auth.info&gt; ' from 192.0.2.151</line>
          <line>2004-08-12T12:42:08-0800 &lt;user.warning&gt; client.example.org (username-1234): <rbr/>Error releasing lockfile: Failed to link '/afs/example/home/username/.gconfd/…</line>
        </data>
        <li>Kluge around with <file>syslog-ng.conf</file>, <cmd>swatch</cmd> rules.</li>
        <li>Recommend developers use proper <man section="3">syslog</man> libraries.</li>
      </list>
    </section>
  </section>
  <section>
    <title>Log Analysis</title>
    <list>
      <li>Don't run as superuser!</li>
      <list>
        <li>Setup <code>logs</code> account.</li>
        <li>Log readers in <code>logs</code> group.</li>
        <li>Run analysis as <code>logs</code>.</li>
      </list>
      <li>Learn to love <link xlink:href="http://www.oreilly.com/catalog/regex2/">Regular Expressions</link>.</li>
      <data>
        <line>/^\d{4}-\d\d-\d\dT\d\d:\d\d:\d\d-\d{4} &lt;[^.]+\.[^&gt;]+&gt; \S+ clamd(?:\[\d+\])?: /</line>
      </data>
      <li>Need active review, realtime checks, and periodic reporting.</li>
    </list>
    <section>
      <title>Active Review</title>
      <list>
        <li>Watch logfiles for problems with <man section="1">tail</man>.</li>
        <data>
          <line>tail -f /var/log/messages</line>
        </data>
        <li>Markup for easier reading with <cmd>colorize</cmd> or <link xlink:href="http://colorifer.sourceforge.net/">Colorifer</link>.</li>
        <li>Could also use <cmd xlink:href="http://swatch.sourceforge.net/">swatch</cmd> for ongoing review.</li>
        <li>Other tips?</li>
      </list>
    </section>
    <section>
      <title>Custom Script: <cmd>eet</cmd></title>
      <list>
        <li>Like <man section="1">tee</man>, but different.</li>
        <li>Follows multiple files.</li>
        <data>
          <shell prefix="$ ">ls /var/log/htpd/</shell>
          <line>access_log      error_log       httpd.pid       proxy           ssl_engine_log</line>
          <shell prefix="$ ">eet /var/log/httpd/*_log | colorize</shell>
        </data>
      </list>
    </section>
    <section>
      <title>Custom Script: <cmd>ptail</cmd></title>
      <list>
        <li>Applies <link xlink:href="http://www.perl.org/">Perl</link> expressions to input data.</li>
        <li>Exclude or limit ongoing logdata seen.</li>
        <data>
          <shell prefix="$ ">ptail /var/log/everything 'print unless m/(\.(debug|info|notice)&gt; |modprobe)/'</shell>
          <line/>
          <shell prefix="$ ">ptail /var/log/messages 'print if /named|testhost/'</shell>
        </data>
        <li><link xlink:href="http://sial.org/howto/perl/one-liner/">How to write Perl one liners</link>.</li>
      </list>
      <info>Cannot watch logs all the time…</info>
    </section>
    <section>
      <title>Realtime Notification</title>
      <info><file>/var/log/everything</file> - rotated daily</info>
      <list>
        <li>Look for problems (<code>permission denied</code>)?</li>
        <li>RAID failures, other critical events.</li>
        <li><cmd xlink:href="http://swatch.sourceforge.net/">swatch</cmd> daemon: <file>hot-potato.conf</file>.</li>
        <data>
          <line># 3ware logs</line>
          <line>watchfor /(?i)3w-xxxx.+no longer fault tolerant/</line>
          <line>  mail=root,subject=LW warn: disk  3ware RAID not fault tolerant</line>
          <line>  throttle 1:00:00,use=regex</line>
          <line/>
          <line># this uses MIMEDefang MDLOG entries to spot viruses from "local" subnets</line>
          <line>watchfor /MDLOG,[^,]+,virus,[^,]+,(?:10\.0\.(?:11|12)|192\.0\.2)/</line>
          <line>  mail=root:admin-alert,subject=LW warn: mail  site malware source</line>
          <line>  throttle 30:00,use=regex</line>
        </data>
      </list>
    </section>
    <section>
      <title>Notification Tips</title>
      <list>
        <li>Custom tag for job completion.</li>
        <data>
          <line># for reporting things via email</line>
          <line>watchfor /(?i)custom-notify: /</line>
          <line>  mail=root,subject=LW info: misc  custom notify message</line>
          <line>  throttle 15:00,use=regex</line>
        </data>
        <data>
          <shell prefix="$ ">long-running-job ; logger "custom-notify: long job done"</shell>
        </data>
        <li>Alert on logging change.</li>
        <data>
          <line>watchfor /logwatch restart/</line>
          <line>  mail=root,subject=LW info: log  logwatch restart</line>
          <line>  throttle 15:00,use=regex</line>
        </data>
      </list>
    </section>
    <section>
      <title>Periodic Reporting</title>
      <list>
        <li><cmd xlink:href="http://swatch.sourceforge.net/">swatch</cmd>: unknown entries reporting.</li>
        <data>
          <line>ignore /\.info&gt; \S+ clamd(?:\[\d+\])?: /</line>
          <line>ignore /\.notice&gt; \S+ clamd(?:\[\d+\])?: clamd (startup|shutdown) succeeded/</line>
          <line/>
          <line>watchfor /clamd\[\d+\]:.+Unable to open file or directory/</line>
          <line>  echo</line>
          <line>  throttle 1:00:00,use=regex</line>
          <line/>
          <line>watchfor /./</line>
          <line>  echo</line>
        </data>
        <li>Many other similar tools, <cmd>logsurfer</cmd>, <cmd>logwatch</cmd>, etc.</li>
        <li>Many other reports possible.</li>
      </list>
    </section>
    <section>
      <title>Custom Script: <cmd>unseen</cmd></title>
      <list>
        <li>Lists perviously unseen files.</li>
        <li>No reliance on rotation event.</li>
      </list>
      <data>
        <line>#!/bin/sh</line>
        <line/>
        <line>unseen -w 30d -T -s ~/share/unseen.logs /var/log/archive | \</line>
        <line> while read logfile; do</line>
        <line/>
        <line>  swatch --config-file=everything.conf --examine=$logfile | \</line>
        <line>   mail -s "swatch check: file=`basename $logfile`" `id -un`</line>
        <line/>
        <line>done</line>
      </data>
    </section>
    <section>
      <title>Custom Script: <cmd>redress</cmd></title>
      <list>
        <li>Marks up text for Regular Expression use.</li>
        <li>Ongoing updating of <cmd>swatch</cmd>, other configurations.</li>
        <data>
          <shell prefix="$ ">redress | pbcopy</shell>
          <line>example.log: (user-500) file=/var/log/maillog</line>
          <shell prefix="$ ">echo `pbpaste`</shell>
          <line>example\.log: \(user-500\) file=\/var\/log\/maillog</line>
        </data>
        <li>New script, could do more…</li>
      </list>
    </section>
  </section>
</eolas>
