blob: ea31885bea1aa4c26f0fe0c5a4be8cbd6817fe46 [file] [log] [blame]
/*
* 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.
*/
package org.apache.geode.logging.internal;
import static org.apache.geode.logging.internal.Configuration.STARTUP_CONFIGURATION;
import static org.apache.geode.logging.internal.InternalSessionContext.State.CREATED;
import static org.apache.geode.logging.internal.InternalSessionContext.State.STARTED;
import static org.apache.geode.logging.internal.InternalSessionContext.State.STOPPED;
import java.util.Optional;
import org.apache.logging.log4j.Logger;
import org.apache.geode.annotations.VisibleForTesting;
import org.apache.geode.internal.logging.Banner;
import org.apache.geode.logging.internal.log4j.api.LogService;
import org.apache.geode.logging.internal.spi.LogConfigSupplier;
import org.apache.geode.logging.internal.spi.LogFile;
/**
* Configures the logging {@code Configuration} and provides lifecycle to Geode logging.
*/
public class LoggingSession implements InternalSessionContext {
private static final Logger logger = LogService.getLogger();
private final Configuration configuration;
private final LoggingSessionNotifier loggingSessionNotifier;
private volatile boolean logBanner;
private volatile boolean logConfiguration;
private State state = STOPPED;
public static LoggingSession create() {
return create(Configuration.create(), LoggingSessionRegistryProvider.get());
}
@VisibleForTesting
static LoggingSession create(final Configuration configuration,
final LoggingSessionNotifier loggingSessionNotifier) {
return new LoggingSession(configuration, loggingSessionNotifier);
}
LoggingSession(final Configuration configuration,
final LoggingSessionNotifier loggingSessionNotifier) {
this.configuration = configuration;
this.loggingSessionNotifier = loggingSessionNotifier;
}
public synchronized void createSession(final LogConfigSupplier logConfigSupplier) {
createSession(logConfigSupplier, true, true);
}
public synchronized void createSession(final LogConfigSupplier logConfigSupplier,
final boolean logBanner, final boolean logConfiguration) {
configuration.initialize(logConfigSupplier);
state = state.changeTo(CREATED);
loggingSessionNotifier.createSession(this);
this.logBanner = logBanner;
this.logConfiguration = logConfiguration;
}
/**
* Note: nothing checks Boolean.getBoolean(InternalLocator.INHIBIT_DM_BANNER anymore.
*/
public synchronized void startSession() {
state = state.changeTo(STARTED);
loggingSessionNotifier.startSession();
configuration.disableLoggingToStandardOutputIfLoggingToFile();
if (logBanner) {
logger.info(new Banner(configuration.getConfigurationInfo()).getString());
}
if (logConfiguration) {
String configInfo = configuration.getLogConfigSupplier().getLogConfig().toLoggerString();
logger.info(STARTUP_CONFIGURATION + System.lineSeparator() + configInfo);
}
}
public synchronized void stopSession() {
configuration.enableLoggingToStandardOutput();
state = state.changeTo(STOPPED);
loggingSessionNotifier.stopSession();
}
public synchronized void shutdown() {
configuration.shutdown();
}
public Optional<LogFile> getLogFile() {
return loggingSessionNotifier.getLogFile();
}
@Override
public State getState() {
return state;
}
@Override
public LogConfigSupplier getLogConfigSupplier() {
return configuration.getLogConfigSupplier();
}
@VisibleForTesting
LoggingSessionNotifier getLoggingSessionNotifier() {
return loggingSessionNotifier;
}
}