Skip to content

Commit

Permalink
[sre] Redefine the logging system for enabling agents to change the l…
Browse files Browse the repository at this point in the history
…ogging level.

close #803

Signed-off-by: Stéphane Galland <galland@arakhne.org>
  • Loading branch information
gallandarakhneorg committed Jan 25, 2018
1 parent 6031928 commit cda3728
Show file tree
Hide file tree
Showing 31 changed files with 547 additions and 904 deletions.
Expand Up @@ -38,14 +38,12 @@
import com.google.inject.Module;
import com.google.inject.Singleton;

import io.janusproject.JanusConfig;
import io.janusproject.kernel.services.jdk.spawn.CannotSpawnException;
import io.janusproject.services.IServiceManager;
import io.janusproject.services.Services;
import io.janusproject.services.logging.LogService;
import io.janusproject.services.spawn.KernelAgentSpawnListener;
import io.janusproject.services.spawn.SpawnService;
import io.janusproject.util.LoggerCreator;
import io.janusproject.util.TwoStepConstruction;

import io.sarl.lang.core.Agent;
Expand Down Expand Up @@ -80,11 +78,6 @@ public class Kernel {

private final LogService loggingService;

/**
* Logger used by the kernel, but not linked to the logging kernel's service.
*/
private Logger rawLogger;

private final AtomicBoolean isRunning = new AtomicBoolean(true);

/**
Expand Down Expand Up @@ -200,14 +193,7 @@ public <S extends Service> S getService(Class<S> type) {
* @return the logger of the kernel.
*/
public Logger getLogger() {
Logger log = this.loggingService.getLogger();
if (log == null) {
if (this.rawLogger == null) {
this.rawLogger = LoggerCreator.createLogger(JanusConfig.JANUS_DEFAULT_PLATFORM_NAME);
}
log = this.rawLogger;
}
return log;
return this.loggingService.getKernelLogger();
}

/**
Expand Down
Expand Up @@ -21,6 +21,7 @@

package io.janusproject.kernel.bic;

import java.text.MessageFormat;
import java.util.Collection;
import java.util.Queue;
import java.util.UUID;
Expand Down Expand Up @@ -248,7 +249,7 @@ private void runInitializationStage(Event event) {
} else {
final LogRecord record = new LogRecord(Level.SEVERE, Messages.InternalEventBusSkill_3);
record.setThrown(Throwables.getRootCause(e));
this.logger.log(record);
this.logger.getKernelLogger().log(record);
}
// If we have an exception within the agent's initialization, we kill the agent.
setOwnerState(OwnerState.ALIVE);
Expand Down Expand Up @@ -278,7 +279,7 @@ private void runDestructionStage(Event event) {
} else {
final LogRecord record = new LogRecord(Level.SEVERE, Messages.InternalEventBusSkill_4);
record.setThrown(Throwables.getRootCause(e));
this.logger.log(record);
this.logger.getKernelLogger().log(record);
}
}
}
Expand Down Expand Up @@ -384,7 +385,7 @@ public void receiveEvent(Event event) {
case DEAD:
// Dropping messages since agent is dying
assert !getOwnerState().isEventHandling();
InternalEventBusSkill.this.logger.debug(Messages.InternalEventBusSkill_1, event);
InternalEventBusSkill.this.logger.getKernelLogger().fine(MessageFormat.format(Messages.InternalEventBusSkill_1, event));
break;
default:
throw new IllegalStateException();
Expand Down
Expand Up @@ -49,9 +49,16 @@
*/
public class LoggingSkill extends BuiltinSkill implements Logging {

private static final Level DEBUG_LEVEL = Level.FINE;

private static final Level INFO_LEVEL = Level.INFO;

private static final Level WARNING_LEVEL = Level.WARNING;

private static final Level ERROR_LEVEL = Level.SEVERE;

private static int installationOrder = -1;

@Inject
private LogService logService;

private Logger logger;
Expand All @@ -76,22 +83,43 @@ public Logger getLogger() {
return this.logger;
}

/** Change the reference to the logging service.
*
* @param service the service.
*/
@Inject
public void setLoggingService(LogService service) {
assert service != null;
this.logService = service;
}

/** Change the internal logger.
*
* @param logger the logger.
*/
public void setLogger(Logger logger) {
assert logger != null;
this.logger = logger;
}

@Override
protected void install() {
final UUID agentId = getOwner().getID();
final String loggerName = MessageFormat.format(Messages.LoggingSkill_0, agentId);
this.logger = LoggerCreator.createLogger(loggerName, this.logService.getLogger());
final Logger logger = this.logService.createAgentLogger(loggerName);
setLogger(logger);
}

@Override
public void setLoggingName(String name) {
String loggingName = name;
if (loggingName == null || loggingName.isEmpty()) {
loggingName = MessageFormat.format(Messages.LoggingSkill_0, getOwner().getID());
String loggerName = name;
if (loggerName == null || loggerName.isEmpty()) {
loggerName = MessageFormat.format(Messages.LoggingSkill_0, getOwner().getID());
}
final Level level = this.logger.getLevel();
this.logger = LoggerCreator.createLogger(loggingName, this.logService.getLogger());
this.logger.setLevel(level);
Logger logger = getLogger();
final Level level = logger != null ? logger.getLevel() : null;
logger = this.logService.createAgentLogger(loggerName, level);
setLogger(logger);
}

@Override
Expand All @@ -101,130 +129,141 @@ public void println(Object message) {

@Override
public void error(Object message, Throwable exception, Object... parameters) {
if (this.logger.isLoggable(Level.SEVERE) && message != null) {
final Logger logger = getLogger();
if (logger.isLoggable(ERROR_LEVEL) && message != null) {
final String loggeableMessage = message.toString();
if (exception != null) {
final LogRecord lr = new LogRecord(Level.SEVERE, loggeableMessage);
final LogRecord lr = new LogRecord(ERROR_LEVEL, loggeableMessage);
lr.setParameters(parameters);
lr.setThrown(Throwables.getRootCause(exception));
this.logger.log(lr);
logger.log(lr);
} else {
this.logger.log(Level.SEVERE, loggeableMessage, parameters);
logger.log(ERROR_LEVEL, loggeableMessage, parameters);
}
}
}

@Override
public void error(Object message, Object... parameters) {
if (this.logger.isLoggable(Level.SEVERE) && message != null) {
final Logger logger = getLogger();
if (logger.isLoggable(ERROR_LEVEL) && message != null) {
final String loggeableMessage = message.toString();
this.logger.log(Level.SEVERE, loggeableMessage, parameters);
logger.log(ERROR_LEVEL, loggeableMessage, parameters);
}
}

@Override
public void error(Supplier<String> messageProvider) {
if (this.logger.isLoggable(Level.SEVERE) && messageProvider != null) {
this.logger.log(Level.SEVERE, messageProvider);
final Logger logger = getLogger();
if (logger.isLoggable(ERROR_LEVEL) && messageProvider != null) {
logger.log(ERROR_LEVEL, messageProvider);
}
}

@Override
public void warning(Object message, Throwable exception, Object... parameters) {
if (this.logger.isLoggable(Level.WARNING) && message != null) {
final Logger logger = getLogger();
if (logger.isLoggable(WARNING_LEVEL) && message != null) {
final String loggeableMessage = message.toString();
if (!loggeableMessage.isEmpty()) {
if (exception != null) {
final LogRecord lr = new LogRecord(Level.WARNING, loggeableMessage);
final LogRecord lr = new LogRecord(WARNING_LEVEL, loggeableMessage);
lr.setParameters(parameters);
lr.setThrown(exception);
this.logger.log(lr);
logger.log(lr);
} else {
this.logger.log(Level.WARNING, loggeableMessage, parameters);
logger.log(WARNING_LEVEL, loggeableMessage, parameters);
}
}
}
}

@Override
public void warning(Object message, Object... parameters) {
if (this.logger.isLoggable(Level.WARNING) && message != null) {
final Logger logger = getLogger();
if (logger.isLoggable(WARNING_LEVEL) && message != null) {
final String loggeableMessage = message.toString();
if (!loggeableMessage.isEmpty()) {
this.logger.log(Level.WARNING, loggeableMessage, parameters);
logger.log(WARNING_LEVEL, loggeableMessage, parameters);
}
}
}

@Override
public void warning(Supplier<String> messageProvider) {
if (this.logger.isLoggable(Level.WARNING) && messageProvider != null) {
this.logger.log(Level.WARNING, messageProvider);
final Logger logger = getLogger();
if (logger.isLoggable(WARNING_LEVEL) && messageProvider != null) {
logger.log(WARNING_LEVEL, messageProvider);
}
}

@Override
public void info(Object message, Object... parameters) {
if (this.logger.isLoggable(Level.INFO) && message != null) {
final Logger logger = getLogger();
if (logger.isLoggable(INFO_LEVEL) && message != null) {
final String loggeableMessage = message.toString();
if (!loggeableMessage.isEmpty()) {
this.logger.log(Level.INFO, loggeableMessage, parameters);
logger.log(INFO_LEVEL, loggeableMessage, parameters);
}
}
}

@Override
public void info(Supplier<String> messageProvider) {
if (this.logger.isLoggable(Level.INFO) && messageProvider != null) {
this.logger.log(Level.INFO, messageProvider);
final Logger logger = getLogger();
if (logger.isLoggable(INFO_LEVEL) && messageProvider != null) {
logger.log(INFO_LEVEL, messageProvider);
}
}

@Override
public void debug(Object message, Object... parameters) {
if (this.logger.isLoggable(Level.CONFIG) && message != null) {
final Logger logger = getLogger();
if (logger.isLoggable(DEBUG_LEVEL) && message != null) {
final String loggeableMessage = message.toString();
if (!loggeableMessage.isEmpty()) {
this.logger.log(Level.CONFIG, loggeableMessage, parameters);
logger.log(DEBUG_LEVEL, loggeableMessage, parameters);
}
}
}

@Override
public void debug(Supplier<String> messageProvider) {
if (this.logger.isLoggable(Level.CONFIG) && messageProvider != null) {
this.logger.log(Level.CONFIG, messageProvider);
final Logger logger = getLogger();
if (logger.isLoggable(DEBUG_LEVEL) && messageProvider != null) {
logger.log(DEBUG_LEVEL, messageProvider);
}
}

@Override
public boolean isErrorLogEnabled() {
return this.logger.isLoggable(Level.SEVERE);
return getLogger().isLoggable(ERROR_LEVEL);
}

@Override
public boolean isWarningLogEnabled() {
return this.logger.isLoggable(Level.WARNING);
return getLogger().isLoggable(WARNING_LEVEL);
}

@Override
public boolean isInfoLogEnabled() {
return this.logger.isLoggable(Level.INFO);
return getLogger().isLoggable(INFO_LEVEL);
}

@Override
public boolean isDebugLogEnabled() {
return this.logger.isLoggable(Level.CONFIG);
return getLogger().isLoggable(DEBUG_LEVEL);
}

@Override
public int getLogLevel() {
return LoggerCreator.toInt(this.logger.getLevel());
return LoggerCreator.toInt(getLogger().getLevel());
}

@Override
public void setLogLevel(int level) {
this.logger.setLevel(LoggerCreator.fromInt(level));
final Level lvl = LoggerCreator.fromInt(level);
getLogger().setLevel(lvl);
}

}
Expand Up @@ -23,6 +23,7 @@

import java.net.InetSocketAddress;
import java.net.URI;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
Expand Down Expand Up @@ -170,7 +171,7 @@ public void removeKernelDiscoveryServiceListener(KernelDiscoveryServiceListener
* @param uri URI of the discovered kernel.
*/
protected void fireKernelDiscovered(URI uri) {
this.logger.info(Messages.HazelcastKernelDiscoveryService_0, uri, getCurrentKernel());
this.logger.getKernelLogger().info(MessageFormat.format(Messages.HazelcastKernelDiscoveryService_0, uri, getCurrentKernel()));
for (final KernelDiscoveryServiceListener listener : this.listeners.getListeners(KernelDiscoveryServiceListener.class)) {
listener.kernelDiscovered(uri);
}
Expand All @@ -182,7 +183,7 @@ protected void fireKernelDiscovered(URI uri) {
* @param uri URI of the disconnected kernel.
*/
protected void fireKernelDisconnected(URI uri) {
this.logger.info(Messages.HazelcastKernelDiscoveryService_1, uri, getCurrentKernel());
this.logger.getKernelLogger().info(MessageFormat.format(Messages.HazelcastKernelDiscoveryService_1, uri, getCurrentKernel()));
for (final KernelDiscoveryServiceListener listener : this.listeners.getListeners(KernelDiscoveryServiceListener.class)) {
listener.kernelDisconnected(uri);
}
Expand Down
Expand Up @@ -21,6 +21,7 @@

package io.janusproject.kernel.services.jdk.contextspace;

import java.text.MessageFormat;
import java.util.UUID;

import com.google.inject.Injector;
Expand Down Expand Up @@ -199,7 +200,7 @@ private static class SpaceListener implements SpaceRepositoryListener {

@Override
public void spaceCreated(Space space, boolean isLocalCreation) {
this.logger.info(Messages.Context_0, space.getSpaceID());
this.logger.getKernelLogger().info(MessageFormat.format(Messages.Context_0, space.getSpaceID()));
// Notify the relays (other services)
this.relay.spaceCreated(space, isLocalCreation);
// Send the event in the default space of the context.
Expand All @@ -217,7 +218,7 @@ public void spaceCreated(Space space, boolean isLocalCreation) {

@Override
public void spaceDestroyed(Space space, boolean isLocalDestruction) {
this.logger.info(Messages.Context_1, space.getSpaceID());
this.logger.getKernelLogger().info(MessageFormat.format(Messages.Context_1, space.getSpaceID()));
// Send the event in the default space of the context.
if (isLocalDestruction) {
final EventSpace defSpace = this.context.getDefaultSpace();
Expand Down
Expand Up @@ -21,6 +21,7 @@

package io.janusproject.kernel.services.jdk.contextspace;

import java.text.MessageFormat;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
Expand Down Expand Up @@ -307,7 +308,7 @@ public void removeContextRepositoryListener(ContextRepositoryListener listener)
*/
protected void fireContextCreated(AgentContext context) {
final ContextRepositoryListener[] ilisteners = this.listeners.getListeners(ContextRepositoryListener.class);
this.logger.info(Messages.StandardContextSpaceService_0, context.getID());
this.logger.getKernelLogger().info(MessageFormat.format(Messages.StandardContextSpaceService_0, context.getID()));
for (final ContextRepositoryListener listener : ilisteners) {
listener.contextCreated(context);
}
Expand All @@ -320,7 +321,7 @@ protected void fireContextCreated(AgentContext context) {
*/
protected void fireContextDestroyed(AgentContext context) {
final ContextRepositoryListener[] ilisteners = this.listeners.getListeners(ContextRepositoryListener.class);
this.logger.info(Messages.StandardContextSpaceService_1, context.getID());
this.logger.getKernelLogger().info(MessageFormat.format(Messages.StandardContextSpaceService_1, context.getID()));
for (final ContextRepositoryListener listener : ilisteners) {
listener.contextDestroyed(context);
}
Expand Down

0 comments on commit cda3728

Please sign in to comment.