Refactor system log creation to remove code duplication

Error, gc, http and ssh logs are created programmatically but the
code to create the appender was duplicated.

Move appender creation code into SystemLog to remove
duplicated code and allow to reuse it to create another log.

Also move LogUtil.shouldConfigureLogSystem into SystemLog class.

Change-Id: Ic691e573c3bcd74b4cb77905a176773540235f1a
This commit is contained in:
Hugo Arès
2014-06-26 15:58:53 -04:00
committed by David Pursehouse
parent bfdcec0071
commit c27f21d143
10 changed files with 165 additions and 399 deletions

View File

@@ -0,0 +1,136 @@
// Copyright (C) 2014 The Android Open Source Project
//
// Licensed 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.
package com.google.gerrit.server.util;
import com.google.common.base.Strings;
import com.google.gerrit.common.Die;
import com.google.gerrit.server.config.GerritServerConfig;
import com.google.gerrit.server.config.SitePaths;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import org.apache.log4j.Appender;
import org.apache.log4j.AsyncAppender;
import org.apache.log4j.DailyRollingFileAppender;
import org.apache.log4j.Layout;
import org.apache.log4j.Level;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.apache.log4j.helpers.OnlyOnceErrorHandler;
import org.apache.log4j.spi.ErrorHandler;
import org.apache.log4j.spi.LoggingEvent;
import org.eclipse.jgit.lib.Config;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.IOException;
@Singleton
public class SystemLog {
private static final org.slf4j.Logger log = LoggerFactory
.getLogger(SystemLog.class);
private static final String LOG4J_CONFIGURATION = "log4j.configuration";
private final SitePaths site;
private final Config config;
@Inject
public SystemLog(final SitePaths site, @GerritServerConfig Config config) {
this.site = site;
this.config = config;
}
public static boolean shouldConfigure() {
return Strings.isNullOrEmpty(System.getProperty(LOG4J_CONFIGURATION));
}
public static Appender createAppender(File logdir, String name, Layout layout) {
final DailyRollingFileAppender dst = new DailyRollingFileAppender();
dst.setName(name);
dst.setLayout(layout);
dst.setEncoding("UTF-8");
dst.setFile(new File(resolve(logdir), name).getPath());
dst.setImmediateFlush(true);
dst.setAppend(true);
dst.setThreshold(Level.INFO);
dst.setErrorHandler(new DieErrorHandler());
dst.activateOptions();
dst.setErrorHandler(new OnlyOnceErrorHandler());
return dst;
}
public AsyncAppender createAsyncAppender(String name, Layout layout) {
AsyncAppender async = new AsyncAppender();
async.setBlocking(true);
async.setBufferSize(config.getInt("core", "asyncLoggingBufferSize", 64));
async.setLocationInfo(false);
if (shouldConfigure()) {
async.addAppender(createAppender(site.logs_dir, name, layout));
} else {
Appender appender = LogManager.getLogger(name).getAppender(name);
if (appender != null) {
async.addAppender(appender);
} else {
log.warn("No appender with the name: " + name + " was found. " + name
+ " logging is disabled");
}
}
async.activateOptions();
return async;
}
private static File resolve(final File logs_dir) {
try {
return logs_dir.getCanonicalFile();
} catch (IOException e) {
return logs_dir.getAbsoluteFile();
}
}
private static final class DieErrorHandler implements ErrorHandler {
@Override
public void error(String message, Exception e, int errorCode,
LoggingEvent event) {
error(e != null ? e.getMessage() : message);
}
@Override
public void error(String message, Exception e, int errorCode) {
error(e != null ? e.getMessage() : message);
}
@Override
public void error(String message) {
throw new Die("Cannot open log file: " + message);
}
@Override
public void activateOptions() {
}
@Override
public void setAppender(Appender appender) {
}
@Override
public void setBackupAppender(Appender appender) {
}
@Override
public void setLogger(Logger logger) {
}
}
}