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:
committed by
David Pursehouse
parent
bfdcec0071
commit
c27f21d143
@@ -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) {
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user