<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Jason Wilder's Blog]]></title>
  <link href="http://jasonwilder.com/atom.xml" rel="self"/>
  <link href="http://jasonwilder.com/"/>
  <updated>2012-02-08T00:09:31-07:00</updated>
  <id>http://jasonwilder.com/</id>
  <author>
    <name><![CDATA[Jason Wilder]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Optimizing MongoDB Indexes]]></title>
    <link href="http://jasonwilder.com/blog/2012/02/08/optimizing-mongodb-indexes/"/>
    <updated>2012-02-08T10:00:00-07:00</updated>
    <id>http://jasonwilder.com/blog/2012/02/08/optimizing-mongodb-indexes</id>
    <content type="html"><![CDATA[<p>Good indexes are an important part running a well performing application on MongoDB.  MongoDB performs best
when it can keep your indexes in RAM.  Reducing the size of your indexes also leads to faster queries and the
ability to manage more data with less RAM.</p>

<p>These are a few tips to reduce the size of your MongoDB indexes:</p>

<h3>1) Determining Indexes Sizes</h3>

<p>The first thing you should do is to understand the size of your indexes.  You want to know the sizes before
you make changes to confirm that the changes have actually reduced the size.  Ideally, you are graphing
your indexes over time with your monitoring tools.</p>

<p>Using the mongo shell you can run db.stats() to get database indexes stats:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>&gt; db.stats()
</span><span class='line'>{
</span><span class='line'>  "db" : "examples1",
</span><span class='line'>  "collections" : 6,
</span><span class='line'>  "objects" : 403787,
</span><span class='line'>  "avgObjSize" : 121.9966467469235,
</span><span class='line'>  "dataSize" : 49260660,
</span><span class='line'>  "storageSize" : 66695168,
</span><span class='line'>  "numExtents" : 20,
</span><span class='line'>  "indexes" : 9,
</span><span class='line'>  "indexSize" : 48524560,
</span><span class='line'>  "fileSize" : 520093696,
</span><span class='line'>  "nsSizeMB" : 16,
</span><span class='line'>  "ok" : 1
</span><span class='line'>}</span></code></pre></td></tr></table></div></figure>


<ul>
<li>indexes - The number of indexes in examples1 DB</li>
<li>indexSize - The size of the indexes in example1 DB</li>
</ul>


<p>Since each collection has indexes, you can run db.collection.stats() to see them:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>&gt; db.address.stats()
</span><span class='line'>{
</span><span class='line'>  "ns" : "examples1.address",
</span><span class='line'>  "count" : 3,
</span><span class='line'>  "size" : 276,
</span><span class='line'>  "avgObjSize" : 92,
</span><span class='line'>  "storageSize" : 8192,
</span><span class='line'>  "numExtents" : 1,
</span><span class='line'>  "nindexes" : 2,
</span><span class='line'>  "lastExtentSize" : 8192,
</span><span class='line'>  "paddingFactor" : 1,
</span><span class='line'>  "flags" : 1,
</span><span class='line'>  "totalIndexSize" : 16352,
</span><span class='line'>  "indexSizes" : {
</span><span class='line'>      "_id_" : 8176,
</span><span class='line'>      "_types_1" : 8176
</span><span class='line'>  },
</span><span class='line'>  "ok" : 1
</span><span class='line'>}</span></code></pre></td></tr></table></div></figure>


<ul>
<li>totalIndexSize - The size of all indexes in the collection</li>
<li>indexSizes - A dictionary of index name and size</li>
</ul>


<p><em>NOTE: all sizes returned by these commands are in bytes.</em></p>

<p>These commands are useful but they are tedious to use manually.  To report on indexes stats, I wrote a
utility, index-stats.py, that can be found in the
<a href="https://github.com/jwilder/mongodb-tools">mongodb-tools</a> project on Github that makes things
easier.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>(virtualenv) mongodb-tools$ ./index-stats.py
</span><span class='line'>Checking DB: examples2.system.indexes
</span><span class='line'>Checking DB: examples2.things
</span><span class='line'>Checking DB: examples1.system.indexes
</span><span class='line'>Checking DB: examples1.address
</span><span class='line'>Checking DB: examples1.typeless_address
</span><span class='line'>Checking DB: examples1.user
</span><span class='line'>Checking DB: examples1.typeless_user
</span><span class='line'>
</span><span class='line'>Index Overview
</span><span class='line'>+----------------------------+------------------------+--------+------------+
</span><span class='line'>|         Collection         |         Index          | % Size | Index Size |
</span><span class='line'>+----------------------------+------------------------+--------+------------+
</span><span class='line'>| examples1.address          | _id_                   |   0.0% |      7.98K |
</span><span class='line'>| examples1.address          | _types_1               |   0.0% |      7.98K |
</span><span class='line'>| examples1.typeless_address | _id_                   |   0.0% |      7.98K |
</span><span class='line'>| examples1.typeless_user    | _id_                   |  10.1% |      6.21M |
</span><span class='line'>| examples1.typeless_user    | address_id_1           |  10.1% |      6.21M |
</span><span class='line'>| examples1.typeless_user    | typeless_address_ref_1 |   5.9% |      3.62M |
</span><span class='line'>| examples1.user             | _id_                   |  10.1% |      6.21M |
</span><span class='line'>| examples1.user             | _types_1               |   6.9% |      4.24M |
</span><span class='line'>| examples1.user             | _types_1_address_id_1  |  12.2% |      7.51M |
</span><span class='line'>| examples1.user             | _types_1_address_ref_1 |  26.2% |     16.09M |
</span><span class='line'>| examples2.things           | _id_                   |  10.1% |      6.21M |
</span><span class='line'>| examples2.things           | _types_1               |   8.4% |      5.13M |
</span><span class='line'>+----------------------------+------------------------+--------+------------+
</span><span class='line'>
</span><span class='line'>Top 5 Largest Indexes
</span><span class='line'>+-------------------------+------------------------+--------+------------+
</span><span class='line'>|        Collection       |         Index          | % Size | Index Size |
</span><span class='line'>+-------------------------+------------------------+--------+------------+
</span><span class='line'>| examples1.user          | _types_1_address_ref_1 |  26.2% |     16.09M |
</span><span class='line'>| examples1.user          | _types_1_address_id_1  |  12.2% |      7.51M |
</span><span class='line'>| examples1.typeless_user | _id_                   |  10.1% |      6.21M |
</span><span class='line'>| examples2.things        | _types_1               |   8.4% |      5.13M |
</span><span class='line'>| examples1.user          | _types_1               |   6.9% |      4.24M |
</span><span class='line'>+-------------------------+------------------------+--------+------------+
</span><span class='line'>
</span><span class='line'>Total Documents: 600016
</span><span class='line'>Total Data Size: 74.77M
</span><span class='line'>Total Index Size: 61.43M
</span><span class='line'>RAM Headroom: 2.84G
</span><span class='line'>Available RAM Headroom: 1.04G</span></code></pre></td></tr></table></div></figure>


<p>The output shows the total index size, each index size, and their relative sizes to each other.
In addition, the Top 5 Largest indexes are reported across all your collections.
This makes it easy to determine your largest indexes and the ones where reducing
their size will provide most benefit.</p>

<ul>
<li>RAM Headroom is your physical memory - index size.  A positive value means you have RAM available for indexes to fit
in memory.</li>
<li>Available RAM Headroom is free memory - index size.  Since other processes consume memory on this system, I don&#8217;t
have the total RAM Headroom available.</li>
</ul>


<p>The RAM Headroom stat idea comes from the
<a href="http://blog.boxedice.com/2011/02/15/mongodb-monitoring-dashboard/">MongoDB monitoring service</a> I use,
<a href="http://serverdensity.com">ServerDensity</a>.</p>

<p>From this output, I would focus on the examples1.user collection and the <em>types_1_address_ref_1</em> and
<em>types_1_address_id_1</em> indexes first.</p>

<h3>2) Remove Redundant Indexes</h3>

