 ------
 Log Files
 ------
 Jevica Arianne B. Zurbano
 ------
 2010-02-19
 ------

~~ 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.

Log Files

  To keep track of the Continuum performance and problems, log files are created during runtime.
  These files can be found in the <<<logs/>>> directory.

  * {{{./continuum-logs.html} <<continuum.log>>}} - contains all the start-up information for Continuum.

  * {{{./audit-logs.html} <<continuum-audit.log>>}} - contains information regarding the project operations and configurations being modified.
                            For example, projects added are logged here, with date and timestamp,
                            userId of who performed the deploy, and the project that was built.
                            For security measure, passwords are masked behind asterisks.

  * {{{./security-logs.html} <<continuum-security-audit.log>>}} - contains information regarding Continuum's security.
                            For example, a successful login of a user or a user account is created.

  []
