| /*
|
| * Copyright 1999-2011 Alibaba Group.
|
| *
|
| * Licensed 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 com.alibaba.dubbo.common.logger; |
| |
| import java.io.File;
|
| import java.util.Map;
|
| import java.util.concurrent.ConcurrentHashMap;
|
| import java.util.concurrent.ConcurrentMap;
|
|
|
| import com.alibaba.dubbo.common.extension.ExtensionLoader;
|
| import com.alibaba.dubbo.common.logger.jcl.JclLoggerAdapter;
|
| import com.alibaba.dubbo.common.logger.jdk.JdkLoggerAdapter;
|
| import com.alibaba.dubbo.common.logger.log4j.Log4jLoggerAdapter;
|
| import com.alibaba.dubbo.common.logger.slf4j.Slf4jLoggerAdapter;
|
| import com.alibaba.dubbo.common.logger.support.FailsafeLogger;
|
| |
| /** |
| * 日志输出器工厂 |
| * |
| * @author william.liangf |
| */ |
| public class LoggerFactory { |
| |
| private LoggerFactory() { |
| } |
| |
| private static volatile LoggerAdapter LOGGER_ADAPTER;
|
|
|
| private static final ConcurrentMap<String, FailsafeLogger> LOGGERS = new ConcurrentHashMap<String, FailsafeLogger>(); |
| |
| // 查找常用的日志框架 |
| static {
|
| String logger = System.getProperty("dubbo.application.logger");
|
| if ("slf4j".equals(logger)) {
|
| setLoggerAdapter(new Slf4jLoggerAdapter());
|
| } else if ("jcl".equals(logger)) {
|
| setLoggerAdapter(new JclLoggerAdapter());
|
| } else if ("log4j".equals(logger)) {
|
| setLoggerAdapter(new Log4jLoggerAdapter());
|
| } else if ("jdk".equals(logger)) {
|
| setLoggerAdapter(new JdkLoggerAdapter());
|
| } else {
|
| try {
|
| setLoggerAdapter(new Log4jLoggerAdapter());
|
| } catch (Throwable e1) {
|
| try {
|
| setLoggerAdapter(new Slf4jLoggerAdapter());
|
| } catch (Throwable e2) {
|
| try {
|
| setLoggerAdapter(new JclLoggerAdapter());
|
| } catch (Throwable e3) {
|
| setLoggerAdapter(new JdkLoggerAdapter());
|
| }
|
| }
|
| }
|
| } |
| }
|
|
|
| public static void setLoggerAdapter(String loggerAdapter) {
|
| if (loggerAdapter != null && loggerAdapter.length() > 0) {
|
| setLoggerAdapter(ExtensionLoader.getExtensionLoader(LoggerAdapter.class).getExtension(loggerAdapter));
|
| }
|
| } |
| |
| /** |
| * 设置日志输出器供给器 |
| * |
| * @param loggerAdapter |
| * 日志输出器供给器 |
| */ |
| public static void setLoggerAdapter(LoggerAdapter loggerAdapter) { |
| if (loggerAdapter != null) { |
| Logger logger = loggerAdapter.getLogger(LoggerFactory.class.getName()); |
| logger.info("using logger: " + loggerAdapter.getClass().getName()); |
| LoggerFactory.LOGGER_ADAPTER = loggerAdapter;
|
| for (Map.Entry<String, FailsafeLogger> entry : LOGGERS.entrySet()) {
|
| entry.getValue().setLogger(LOGGER_ADAPTER.getLogger(entry.getKey()));
|
| } |
| } |
| } |
| |
| /** |
| * 获取日志输出器 |
| * |
| * @param key |
| * 分类键 |
| * @return 日志输出器, 后验条件: 不返回null. |
| */ |
| public static Logger getLogger(Class<?> key) {
|
| FailsafeLogger logger = LOGGERS.get(key.getName());
|
| if (logger == null) {
|
| LOGGERS.putIfAbsent(key.getName(), new FailsafeLogger(LOGGER_ADAPTER.getLogger(key)));
|
| logger = LOGGERS.get(key.getName());
|
| }
|
| return logger; |
| } |
| |
| /** |
| * 获取日志输出器 |
| * |
| * @param key |
| * 分类键 |
| * @return 日志输出器, 后验条件: 不返回null. |
| */ |
| public static Logger getLogger(String key) { |
| FailsafeLogger logger = LOGGERS.get(key);
|
| if (logger == null) {
|
| LOGGERS.putIfAbsent(key, new FailsafeLogger(LOGGER_ADAPTER.getLogger(key)));
|
| logger = LOGGERS.get(key);
|
| }
|
| return logger; |
| } |
| |
| /** |
| * 动态设置输出日志级别 |
| * |
| * @param level 日志级别 |
| */ |
| public static void setLevel(Level level) { |
| LOGGER_ADAPTER.setLevel(level); |
| } |
| |
| /** |
| * 获取日志级别 |
| * |
| * @return 日志级别 |
| */ |
| public static Level getLevel() { |
| return LOGGER_ADAPTER.getLevel(); |
| } |
| |
| /** |
| * 获取日志文件 |
| * |
| * @return 日志文件 |
| */ |
| public static File getFile() { |
| return LOGGER_ADAPTER.getFile(); |
| } |
| |
| } |