blob: c082126dbd4fac4779b80a564f4a7237d38b1875 [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.ignite.internal.logger.platform;
import org.apache.ignite.IgniteLogger;
import org.apache.ignite.internal.binary.BinaryRawWriterEx;
import org.apache.ignite.internal.processors.platform.PlatformContext;
import org.apache.ignite.internal.processors.platform.PlatformNativeException;
import org.apache.ignite.internal.processors.platform.callback.PlatformCallbackGateway;
import org.apache.ignite.internal.processors.platform.memory.PlatformMemory;
import org.apache.ignite.internal.processors.platform.memory.PlatformOutputStream;
import org.apache.ignite.internal.util.tostring.GridToStringExclude;
import org.apache.ignite.internal.util.tostring.GridToStringInclude;
import org.apache.ignite.internal.util.typedef.X;
import org.apache.ignite.internal.util.typedef.internal.S;
import org.jetbrains.annotations.Nullable;
import static org.apache.ignite.IgniteSystemProperties.IGNITE_QUIET;
/**
* Logger that delegates to platform.
*/
public class PlatformLogger implements IgniteLogger {
/** */
public static final int LVL_TRACE = 0;
/** */
public static final int LVL_DEBUG = 1;
/** */
public static final int LVL_INFO = 2;
/** */
public static final int LVL_WARN = 3;
/** */
public static final int LVL_ERROR = 4;
/** Callbacks. */
@GridToStringExclude
private volatile PlatformCallbackGateway gate;
/** Context. */
@GridToStringExclude
private volatile PlatformContext ctx;
/** Category. */
@GridToStringExclude
private final String category;
/** Trace flag. */
@GridToStringInclude
private volatile boolean traceEnabled;
/** Debug flag. */
@GridToStringInclude
private volatile boolean debugEnabled;
/** Info flag. */
@GridToStringInclude
private volatile boolean infoEnabled;
/** Quiet flag. */
@GridToStringInclude
private static final boolean isQuiet = Boolean.valueOf(System.getProperty(IGNITE_QUIET, "true"));
/**
* Ctor.
*
*/
public PlatformLogger() {
category = null;
}
/**
* Ctor.
*/
private PlatformLogger(PlatformCallbackGateway gate, PlatformContext ctx, String category,
boolean traceEnabled, boolean debugEnabled, boolean infoEnabled) {
this.gate = gate;
this.ctx = ctx;
this.category = category;
this.traceEnabled = traceEnabled;
this.debugEnabled = debugEnabled;
this.infoEnabled = infoEnabled;
}
/** {@inheritDoc} */
@Override public IgniteLogger getLogger(Object ctgr) {
return new PlatformLogger(gate, ctx, getCategoryString(ctgr), traceEnabled, debugEnabled, infoEnabled);
}
/** {@inheritDoc} */
@Override public void trace(String msg) {
log(LVL_TRACE, msg, null);
}
/** {@inheritDoc} */
@Override public void debug(String msg) {
log(LVL_DEBUG, msg, null);
}
/** {@inheritDoc} */
@Override public void info(String msg) {
log(LVL_INFO, msg, null);
}
/** {@inheritDoc} */
@Override public void warning(String msg) {
log(LVL_WARN, msg, null);
}
/** {@inheritDoc} */
@Override public void warning(String msg, @Nullable Throwable e) {
log(LVL_WARN, msg, e);
}
/** {@inheritDoc} */
@Override public void error(String msg) {
log(LVL_ERROR, msg, null);
}
/** {@inheritDoc} */
@Override public void error(String msg, @Nullable Throwable e) {
log(LVL_ERROR, msg, e);
}
/** {@inheritDoc} */
@Override public boolean isTraceEnabled() {
return traceEnabled;
}
/** {@inheritDoc} */
@Override public boolean isDebugEnabled() {
return debugEnabled;
}
/** {@inheritDoc} */
@Override public boolean isInfoEnabled() {
return infoEnabled;
}
/** {@inheritDoc} */
@Override public boolean isQuiet() {
return isQuiet;
}
/** {@inheritDoc} */
@Override public String fileName() {
return null;
}
/**
* Sets the gateway.
*
* @param gate Callback gateway.
*/
public void setGateway(PlatformCallbackGateway gate) {
assert gate != null;
this.gate = gate;
// Pre-calculate enabled levels (JNI calls are expensive)
traceEnabled = gate.loggerIsLevelEnabled(LVL_TRACE);
debugEnabled = gate.loggerIsLevelEnabled(LVL_DEBUG);
infoEnabled = gate.loggerIsLevelEnabled(LVL_INFO);
}
/**
* Sets the context.
*
* @param ctx Platform context.
*/
public void setContext(PlatformContext ctx) {
assert ctx != null;
this.ctx = ctx;
}
/**
* Logs the message.
*
* @param level Log level.
* @param msg Message.
* @param e Exception.
*/
private void log(int level, String msg, @Nullable Throwable e) {
String errorInfo = null;
if (e != null)
errorInfo = X.getFullStackTrace(e);
PlatformNativeException e0 = X.cause(e, PlatformNativeException.class);
if (ctx != null && e0 != null) {
try (PlatformMemory mem = ctx.memory().allocate()) {
PlatformOutputStream out = mem.output();
BinaryRawWriterEx writer = ctx.writer(out);
writer.writeObject(e0.cause());
out.synchronize();
gate.loggerLog(level, msg, category, errorInfo, mem.pointer());
}
}
else {
gate.loggerLog(level, msg, category, errorInfo, 0);
}
}
/**
* Gets the category string.
*
* @param ctgr Category object.
* @return Category string.
*/
private static String getCategoryString(Object ctgr) {
return ctgr instanceof Class
? ((Class)ctgr).getName()
: (ctgr == null ? null : String.valueOf(ctgr));
}
/** {@inheritDoc} */
@Override public String toString() {
return S.toString(PlatformLogger.class, this);
}
}