tag:blogger.com,1999:blog-55595611186211702032024-03-28T09:05:06.649-06:00Personal RamblingsAnonymoushttp://www.blogger.com/profile/16674502256088535831noreply@blogger.comBlogger6125tag:blogger.com,1999:blog-5559561118621170203.post-5053857577053731122012-12-09T21:18:00.000-07:002012-12-09T21:18:21.682-07:00Creating a Go Library: Part 1<u><span style="font-size: x-large;">Intro</span></u><br />
<br />
This tutorial will follow my progress working on a library that would handle working with dynamic JSON data. Go is a great language for decoding JSON when the data layout is fixed, but since Go is a static language, dealing with JSON that is dynamic can be less intuitive than when working with dynamic languages like PHP, Ruby, or Python. This tutorial assumes that you have some working knowledge of Go. If you have no prior knowledge of Go, go <a href="http://golang.org/doc/effective_go.html" target="_blank">here</a> and <a href="http://golang.org/ref/" target="_blank">here</a>.<br />
<br />
<rant><br />
I think Go is lacking in regards to the
amount of intermediate and advanced examples that show how Go works
solving actual problems instead of a "10000 foot view"of Go. I have
great respect for the Go team and in particular, I think Andrew Gerrand
is doing a great job of representing Go accross the globe, but if I see
one more video of Andrew demoing chat roulette, I will commit <a href="http://en.wikipedia.org/wiki/Seppuku" target="_blank">Seppuku</a>. <br />
</rant><br />
<br />
<span style="font-size: x-large;"><u>Taking a whack at it </u></span><br />
<br />
<a href="https://gist.github.com/4241133" rel="nofollow" target="_blank">This</a> is the sample JSON data from the Github API I am working with. And here is a sample JSON record.<br />
<br />
<script src="https://gist.github.com/4241224.js?file=gistfile1.json"></script>
Looking at the events data, I found that the payload object is different depending on the "type" of event. Immediately, I wanted to go back to my PHP roots and use $event = json_decode($source) and this problem would be solved, but the following example uses the most basic Go code.<br />
<br />
<script src="https://gist.github.com/4241157.js?file=gistfile1.go"></script>
<br />
<br />
The problem with this is you can only access top level data items. For instance, I can access the payload by using m["type"] but trying to get m["payload"]["description"] will not compile because an interface does not have any indexes. So what can we do to clean this up? I created a couple of structs and some basic functions to help me decode the JSON. I wanted a JSONCollection struct which contained the entire document and JSONObject which would be the struct used to read the results.<br />
<br />
<script src="https://gist.github.com/4242532.js?file=gistfile1.go"></script>
<br />
This still has the same limitation as before. I can use "Get" to find a top level attribute, but If I want a nested attribute, I have to type cast the interface to a map again and then grab the description out of that map. I need to come up with a better solution. The goal is to have syntax like the following.<br />
<br />
<br />
<script src="https://gist.github.com/4242562.js?file=gistfile1.go"></script>
<br />
<br />
<br />
This will give us a cleaner syntax to get at nested variables. So let's fix the code to allow this.<br />
<br />
<script src="https://gist.github.com/4247971.js?file=gistfile1.go"></script>
<br />
This gives a start to our library. Now we can retrieve strings of data (and nested data) with a minimal amount of Go code. Here is a an example as to how we would use this library.<br />
<br />
<br />
<script src="https://gist.github.com/4247991.js?file=gistfile1.go"></script>
<span style="font-size: x-large;"><u>Current Limitations</u></span><br />
<br />
The library uses only strings, so if you have an integer or float, those values will have trouble converting to strings (I will fix this in a later blog post). You will have trouble traversing nested slices as that this will cause an error. Currently the example is read-only, as that was all that was initially needed.<br />
<br />
<span style="font-size: x-large;"><u>Coming Up on Personal Ramblings</u></span><br />
<br />
I want to make this a feature complete library, so here is a list of things that I want to add to this library. <br />
<ul>
<li>Get JSON Object by Position</li>
<li>Get JSON Objects by using limit/offset</li>
<li>Filter JSON Results</li>
<li>Handling different variable types </li>
<li>Creating Tests</li>
<li>Creating a better Iterator</li>
<li>Using Godoc</li>
<li>Using GoFmt</li>
</ul>
If you feel anything is missing, feel free to comment below. When completed I will be releasing the source for this library on Github.Anonymoushttp://www.blogger.com/profile/16674502256088535831noreply@blogger.com11tag:blogger.com,1999:blog-5559561118621170203.post-12884114301189721032012-11-06T07:30:00.002-07:002012-11-06T07:30:33.925-07:00Chromebook - Road Warrior or Road Block<u><span style="font-size: x-large;">Introduction</span></u><br />
<br />
I recently received the arm Chromebook and was looking at ways to use the versatile laptop for work as well as play. First a quick overview of the Chromebook.<br />
<br />
<u>Pros</u><br />
<br />
Boots up in ~10 seconds<br />
Fast Internet enabled device<br />
Very affordable ($249)<br />
Great battery life (Can get you through an 8 hour day)<br />
12 Free airplane wireless passes and 100GB storage for 2 years although I have not able to get deal yet :(<br />
The trackpad works well and has two finger scrolling<br />
Very mobile<br />
<br />
<u>Cons</u><br />
<br />
Not very useful without internet access<br />
No "full blown" shell without switching into developer mode<br />
Smallish Screen<br />
Not able to run many desktop apps<br />
I hate track pads<br />
<br />
The Chromebook is a great secondary device, especially when the wife wants to do shopping online or plot a new vacation while you are doing work on the main computer. But what about making the device work for taking my work on the road ( or to Starbucks)?<br />
<br />
<u>My Requirements:</u><br />
<br />
Secure(er) access to the internet using public WiFi<br />
Ability to access work VPN<br />
Ability to use Vim and code in PHP, Python, Ruby, and Javascript<br />
Need to be able to access company apps<br />
<br />
I can easily access apps like Zendesk and Campfire without any issues. The full chrome browser is the same browser that I have on my desktop. Very fast and without issues. Started noticing a performance hit when I have more than 10 tabs open, but nothing terrible.<br />
<br />
Using VPN is easy as well. Under settings you can add a new VPN connection. The office uses an OpenVPN provider so this works well.<br />
<br />
Secure access on a public WiFi is difficult to achieve. First you need to make sure you are on the right network, so ask the business what their network name is before accessing the network to avoid <a href="http://en.wikipedia.org/wiki/Man-in-the-middle_attack" target="_blank">MiM</a> attack. I have a box that I use to host some websites that I have root access to, so I decided to use that box as a SOCKS proxy to access the internet. This is actually pretty simple. Just access the chrome shell (cleverly named crosh) by pressing ctrl + alt + t. This is a simple shell with only a handful of commands (Type in "help" to see them all listed). The one we are interested in is ssh. The ssh command has an option "dynamic-forward" that will help establish a secure tunnel for your browser traffic. You can add all your other options like port, host, user and various others.<br />
<br />
You first need to go to your settings (chrome://chrome/settings) and check the option "<span style="font-family: 'Noto Sans UI', 'Droid Sans Fallback', sans-serif; font-size: 12px;">Allow proxies for shared networks". </span>Then type chrome://proxy-settings in your address bar, and set the options in the SOCKS bar that you set up up using the ssh command. This will proxy all your browser traffic through the VPS.<br />
<br />
If you don't have a spare box as I do, there is a website that always has some deals on cheap VPS hosting, <a href="http://lowendbox.com/">Lowendbox.com</a>.<br />
<br />
What about Vim? Well, since I already have the box, I can just use the crosh shell to ssh into my spare box and just fire up Vim. Every once and a while there is key typing delays but not enough to really bother me. I was able to turn crosh into bash this way. To make things easier, I also set up a new virtual host entry in Apache to give me an easy to remember domain to do web programming.<br />
<br />
<u><span style="font-size: x-large;">Conclusion</span></u><br />
<br />
This Chromebook provides great value for $249. I find myself being able to use the Chromebook instead of a traditional laptop. I have a Asus TF101 which I now find little or no use for. This computer can perform all necessary tasks well and there is a huge list of chrome extensions that fill in some missing gaps. The only scenarios where this computer would not be effective is gaming and if you need to store massive amounts of data (music, ebooks, or whatever). Yes I would rather have a MacBook, but since the MacBook could cost me 4-5 times the price of the Chromebook, I'm satisfied with the Chromebook.<br />
<br />
<br />Anonymoushttp://www.blogger.com/profile/16674502256088535831noreply@blogger.com4tag:blogger.com,1999:blog-5559561118621170203.post-77943315231764690032012-07-08T18:47:00.000-06:002012-07-08T19:25:14.916-06:00Dumping PHP For Go<u><span style="font-size: large;">Background</span></u><br />
<br />
<span style="font-size: small;">It has been a long time coming for me to switch out of PHP for my main programming language. I have been working with PHP for years and have grown tired of the limitations/issues. It has been hard for me to convert, being that there are always jobs for PHP programmers out there and I gotta eat! For me, the aggravation coming with working with PHP has forced me to switch.</span><br />
<span style="font-size: small;"><br /></span><br />
<u><span style="font-size: large;">Why do you hate PHP?</span></u><br />
<br />
I don't hate PHP at all. The language itself has many advantages like a great community, numerous libraries (although how many different MVC frameworks can you have?), great documentation, and ease of entry. There are libraries to connect PHP to virtually every database, REST API, or other third party software. These are all reasons I began using the language in the first place.<br />
<br />
PHP is supported on virtually every web hosting company on the planet, making PHP a useful skill to have. There are some great open source frameworks and apps like WordPress, Zend, Joomla and too many others to list. <br />
<br />
Why no more PHP? First, I should probably clarify that I will continue to use PHP as many of the projects I'm working on still use PHP. However, there are many quirks about PHP that have been bothering me. I won't go into detail because I will not be saying anything new about the subject. If you want to read the most epic of rants on PHP issues, see <a href="http://me.veekun.com/blog/2012/04/09/php-a-fractal-of-bad-design/" target="_blank">this</a> post.<br />
<br />
<a name='more'></a><br />
<br />
PHP code, especially large code repositories, have become difficult for me to enjoy maintaining. Sometimes your app just stops working because of some typo in your code or the spaghetti code becomes just too unreadable.<br />
<br />
PHP just doesn't seem exciting for me anymore. There doesn't seem to be anything exciting happening. Yes <a href="http://php.net/releases/5_4_0.php" target="_blank">PHP 5.4</a> was recently released which has the new Traits feature, but other than that, not much has been happening with the language and nothing interesting as far as apps or frameworks. The only object that piqued my interest was <a href="http://laravel.com/" target="_blank">Laravel</a>.<br />
<br />
<u><span style="font-size: large;">Why not Python/Ruby/Java/Any Other Language?</span></u><br />
<br />
I
like to consider myself open to trying new programming languages. Even
if you don't wind up using a language long term, sometimes your
programming skills can still benefit from solving solutions from a
different point of view. Below is a quick overview of my dealings with
other languages. Most were brief enough that they shouldn't be taken
too seriously.<br />
<br />
Python - I have no problems with Python. I have completed a couple of projects in Python and find it a joy to work with.<br />
Ruby
- My only experience was with Ruby On Rails around version 0.9.3. At
the time, the framework made coding easier but at the expense of
performance. Scaling was terrible at the time.<br />
Node- This seems to be all the rage. Everybody likes to
use the term "Non-Blocking" to make themselves seem cool. The draw is
to be able to code the same language client side and server side and
even share that code so you don't have to write validations in two
places. Node is still young but provides ample libraries with a large
developer community already.<br />
Java - Too bloated for me and if I use it there is a possibility Oracle might sue me!<br />
C - I mostly used it in school and haven't had the need to use it since.<br />
C# - This language seemed well thought out, but I am not into using .NET products and Mono just wasn't a viable solution for me.<br />
<br />
There
are some languages that I would like to still try (for various
different reasons) like Clojure, Scala, Dart, Smalltalk, Erlang, and Haskell.
I will get to them when I can.<br />
<br />
<br />
<u><span style="font-size: large;">Why is Go the Shiznit?</span></u><br />
<br />
Go makes me a better coder! I enjoy coding more with Go and was productive very quickly. The documentation was complete and organized. The support forums are great and are frequented by the core contributors of the language. <a href="http://golang.org/doc/effective_go.html" target="_blank">Effective Go</a> is a great way to get started with Go.<br />
<br />
I like the multiple return values instead of exceptions which forces you to deal with errors right away.<br />
<br />
Some people don't like static typing and strict compilers, I do. It saves me a lot of debugging time and prevents my program from crashing in a rare use case. The compiler will tell me if I declared a variable and didn't use it or tried to use an undeclared variable, both signs that I have probably made a typo somewhere. The compiler is very fast! Large apps can still compile in under half a second.<br />
<br />
Since I'm not a sysadmin, I prefer to pay extra to have my code managed by someone. Besides Google App Engine, people have implemented Go on <a href="https://github.com/kr/heroku-buildpack-go/tree/rc" target="_blank">Heroku </a>and <a href="https://github.com/gcmurphy/golang-openshift" target="_blank">OpenShift</a>.<br />
<br />
Although I haven't used it, Go's concurrency model seems straightforward and easy to use.<br />
<br />
Interfaces and reflection are awesome. Takes a little getting used to, but once interfaces click in your head, you'll be hooked. There is a blog post that sums interfaces/reflection up better than I can at <a href="http://blog.golang.org/2011/09/laws-of-reflection.html" target="_blank">http://blog.golang.org/2011/09/laws-of-reflection.html</a>.<br />
<br />
<br />
<u><span style="font-size: large;">Conclusion</span></u><br />
<br />
Go helps me write cleaner and more maintainable code. Now that Go 1 has been released, the code base has really stabilized, allowing me to feel more confident about using Go in a production environment. The maintainers of Go say: "People who write Go 1 programs can be confident that those programs will
continue to compile and run without change, in many environments, on a
time scale of years."<br />
<br />
Since there are millions of PHP users and six people who read this blog (Hi Mom!), I doubt that I will cause of a shift of PHP users to use Go, but maybe the next time you have a project that is a fit for Go, you will give it a try! You can create Google App Engine projects for free to help you get started.<br />
<br />
<br />
<br />
<br />
<br />
<br />Anonymoushttp://www.blogger.com/profile/16674502256088535831noreply@blogger.com139tag:blogger.com,1999:blog-5559561118621170203.post-41999082812763746622012-06-04T08:00:00.000-06:002012-06-04T08:00:12.841-06:00Centralized Logging with Codeigniter<br />
<u><span style="font-size: large;">Background</span></u><br />
<br />
In a previous <a href="http://mikebeale.blogspot.com/2012/03/find-great-logging-system.html" target="_blank">article</a> I spoke about the search for a logging system. Having decided on Loggly, I needed a way to integrate logging in both my API and application.<br />
<br />
<span style="font-size: large;"><u>Setup</u></span><br />
<br />
All of my servers needed to be set up to pass syslog messages onto Loggly. I was using Ubuntu and there was an easy walk through on the Loggly wiki <a href="http://wiki.loggly.com/syslognginstallation" target="_blank">here</a>. I grouped all of my servers in the "Production" group so that all logs were searchable under one group. I could have separated the groups (or inputs as Loggly calls them) into an "Application" and "API" group but thought that combining them together would help me search for issues more efficiently.<br />
<br />
After the initial setup, I found that cron messages were <span class="st"><i>immediately </i></span>filling up my logs with unnecessary information. Messages similar to the one below were common.<br />
<br />
<span style="background-color: #333333; color: #dddddd; display: inline ! important; float: none; font-family: Courier,monospace; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 19px; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">pam_unix(cron:session): session opened for user root by (uid=0)</span><br />
<span style="background-color: #333333; color: #dddddd; display: inline ! important; float: none; font-family: Courier,monospace; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 19px; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><br /></span><br />
<span style="background-color: #333333; color: #dddddd; display: inline ! important; float: none; font-family: Courier,monospace; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 19px; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"></span><br />
I wanted to remove those messages from Loggly. I had to go into /etc/syslog-ng/syslog-ng.conf and edit the filters to ignore cron messages.<br />
<br />
log {<br />
source(s_all);filter(f_cron); destination(d_loggly);<br />
};<br />
<br />
<a name='more'></a><br />
<br />
<u><span style="font-size: large;">Integrating with the APP/API</span></u><br />
<br />
We use Codeigniter as our framework for our app. There were not any libraries to help us implement our app with syslog-ng, so we wrote our own <a href="https://github.com/mbeale/syslog-codeigniter" target="_blank">here</a>. We set the library up to log as much information about the request as possible. We also extended the CI_Log class so that all errors in it were being forwarded to Loggly.<br />
<br />
The API is written mainly in Python but we had already been logging messages to syslog. That was an easy switch as they were automatically forwarded on to Loggly. We just added logging of the request header information so we could monitor those as well.<br />
<br />
<span style="font-size: large;"><u>Why is Logging Great?</u></span><br />
<br />
Troubleshooting user errors became much easier. We only do email support, so now instead of always needing to ask for more information and wait for a reply, we can now just look at their activity and see a picture of what they were doing. What pages they visited. What information they submitted in forms. What browser they were using. If they encountered any errors. Were there API request headers accurate. Things of that nature.<br />
<br />
All of our application errors were logged into Loggly and could be queried for by any of our team without having to ssh into each box and search for errors in all the various logs. They were now centralized, and anyone of our team members could now find and debug errors easily.<br />
<br />
<u><span style="font-size: large;">What's Next</span></u><br />
<br />
We need to centralize our logging for everything. We want to centralize MySQL queries and logs and our Apache access/error logs. We also are looking into Loggly's API to provide some automated reporting on errors and MySQL slow queries.<br />
<br />
<u><span style="font-size: large;">Conclusion</span></u><br />
<br />
I think using centralized logging is a must. Information is a valuable commodity and having that data easily accessible makes locating and resolving issues more manageable. <br />
<br />
<br />Anonymoushttp://www.blogger.com/profile/16674502256088535831noreply@blogger.com2tag:blogger.com,1999:blog-5559561118621170203.post-85111042804954136532012-05-20T22:33:00.000-06:002012-05-22T07:08:52.942-06:00Go and XML<u><span style="font-size: large;">Background </span></u><br />
<br />
After months of lurking in the Go forums and following #golang and Go's reddit feed, I decided to dive in with my first "real" <a href="http://www.golang.org/" rel="nofollow" target="_blank">Go</a> project creating a API client library for <a href="http://www.recurly.com/" target="_blank">Recurly</a>. I'm still in the middle of finishing the project but already I find Go easy to use and I find myself being very productive. One particular area of productivity, is with processing XML. Recurly only returns xml at the time of this writing, so marshalling/unmarshalling XML to structs was going to be very important for this project.<br />
<br />
<a name='more'></a><br />
<br />
<u><span style="font-size: large;">Where to start</span></u><br />
<br />
The package documentation on <a href="http://golang.org/pkg/" target="_blank">golang.org</a> is excellent and great place to start learning Go. Go and it's authors seem to have libraries for all your needs, yet the language still doesn't seem bloated. The particular package I was going to deal with is "<a href="http://golang.org/pkg/encoding/xml/" target="_blank">endcoding/xml</a>".<br />
<br />
<u><span style="font-size: large;">Show me the code</span></u><br />
<br />
Go makes dealing with XML extremely simple. Since Recurly sends back structured XML objects, <span style="font-size: large;"><span style="font-size: small;">I needed to create structs for those objects. Here is an example.</span></span><br />
<br />
<script src="https://gist.github.com/2731904.js?file=gistfile1.go">
</script>
<br />
<br />
<span style="font-size: large;"><span style="font-size: small;">The good thing here is that I could name my fields whatever I liked because I can override the field mappings. This way, if I don't like underscores, I can use camel case and still have the fields map out properly. By adding the XMLName attribute, the parent tag for the XML can be overridden.</span></span><br />
<br />
<script src="https://gist.github.com/2731920.js?file=gistfile1.go">
</script>
<br />
<span style="font-size: large;"><span style="font-size: small;">Now if I want to unmarshal the XML, I just need to load in the response body and pass the struct to have the XML data loaded.</span></span><br />
<br />
<script src="https://gist.github.com/2731955.js?file=gistfile1.go">
</script>
<br />
<br />
<span style="font-size: large;"><span style="font-size: small;">I can also very easily update the struct then marshal the data back into XML where it can be placed in the body of a put request.</span></span><br />
<br />
<script src="https://gist.github.com/2732090.js?file=gistfile1.go">
</script>
<br />
<br />
<span style="font-size: large;"><span style="font-size: small;">You can even nest structs within structs or slices of structs within structs.</span></span><br />
<br />
<script src="https://gist.github.com/2732291.js?file=gistfile1.go">
</script>
<br />
There are also many more options like being able to reference attributes, ignore fields, and even inserting a field as a comment. More information on these options <a href="http://golang.org/pkg/encoding/xml/#Marshal" target="_blank">here</a>.<br />
<br />
<span style="font-size: large;"><span style="font-size: small;"><span style="font-size: large;"><u>Issues</u></span></span></span><br />
<span style="font-size: large;"><span style="font-size: small;"><span style="font-size: large;"><u></u></span> </span></span><br />
<span style="font-size: large;"><span style="font-size: small;">Issues that I found weren't really with Go itself but more with using Go with Recurly since Recurly doesn't allow extra fields in their XML. For instance, if I was to get an account, a field that is returned is "created_at" which references the time created. Now if I go to update the account, I will get an error back saying "Invalid XML. <created_at> not a valid field." The way I worked around it was to copy the struct and empty out fields that were not part of the list of accepted fields. That and setting the xml option of "omitempty" would cause the field to not be created during the marshalling process. I was thinking of using regexp to filter out unwanted fields in the raw XML but didn't implement. If anyone has any other suggestions, leave a comment.</span></span><br />
<span style="font-size: large;"><span style="font-size: small;"><br /></span></span><br />
<span style="font-size: large;"><span style="font-size: small;"><span style="font-size: large;"><u>Conclusion</u></span></span></span><br />
<span style="font-size: large;"><span style="font-size: small;"><br /></span></span><br />
<span style="font-size: large;"><span style="font-size: small;">As you can see, dealing with XML in Go can be quick and easy, making you a more</span> <span style="font-size: small;">productive coder. I will be posting more on Go so stay tuned.</span></span><br />
<span style="font-size: large;"><br /></span><br />
<br />
<br />
<br />Anonymoushttp://www.blogger.com/profile/16674502256088535831noreply@blogger.com14tag:blogger.com,1999:blog-5559561118621170203.post-86044698223911804812012-03-17T10:48:00.000-06:002012-05-20T08:22:56.533-06:00Find a great logging systemI wanted to get more detailed logging and have it available to my team and I so I can do postmortem analyzing of transactions after they were completed. This could help me discover what data was actually sent by the user, what the SQL query was (if any), the resource requested, and what the status code returned was. I needed this both for my web app code as well as for my API, and I needed to be able to search through both of them to find specific transactions.<br />
<br />
First step was to choose a logging platform. I had several criteria that I used while evaluating each logging product.<br />
<br />
1. Ease of Install<br />
2. Ease of Maintenance<br />
3. Low cost of entry<br />
4. Great Search functionality<br />
5. API to pull out data from.<br />
<br />
I would like to stress here that I am in no way a sysadmin and only know enough to be dangerous! I narrowed my choices to 2, <a href="http://www.splunk.com/" target="_blank">Splunk</a> and <a href="http://www.loggly.com/" target="_blank">Loggly</a>. Here is what I found:<br />
<br />
<a name='more'></a><br /><br />
<u>Splunk</u><br />
<br />
Pros: Great support backed by a company that has been in business for years. They have a free product and an enterprise product so you can start small for free and when you out grow the free edition, you can pay for the enterprise edition. Can install on virtually any platform. You are in total control of your data and how it is accessed. Great search functionality and browser based tools.<br />
<br />
Cons: Free version is missing some key features. You need your own hardware to run this product, as well as doing any upgrades or maintenance yourself. They didn't list pricing for enterprise edition so I can only assume that it is pricey!<br />
<br />
Note: Splunk is now has a cloud based service that is by invite only that I didn't evaluate. <br />
<br />
<u>Loggly</u><br />
<br />
Pros: Small client install process but after that maintenance is not needed. Free usage tier which includes 200MB daily volume limit and stores those logs for 1 week. Unlimited scalability which can be easily upgraded. Search functionality and developer API to get at your data.<br />
<br />
Cons: Access to your logs is reliant on their availability. So if their service is down for maintenance (or any other reason) you aren't able to view your information. Can get pricey if your app gets huge. For instance if you wanted to keep 12GB a day of data for 90days, you are looking at $1,799 a month. Maybe if you are logging that many transactions, that price might not make you blink! <br />
<br />
<br />
So what did I choose? I went with Loggly. Their initial setup cost ($0) and ongoing maintenance costs ($0) works well for my small team. We don't have time/resources/skills to manage another server so this takes a load off of us and let's us do what we do best, code! If I was part of a well funded start up and had a person who all he did sysadmin work for us, I probably would have gone with Splunk. There would be advantages to retaining all our data in house and in the long run, could be more cost effective.<br />
<br />
I will chronicle my adventures in logging. I hope to show web engineers the importance of logging and how a little extra setup in the beginning could save you time tracking down customer issues.Anonymoushttp://www.blogger.com/profile/16674502256088535831noreply@blogger.com1