~~ Licensed to the Apache Software Foundation (ASF) under one or more
~~ contributor license agreements.  See the NOTICE file distributed with
~~ this work for additional information regarding copyright ownership.
~~ The ASF licenses this file to You under the Apache License, Version 2.0
~~ (the "License"); you may not use this file except in compliance with
~~ the License.  You may obtain a copy of the License at
~~
~~      http://www.apache.org/licenses/LICENSE-2.0
~~
~~ Unless required by applicable law or agreed to in writing, software
~~ distributed under the License is distributed on an "AS IS" BASIS,
~~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~~ See the License for the specific language governing permissions and
~~ limitations under the License.

Introduction

	Welcome to the home of Apache Chainsaw&#x2122; v2!
	
	Chainsaw v2 is a companion application to Log4j written by members of the Log4j development
    community. Like a number of Open Source
    projects, this new version was built upon inspirations, ideas and creations of others. 
    Chainsaw v2 has it's roots from the original Chainsaw utility written by Oliver Burn, 
    and with inspiration from the Log Factor 5 utility contributed by ThoughtWorks Inc. 
 
                                                

Available Distributions	

	* Standalone -.sh/.bat
	
	* OS X 'native' distribution (uses Java still, but looks like a real OSX application)

    Web Start support will be re-added in an upcoming release
	
 	Click {{{download.html}Download}} link for more information.

So what is it really?

	It's a GUI-based Log viewer. A picture tells a thousand words...
	
[images/chainsaw-1.jpg] Screenshot
                                       
	These screen shots were taken on Mac OS High Sierra.
	
	Rather than rely on a combination of tail/grep/vi or equivalent to view/query/trace-through
    a huge trail of logging events, you can use Chainsaw.  
    
    Chainsaw can read local and ssh-reachable regular text log files, as well as log files formatted in Log4j's XMLLayout.  Chainsaw can also 
    receive events over TCP and UDP, read events from a DB, and can process events generated by java.util.logging.

      
Tutorial and User Manual

	Chainsaw already includes help with with a Quick Reference and a Tutorial to get you started, all 
	viewable from within the GUI!

      
Alternatives

	* {{{https://github.com/otros-systems/otroslogviewer}OtrosLogViewer}} is supporting different log formats (log4j, log4j2, logback, JUL) with pluginable architecture and Intellij/Eclispe integration.

	* {{{http://lilith.huxhorn.de}Lilith}} is a Logging and AccessEvent viewer for Log4j, Logback, and java.util.logging

	* {{{https://github.com/anb0s/logviewer}eclipse logviewer}} is Eclipse Plug-in for tailing log files and eclipse consoles.
