/* * 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; } }