environmentlogger.java
来自「RESIN 3.2 最新源码」· Java 代码 · 共 685 行 · 第 1/2 页
JAVA
685 行
/* * Copyright (c) 1998-2008 Caucho Technology -- all rights reserved * * This file is part of Resin(R) Open Source * * Each copy or derived work must preserve the copyright notice and this * notice unmodified. * * Resin Open Source is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Resin Open Source is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty * of NON-INFRINGEMENT. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License * along with Resin Open Source; if not, write to the * * Free Software Foundation, Inc. * 59 Temple Place, Suite 330 * Boston, MA 02111-1307 USA * * @author Scott Ferguson */package com.caucho.log;import com.caucho.loader.ClassLoaderListener;import com.caucho.loader.DynamicClassLoader;import com.caucho.loader.Environment;import com.caucho.loader.EnvironmentClassLoader;import com.caucho.loader.EnvironmentLocal;import java.lang.ref.WeakReference;import java.util.ArrayList;import java.util.logging.Handler;import java.util.logging.Level;import java.util.logging.LogRecord;import java.util.logging.Logger;/** * Proxy logger that understands the environment. */class EnvironmentLogger extends Logger implements ClassLoaderListener { // The custom local handlers private final EnvironmentLocal<Logger> _localLoggers = new EnvironmentLocal<Logger>(); // The environment handlers for the Logger private final EnvironmentLocal<Handler[]> _localHandlers = new EnvironmentLocal<Handler[]>(); // The environment handlers owned by the Logger private final EnvironmentLocal<HandlerEntry> _ownHandlers = new EnvironmentLocal<HandlerEntry>(); // The use-parent-handlers value private final EnvironmentLocal<Boolean> _useParentHandlers = new EnvironmentLocal<Boolean>(); private boolean _hasLocalLevel; // Application level override private final EnvironmentLocal<Level> _localLevel = new EnvironmentLocal<Level>(); private EnvironmentLogger _parent; // The finest assigned level accessible from this logger private Level _assignedLevel = Level.INFO; // The finest handler level accessible from this logger private Level _handlerLevel = Level.OFF; // Can be a weak reference because any configuration in an // environment will be held in the EnvironmentLocal. private final ArrayList<WeakReference<EnvironmentLogger>> _children = new ArrayList<WeakReference<EnvironmentLogger>>(); // Weak list of all the class loaders private final ArrayList<WeakReference<ClassLoader>> _loaders = new ArrayList<WeakReference<ClassLoader>>(); public EnvironmentLogger(String name, String resourceBundleName) { super(name, resourceBundleName); } /** * Sets the logger's parent. This should only be called by the LogManager * code. */ public void setParent(Logger parent) { if (parent.equals(_parent)) return; super.setParent(parent); if (parent instanceof EnvironmentLogger) { _parent = (EnvironmentLogger) parent; _assignedLevel = _parent.getAssignedLevel(); _handlerLevel = _parent.getHandlerLevel(); setEffectiveLevel(); _parent.addChild(this); } } private Level getHandlerLevel() { return _handlerLevel; } /** * Adds a new logger as a child, triggered by a setParent. */ void addChild(EnvironmentLogger child) { _children.add(new WeakReference<EnvironmentLogger>(child)); } /** * Adds a handler. */ public synchronized void addHandler(Handler handler) { ClassLoader loader = Thread.currentThread().getContextClassLoader(); boolean hasLoader = false; for (int i = _loaders.size() - 1; i >= 0; i--) { WeakReference<ClassLoader> ref = _loaders.get(i); ClassLoader refLoader = ref.get(); if (refLoader == null) _loaders.remove(i); if (refLoader == loader) hasLoader = true; if (isParentLoader(loader, refLoader)) addHandler(handler, refLoader); } if (! hasLoader) { _loaders.add(new WeakReference<ClassLoader>(loader)); addHandler(handler, loader); Environment.addClassLoaderListener(this, loader); } HandlerEntry ownHandlers = _ownHandlers.get(); if (ownHandlers == null) { ownHandlers = new HandlerEntry(this); _ownHandlers.set(ownHandlers); } ownHandlers.addHandler(handler); } /** * Adds a new handler with a given classloader context. */ private void addHandler(Handler handler, ClassLoader loader) { // handlers ordered by level ArrayList<Handler> handlers = new ArrayList<Handler>(); handlers.add(handler); for (ClassLoader ptr = loader; ptr != null; ptr = ptr.getParent()) { Handler []localHandlers = _localHandlers.getLevel(ptr); if (localHandlers != null) { for (int i = 0; i < localHandlers.length; i++) { int p = handlers.indexOf(localHandlers[i]); if (p < 0) { handlers.add(localHandlers[i]); } else { Handler oldHandler = handlers.get(p); if (localHandlers[i].getLevel().intValue() < oldHandler.getLevel().intValue()) { handlers.set(p, localHandlers[i]); } } } } } Handler []newHandlers = new Handler[handlers.size()]; handlers.toArray(newHandlers); _localHandlers.set(newHandlers); setHandlerLevel(handler.getLevel()); } /** * Removes a handler. */ public synchronized void removeHandler(Handler handler) { ClassLoader loader = Thread.currentThread().getContextClassLoader(); boolean hasLoader = false; for (int i = _loaders.size() - 1; i >= 0; i--) { WeakReference<ClassLoader> ref = _loaders.get(i); ClassLoader refLoader = ref.get(); if (refLoader == null) _loaders.remove(i); if (isParentLoader(loader, refLoader)) removeHandler(handler, refLoader); } HandlerEntry ownHandlers = _ownHandlers.get(); if (ownHandlers != null) ownHandlers.removeHandler(handler); } private void removeHandler(Handler handler, ClassLoader loader) { ArrayList<Handler> handlers = new ArrayList<Handler>(); for (ClassLoader ptr = loader; ptr != null; ptr = ptr.getParent()) { Handler []localHandlers = _localHandlers.getLevel(ptr); if (localHandlers != null) { for (int i = 0; i < localHandlers.length; i++) { if (! localHandlers[i].equals(handler)) { int p = handlers.indexOf(localHandlers[i]); if (p < 0) { handlers.add(localHandlers[i]); } else { Handler oldHandler = handlers.get(p); if (localHandlers[i].getLevel().intValue() < oldHandler.getLevel().intValue()) { handlers.set(p, localHandlers[i]); } } } } } } Handler []newHandlers = new Handler[handlers.size()]; handlers.toArray(newHandlers); _localHandlers.set(newHandlers); setHandlerLevel(handler.getLevel()); } /** * Returns true if 'parent' is a parent classloader of 'child'. * * @param parent the classloader to test as a parent. * @param child the classloader to test as a child. */ private boolean isParentLoader(ClassLoader parent, ClassLoader child) { for (; child != null; child = child.getParent()) { if (child == parent) return true; } return false; } /** * Sets a custom logger if possible */ boolean addLogger(Logger logger) { if (logger.getClass().getName().startsWith("java")) return false; Logger oldLogger = _localLoggers.get(); if (oldLogger != null) return false; _localLoggers.set(logger); //logger.setParent(_parent); return true; } /** * Gets the custom logger if possible */ Logger getLogger() { return _localLoggers.get(); } /** * Logs the message. */ public void log(LogRecord record) { if (record == null) return; if (_hasLocalLevel) { Level level = _localLevel.get(); if (level != null && record.getLevel().intValue() < level.intValue()) return; } for (Logger ptr = this; ptr != null; ptr = ptr.getParent()) { Handler handlers[] = ptr.getHandlers(); if (handlers != null) { for (int i = 0; i < handlers.length; i++) { handlers[i].publish(record); } } if (! ptr.getUseParentHandlers()) break; } } /** * Returns the handlers. */ public Handler []getHandlers() { return _localHandlers.get();
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?