<p>If you have been releasing code changes over a period of time, you&#8217;ll likely end up with redundant indexes.  MongoDB
can use the prefix of a compound index if all the component parts are not available.  In the previous output,</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>| examples1.user          | _types_1               |   6.9% |      4.24M |</span></code></pre></td></tr></table></div></figure>


<p>is redundant with</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>| examples1.user          | _types_1_address_ref_1 |  26.2% |     16.09M |
</span><span class='line'>| examples1.user          | _types_1_address_id_1  |  12.2% |      7.51M |</span></code></pre></td></tr></table></div></figure>


<p>Because <em>_types_1</em> is the prefix to these two indexes. Dropping it would save 4.2M on the total index
size and be one less index to update when user documents change.</p>

<p>To make it easier to find these indexes, you can run redundant-indexes.py from
<a href="https://github.com/jwilder/mongodb-tools">mongodb-tools</a>:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>(virtualenv)mongodb-tools$ ./redundant-indexes.py
</span><span class='line'>Checking DB: examples2
</span><span class='line'>Checking DB: examples1
</span><span class='line'>Index examples1.user[_types_1] may be redundant with examples1.user[_types_1_address_ref_1]
</span><span class='line'>Index examples1.user[_types_1] may be redundant with examples1.user[_types_1_address_id_1]
</span><span class='line'>Checking DB: local</span></code></pre></td></tr></table></div></figure>


