blob: ee7bc59ca9dfba6e819ec765b30d7e000f262bdd [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.logger.java;
import java.io.File;
import java.io.IOException;
import java.util.UUID;
import java.util.logging.FileHandler;
import java.util.logging.LogManager;
import java.util.logging.LogRecord;
import java.util.logging.StreamHandler;
import org.apache.ignite.IgniteCheckedException;
import org.apache.ignite.internal.util.typedef.F;
import org.apache.ignite.internal.util.typedef.internal.S;
import org.apache.ignite.internal.util.typedef.internal.U;
import org.jetbrains.annotations.Nullable;
/**
* File logging handler which skips all the messages until node ID is set.
*/
public final class JavaLoggerFileHandler extends StreamHandler {
/** Log manager. */
private static final LogManager manager = LogManager.getLogManager();
/** Handler delegate. */
private volatile FileHandler delegate;
/** {@inheritDoc} */
@SuppressWarnings("NonSynchronizedMethodOverridesSynchronizedMethod")
@Override public void publish(LogRecord record) {
FileHandler delegate0 = delegate;
if (delegate0 != null)
delegate0.publish(record);
}
/** {@inheritDoc} */
@SuppressWarnings("NonSynchronizedMethodOverridesSynchronizedMethod")
@Override public void flush() {
FileHandler delegate0 = delegate;
if (delegate0 != null)
delegate0.flush();
}
/** {@inheritDoc} */
@SuppressWarnings("NonSynchronizedMethodOverridesSynchronizedMethod")
@Override public void close() throws SecurityException {
FileHandler delegate0 = delegate;
if (delegate0 != null)
delegate0.close();
}
/** {@inheritDoc} */
@Override public boolean isLoggable(LogRecord record) {
FileHandler delegate0 = delegate;
return delegate0 != null && delegate0.isLoggable(record);
}
/**
* Sets Node id and instantiates {@link FileHandler} delegate.
*
* @param nodeId Node id.
* @param workDir param.
*/
public void nodeId(UUID nodeId, String workDir) throws IgniteCheckedException, IOException {
nodeId(null, nodeId, workDir);
}
/**
* Sets Node id and instantiates {@link FileHandler} delegate.
*
* @param app Application name.
* @param workDir Path to the work directory.
* @param nodeId Node id.
*/
public void nodeId(@Nullable String app, UUID nodeId, String workDir) throws IgniteCheckedException, IOException {
if (delegate != null)
return;
String clsName = getClass().getName();
String ptrn = manager.getProperty(clsName + ".pattern");
if (ptrn == null)
ptrn = "%{app}-%{id8}.%g.log";
String fileName = ptrn
.replace("%{app}", app != null ? app : "ignite")
.replace("%{id8}", U.id8(nodeId));
ptrn = new File(logDirectory(workDir), fileName).getAbsolutePath();
int limit = getIntProperty(clsName + ".limit", 0);
if (limit < 0)
limit = 0;
int cnt = getIntProperty(clsName + ".count", 1);
if (cnt <= 0)
cnt = 1;
boolean append = getBooleanProperty(clsName + ".append", false);
FileHandler delegate0;
synchronized (this) {
if (delegate != null)
return;
delegate = delegate0 = new FileHandler(ptrn, limit, cnt, append);
}
delegate0.setLevel(getLevel());
delegate0.setFormatter(getFormatter());
delegate0.setEncoding(getEncoding());
delegate0.setFilter(getFilter());
delegate0.setErrorManager(getErrorManager());
}
/**
* Returns current log file.
*
* @return Pattern or {@code null} if node id has not been set yet.
*/
@Nullable public String fileName() {
return JavaLogger.fileName(delegate);
}
/**
* Resolves logging directory.
*
* @param workDir Work directory.
* @return Logging directory.
*/
public static File logDirectory(String workDir) throws IgniteCheckedException {
return !F.isEmpty(U.IGNITE_LOG_DIR) ? new File(U.IGNITE_LOG_DIR) :
U.resolveWorkDirectory(workDir, "log", false);
}
/**
* Returns integer property from logging configuration.
*
* @param name Property name.
* @param dfltVal Default value.
* @return Parsed property value if it is set and valid or default value otherwise.
*/
private int getIntProperty(String name, int dfltVal) {
String val = manager.getProperty(name);
if (val == null)
return dfltVal;
try {
return Integer.parseInt(val.trim());
}
catch (Exception ex) {
ex.printStackTrace();
return dfltVal;
}
}
/**
* Returns boolean property from logging configuration.
*
* @param name Property name.
* @param dfltVal Default value.
* @return Parsed property value if it is set and valid or default value otherwise.
*/
@SuppressWarnings("SimplifiableIfStatement")
private boolean getBooleanProperty(String name, boolean dfltVal) {
String val = manager.getProperty(name);
if (val == null)
return dfltVal;
val = val.toLowerCase();
if ("true".equals(val) || "1".equals(val))
return true;
if ("false".equals(val) || "0".equals(val))
return false;
return dfltVal;
}
/** {@inheritDoc} */
@Override public String toString() {
return S.toString(JavaLoggerFileHandler.class, this);
}
}