org.apache.solr.logging.jul.JulWatcher Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of solr-core Show documentation
Show all versions of solr-core Show documentation
Apache Solr (module: core)
/*
* 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.solr.logging.jul;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Arrays;
import java.util.Collection;
import java.util.Date;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.LogManager;
import java.util.logging.LogRecord;
import java.util.logging.Logger;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.util.SuppressForbidden;
import org.apache.solr.logging.CircularList;
import org.apache.solr.logging.ListenerConfig;
import org.apache.solr.logging.LogWatcher;
import org.apache.solr.logging.LoggerInfo;
@SuppressForbidden(reason = "class is specific to java.util.logging")
public class JulWatcher extends LogWatcher {
final String name;
RecordHandler handler = null;
public JulWatcher(String name) {
this.name = name;
}
@Override
public String getName() {
return "JUL (" + name + ")";
}
@Override
public List getAllLevels() {
return Arrays.asList(
Level.FINEST.getName(),
Level.FINER.getName(),
Level.FINE.getName(),
Level.CONFIG.getName(),
Level.INFO.getName(),
Level.WARNING.getName(),
Level.SEVERE.getName(),
Level.OFF.getName());
}
@Override
public void setLogLevel(String category, String level) {
if (LoggerInfo.ROOT_NAME.equals(category)) {
category = "";
}
Logger log = LogManager.getLogManager().getLogger(category);
if (level == null || "unset".equals(level) || "null".equals(level)) {
if (log != null) {
log.setLevel(null);
}
} else {
if (log == null) {
log = Logger.getLogger(category); // create it
}
log.setLevel(Level.parse(level));
}
}
@Override
public Collection getAllLoggers() {
LogManager manager = LogManager.getLogManager();
Logger root = manager.getLogger("");
Map map = new HashMap<>();
Enumeration names = manager.getLoggerNames();
while (names.hasMoreElements()) {
String name = names.nextElement();
Logger logger = Logger.getLogger(name);
if (logger == root) {
continue;
}
map.put(name, new JulInfo(name, logger));
while (true) {
int dot = name.lastIndexOf('.');
if (dot < 0) break;
name = name.substring(0, dot);
if (!map.containsKey(name)) {
map.put(name, new JulInfo(name, null));
}
}
}
map.put(LoggerInfo.ROOT_NAME, new JulInfo(LoggerInfo.ROOT_NAME, root));
return map.values();
}
@Override
public void setThreshold(String level) {
if (handler == null) {
throw new IllegalStateException("Must have an handler");
}
handler.setLevel(Level.parse(level));
}
@Override
public String getThreshold() {
if (handler == null) {
throw new IllegalStateException("Must have an handler");
}
return handler.getLevel().toString();
}
@Override
public void registerListener(ListenerConfig cfg) {
if (history != null) {
throw new IllegalStateException("History already registered");
}
history = new CircularList<>(cfg.size);
handler = new RecordHandler(this);
if (cfg.threshold != null) {
handler.setLevel(Level.parse(cfg.threshold));
} else {
handler.setLevel(Level.WARNING);
}
Logger log = LogManager.getLogManager().getLogger("");
log.addHandler(handler);
}
@Override
public SolrDocument toSolrDocument(LogRecord event) {
SolrDocument doc = new SolrDocument();
doc.setField("time", new Date(event.getMillis()));
doc.setField("level", event.getLevel().toString());
doc.setField("logger", event.getLoggerName());
doc.setField("message", event.getMessage().toString());
Throwable t = event.getThrown();
if (t != null) {
StringWriter trace = new StringWriter();
t.printStackTrace(new PrintWriter(trace));
doc.setField("trace", trace.toString());
}
return doc;
}
}