com.twitter.common.logging.LogUtil.java Source code

Java tutorial

Introduction

Here is the source code for com.twitter.common.logging.LogUtil.java

Source

// =================================================================================================
// Copyright 2011 Twitter, Inc.
// -------------------------------------------------------------------------------------------------
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this work except in compliance with the License.
// You may obtain a copy of the License in the LICENSE file, or 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.
// =================================================================================================

package com.twitter.common.logging;

import com.google.common.annotations.VisibleForTesting;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.SystemUtils;

import java.io.File;
import java.util.logging.LogManager;
import java.util.logging.Logger;

/**
 * Logging utility functions.
 *
 * @author William Farner
 */
public class LogUtil {

    private static final Logger LOG = Logger.getLogger(LogUtil.class.getName());

    private static final String LOG_MANAGER_FILE_PROP = "java.util.logging.FileHandler.pattern";

    @VisibleForTesting
    static final File DEFAULT_LOG_DIR = new File("/var/log");

    /**
     * Gets the log directory as configured with the log manager.  This will attempt to expand any
     * directory wildcards that are included in log file property.
     *
     * @return The configured log directory.
     */
    public static File getLogManagerLogDir() {
        return getLogManagerLogDir(LogManager.getLogManager().getProperty(LOG_MANAGER_FILE_PROP));
    }

    /**
     * Gets the log directory as specified in a log file pattern.  This will attempt to expand any
     * directory wildcards that are included in log file property.
     *
     * @param logFilePattern The pattern to extract the log directory from.
     * @return The configured log directory.
     */
    public static File getLogManagerLogDir(String logFilePattern) {
        if (StringUtils.isEmpty(logFilePattern)) {
            LOG.warning("Could not find log dir in logging property " + LOG_MANAGER_FILE_PROP + ", reading from "
                    + DEFAULT_LOG_DIR);
            return DEFAULT_LOG_DIR;
        }

        String logDir = expandWildcard(logFilePattern, "%t", SystemUtils.JAVA_IO_TMPDIR);
        logDir = expandWildcard(logDir, "%h", SystemUtils.USER_HOME);
        File parent = new File(logDir).getParentFile();
        return parent == null ? new File(".") : parent;
    }

    /**
     * Expands a directory path wildcard within a file pattern string.
     * Correctly handles cases where the replacement string does and does not contain a trailing
     * slash.
     *
     * @param pattern File pattern string, which may or may not contain a wildcard.
     * @param dirWildcard Wildcard string to expand.
     * @param replacement Path component to expand wildcard to.
     * @return {@code pattern} with all instances of {@code dirWildcard} replaced with
     *     {@code replacement}.
     */
    private static String expandWildcard(String pattern, String dirWildcard, String replacement) {
        String replace = dirWildcard;
        if (replacement.charAt(replacement.length() - 1) == '/') {
            replace += '/';
        }
        return pattern.replaceAll(replace, replacement);
    }

    private LogUtil() {
        // Utility class.
    }
}