This Tuscany sample shows how to implement and use a simple Logger component
that logs string messages to a Scribe logging server.

Scribe is an Open Source server for aggregating streaming log data. It is
designed to scale to a very large number of nodes and be robust to network
and node failures.

See the Scribe Wiki [1] for more information on Scribe.

Getting the required Apache Thrift library
==========================================
This sample uses Apache Thrift's libthrift.jar to communicate with Scribe
servers. Libthrift is not yet available in a Maven repository, so before
building the sample with Maven, you need to download libthrift [2] and
install it in your local Maven repository like this:

mvn install:install-file -DgroupId=org.apache.thrift -DartifactId=libthrift \
-Dversion=1.0-SNAPSHOT -Dpackaging=jar -Dfile=libthrift-r917130.jar

Starting a Scribe server
========================
Before running the LoggingTest sample test program, you need to start a Scribe
server for the sample program to connect to.

Steps to start a Scribe server are described in the Scribe examples README [3].
A simple Scribe server configuration can be found in the Scribe examples [4].

LoggingTest will try to connect to a Scribe server at localhost:1463. To use
a Scribe server at a different host or port, configure the host and port
properties in scribe.composite to match your server.

Running the LoggingTest sample test program
===========================================

To run the LoggingTest sample test program, do this:
mvn -Dtest=LoggingTest test

Checking the Scribe log output
==============================
After running LoggingTest, you should find the logged string "Hello There" in
file sample/sample_current under your Scribe log store directory.

If you've used the example1.conf Scribe configuration from the Scribe examples
[4], you should find your log message in /tmp/scribetest/sample/sample_current.


[1] http://wiki.github.com/facebook/scribe/
[2] http://svn.apache.org/repos/asf/cassandra/trunk/lib/libthrift-r917130.jar
[3] http://github.com/facebook/scribe/blob/master/examples/README
[4] http://github.com/facebook/scribe/blob/master/examples/example1.conf

