blob: d2635283625cd5fb701c8c782d70e7f3d4a6dacb [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.solr.logging.jul;
import com.google.common.base.Throwables;
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;
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;
@SuppressForbidden(reason = "class is specific to java.util.logging")
public class JulWatcher extends LogWatcher<LogRecord> {
final String name;
RecordHandler handler = null;
public JulWatcher(String name) {
this.name = name;
}
@Override
public String getName() {
return "JUL ("+name+")";
}
@Override
public List<String> 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<LoggerInfo> getAllLoggers() {
LogManager manager = LogManager.getLogManager();
Logger root = manager.getLogger("");
Map<String,LoggerInfo> map = new HashMap<>();
Enumeration<String> 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 long getTimestamp(LogRecord event) {
return event.getMillis();
}
@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) {
doc.setField("trace", Throwables.getStackTraceAsString(t));
}
return doc;
}
}