<h3>3) Compact Command</h3>

<p>If you are running MongoDB 2.0+, you can run the compact command to defragment your collections and rebuild
the indexes.  The compact command locks the database so make sure you know where you are running it beforehand.
If you are running with replica sets, the easiest thing to do is to run it on your secondaries, one at a time, fail-over
the primary to new secondary and run compact on the old primary.</p>

<h3>4) MongoDB 2.0 Index Improvements</h3>

<p>If you are not running MongoDB 2.0 or later, upgrading and rebuilding your indexes should provide about a
25% savings.</p>

<p>See <a href="http://www.mongodb.org/display/DOCS/2.0+Release+Notes#2.0ReleaseNotes-IndexPerformanceEnhancements">Index Performance Enhancements</a></p>

<h3>5) Check Index Criteria</h3>

<p>Another thing to check is your index criteria.  You want the values that are indexed to be small and as selective
as possible.  Indexing values that do not help MongoDB find
your data faster slow queries down and increase the index size.  If you are using a mapping framework for your
application, and it support defining indexes in the code, you should
check to see what it&#8217;s actually indexing.  For example <a href="http://mongoengine.org/">MongoEngine</a> for Python
uses a &#8220;_types&#8221; field to identify subclasses in the same collection.  This can add a lot of space and may not add
to the selectivity of you indexes.</p>

<p>In my test data, my largest index is:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>| examples1.user             | _types_1_address_ref_1 |  26.2% |     16.09M |</span></code></pre></td></tr></table></div></figure>


<p>Looking at the data for it:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>&gt; db.user.findOne()
</span><span class='line'>{
</span><span class='line'>  "_id" : ObjectId("4f2ef95c89a40a11c5000002"),
</span><span class='line'>  "_types" : [
</span><span class='line'>      "User"
</span><span class='line'>  ],
</span><span class='line'>  "address_id" : ObjectId("4f2ef95c89a40a11c5000000"),
</span><span class='line'>  "address_ref" : {
</span><span class='line'>      "$ref" : "address",
</span><span class='line'>      "$id" : ObjectId("4f2ef95c89a40a11c5000000")
</span><span class='line'>  },
</span><span class='line'>  "_cls" : "User"
</span><span class='line'>}</span></code></pre></td></tr></table></div></figure>


<p>You can see that <em>_types</em> is an array with a value of <em>User</em>, the class name.  Since I don&#8217;t have any subclasses of <em>User</em>
in my code, indexing this value does not help the index selectivity. Another way of thinking about this is that each
value in the index is going to have &#8220;User&#8221; as a prefix which adds a few extra bytes for value and does not increase
the selectivity of the index.</p>

<p>Removing it in the code with:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>class User(Document):
</span><span class='line'>    meta {'index_types':False}</span></code></pre></td></tr></table></div></figure>


<p>Changes the index to:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>| examples1.user             | address_ref_1          |  16.8% |     12.39M |</span></code></pre></td></tr></table></div></figure>


<p>About a 23% savings.</p>

<p>Digging in further, <em>address_ref_1</em> is a <em>ReferenceProperty</em> to an <em>Address</em> object.  The data above shows that it is a
dictionary that contains the id of the reference field as well as the collection that it points to.  If we
change this <em>ReferenceProperty</em> to an <em>ObjectIdProperty</em>, which is what <em>address_id</em>, is, you can get additional savings:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>| examples1.user             | address_id_1           |   9.5% |      6.21M |
</span><span class='line'>| examples1.user             | address_ref_1          |  20.9% |     13.70M |
</span></code></pre></td></tr></table></div></figure>


<p>About a 53% savings.  This changes the index value from being stored as a serialized dictionary to just and ObjectId
which is likely highly optimized with MongoDB.  Changing the property type does require code changes though and
you also lose the automatic de-referencing capability provided by <em>ReferenceProperties</em>. It can produce significant
savings though.</p>

<p>In total, we&#8217;ve reduced the original index by 61% by adjusting some index criteria and making some small code changes.</p>

<h3>6) Delete/Move Old Data</h3>

<p>In most applications, some data is accessed more frequently than others.  If you have old data that won&#8217;t be accessed
by your users, you may be able to purge it, move it to another un-indexed collection, or archive it somewhere outside
of the DB.  Ideally, you database contains and is indexing the working set of available data.</p>

<p>There are some other good optimization ideas that can be found here:</p>

<ul>
<li><a href="http://www.slideshare.net/andrew311/optimizing-mongodb-lessons-learned-at-localytics">Optimizing MongoDB: Lessons Learned at Localytics</a></li>
<li><a href="http://www.scribd.com/doc/56271132/MongoDB-Performance-Tuning">MongoDB Performance Tuning</a></li>
</ul>


<p>How do you tune your indexes?</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Centralized Logging]]></title>
    <link href="http://jasonwilder.com/blog/2012/01/03/centralized-logging/"/>
    <updated>2012-01-03T16:00:00-07:00</updated>
    <id>http://jasonwilder.com/blog/2012/01/03/centralized-logging</id>
    <content type="html"><![CDATA[<p>Logs are a critical part of any system, they give you insight into what a system is doing as well what
happened.  Virtually every process running on a system generates logs in some form or another.
Usually, these logs are written to files on local disks.   When your system grows to multiple hosts,
managing the logs and accessing them can get complicated.  Searching for a particular error across
hundreds of log files on hundreds of servers is difficult without good tools.  A common approach to
this problem is to setup a centralized logging solution so that multiple logs can be aggregated in
a central location.</p>

<p>So what are your options?</p>

<h3>File Replication</h3>

<p>A simple approach is to setup file replication of your logs to a central server on a cron schedule.  Usually rsync and
cron are used since they are simple and straightforward to setup.  This solution can work for a while but it doesn&#8217;t
provide timely access to log data.  It also doesn&#8217;t aggregate the logs and only co-locates them.</p>

<h3>Syslog</h3>

<p>Another option that you probably already have installed is <a href="http://en.wikipedia.org/wiki/Syslog">syslog</a>.
Most people use <a href="http://rsyslog.com/">rsyslog</a> or <a href="http://www.balabit.com/network-security/syslog-ng">
syslog-ng</a> which are two syslog implementations.  These daemons allow processes to send log messages to them and the
syslog configuration determines how the are stored.  In a centralized logging setup, a central syslog daemon is setup
on your network and the client logging dameons are setup to forward messages to the central daemon.  A good write-up
of this kind of setup can be found at:
<a href="http://urbanairship.com/blog/2010/10/05/centralized-logging-using-rsyslog/">Centralized Logging Use Rsyslog</a></p>

<p>Syslog is great because just about everything uses it and you likely already have it installed on your system.  With a
central syslog server, you will likely need to figure out how to scale the server and make it highly-available.</p>

<ul>
<li><strong><a href="http://www.balabit.com/network-security/syslog-ng">syslog-ng</a></strong></li>
<li><strong><a href="http://urbanairship.com/blog/2010/10/05/centralized-logging-using-rsyslog/">rsyslog</a></strong></li>
</ul>


<h3>Distributed Log Collectors</h3>

<p>A new class of solutions that have come about have been designed for
high-volume and high-throughput log and event collection.  Most of these solutions are more general purpose
event streaming and processing systems and logging is just one use case that can be solved using them.
All of these have their specific features and differences but their architectures are fairly similar.
They generally consist of logging clients and/or agents on each specific host.  The agents forward logs to a
cluster of collectors which in turn forward the messages to a scalable storage tier.  The idea is that the
collection tier is horizontally scalable to grow with the increase number of logging hosts and messages.  Similarly,
the storage tier is also intended to scale horizontally to grow with increased volume.  This is gross simplification
of all of these tools but they are a step beyond traditional syslog options.</p>

<ul>
<li><p><strong><a href="https://github.com/facebook/Scribe">Scribe</a></strong> - Scribe is scalable and reliable log aggregation server
used and released by Facebook as open source.  Scribe is written in C++ and uses <a href="http://thrift.apache.org/">Thrift</a>
for the protocol encoding.  Since it uses thrift, virtually any language can work with it.</p></li>
<li><p><strong><a href="https://cwiki.apache.org/FLUME/">Flume</a></strong> - Flume is an Apache project for collecting,
aggregating, and moving large amounts of log data.  It stores all this data on
<a href="http://hadoop.apache.org/hdfs/">HDFS</a>.</p></li>
<li><p><strong><a href="http://logstash.net">logstash</a></strong> - logstash lets you ship, parse and index logs from any source.  It
works by defining inputs (files, syslog, etc.), filters (grep, split, multiline, etc..) and outputs (elasticsearch,
mongodb, etc..).  It also provides a UI for accessing and searching your logs.  See
<a href="http://logstash.net/docs/1.0.17/getting-started-centralized">Getting Started</a></p></li>
<li><p><strong><a href="http://wiki.apache.org/hadoop/Chukwa">Chukwa</a></strong> - Chukwa is another Apache project that collects
logs onto <a href="http://hadoop.apache.org/hdfs/">HDFS</a>.</p></li>
<li><p><strong><a href="http://fluentd.org/doc/">fluentd</a></strong> - Fluentd is similar to logstash in that there are inputs and
outputs for a large variety of sources and destination.  Some of it&#8217;s design tenets are easy installation and small
footprint.  It doesn&#8217;t provide any storage tier itself but allows you to easily configure where your logs should be
collected.</p></li>
<li><p><strong><a href="http://incubator.apache.org/kafka/">kafka</a></strong> - Kafka was developed at LinkedIn for their activity stream
processing and is now an Apache incubator project.  Although Kafka could be used for log collection this is not it&#8217;s
primary use case.  Setup requires <a href="http://zookeeper.apache.org/">Zookeeper</a>
to manage the cluster state.</p></li>
<li><p><strong><a href="http://graylog2.org/">Graylog2</a></strong> - Graylog2 provides a UI for searching and analyzing logs.  Logs are
stored in <a href="http://www.mongodb.org">MongoDB</a> and/or <a href="http://elasticsearch.org">elasticsearch</a>.
Graylog2 also provides the <a href="http://graylog2.org/about/gelf">GELF</a> logging format to overcome some issues
with syslog message: 1024 byte limit and unstructured log messages.  If you are logging long stacktraces,
you may want to look into GELF.</p></li>
<li><p><strong><a href="http://www.splunk.com"/>splunk</a></strong> - Splunk is commercial product that has been around for several years.
It provides a whole host of features for not only collecting logs but also analyzing and viewing them.</p></li>
</ul>


<h3>Hosted Logging Services</h3>

<p>There are also several hosted &#8220;logging as a service&#8221; providers as well.  The benefit of them is that you only need
to configure your syslog forwarders or agents and they manage the collection, storage and access to the logs.  All of
the infrastructure that you have to setup and maintain is handled by them, freeing you up to focus on your application.
Each service provide a simple setup (usuallysyslog forwarding based), an API and a UI to support search and analysis.</p>

<ul>
<li><strong><a href="http://loggly.com/">loggly</a></strong></li>
<li><strong><a href="http://papertrailapp.com">papertrail</a></strong></li>
<li><strong><a href="https://logentries.com/">logentries</a></strong></li>
</ul>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Octopress Blogging System]]></title>
    <link href="http://jasonwilder.com/blog/2011/12/15/octopress-blogging-system/"/>
    <updated>2011-12-15T00:06:00-07:00</updated>
    <id>http://jasonwilder.com/blog/2011/12/15/octopress-blogging-system</id>
    <content type="html"><![CDATA[<p>After several years of maintaining a Wordpress blog, I&#8217;ve decided to switch to
<a href="http://octopress.org">Octopress</a>.  Wordpress worked well for me at first
but it seemed to have more functionality than I really needed or wanted.  The breaking
point happened last night when I tried to upgrade it and the templates I was using no
longer worked.  Digging into the code was going to be more effort than it was worth.  So
now I&#8217;ve moved on to something simpler.</p>

<p>Octopress uses a different approach then Wordpress for generating content.  Octopress generates
a static site whereas Wordpress needs MySQL and PHP.  I like the simplicty of Octopress
and it also makes it easy version control everything w/ git.</p>
]]></content>
  </entry>
  
</feed>

