1. 问题:
我们项目之前用的是logback日志框架,
后面说Log4j2性能更优越于是就换了。
所有的配置均正确,就是不打印日志。
到这里就停住了:
restartedMain WARN No Root logger was configured, creating default ERROR-level Root logger with Console appender
2. 解决方案
在启动类里面加上:
// 关闭nacos日志
System.setProperty("nacos.logging.default.config.enabled", "false");
3. 原因
可以看到nacos的日志工具类先加载logback,
如果成功直接使用,
失败就去加载log4j2
package com.alibaba.nacos.client.utils;
import com.alibaba.nacos.client.logging.AbstractNacosLogging;
import com.alibaba.nacos.client.logging.log4j2.Log4J2NacosLogging;
import com.alibaba.nacos.client.logging.logback.LogbackNacosLogging;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LogUtils {
public static final Logger NAMING_LOGGER;
public LogUtils() {
}
public static Logger logger(Class<?> clazz) {
return LoggerFactory.getLogger(clazz);
}
static {
try {
boolean isLogback = false;
Object nacosLogging;
try {
Class.forName("ch.qos.logback.classic.Logger");
nacosLogging = new LogbackNacosLogging();
isLogback = true;
} catch (ClassNotFoundException var3) {
nacosLogging = new Log4J2NacosLogging();
}
try {
((AbstractNacosLogging)nacosLogging).loadConfiguration();
} catch (Throwable var4) {
if (isLogback) {
LoggerFactory.getLogger(LogUtils.class).warn("Load Logback Configuration of Nacos fail, message: {}", var4.getMessage());
} else {
LoggerFactory.getLogger(LogUtils.class).warn("Load Log4j Configuration of Nacos fail, message: {}", var4.getMessage());
}
}
} catch (Throwable var5) {
LoggerFactory.getLogger(LogUtils.class).warn("Init Nacos Logging fail, message: {}", var5.getMessage());
}
NAMING_LOGGER = LoggerFactory.getLogger("com.alibaba.nacos.client.naming");
}
}
加载log4j2时:
可以看到是加载classpath:nacos-log4j2.xml
这个文件
package com.alibaba.nacos.client.logging.log4j2;
import com.alibaba.nacos.client.logging.AbstractNacosLogging;
import com.alibaba.nacos.client.utils.StringUtils;
import com.alibaba.nacos.common.util.ClassUtils;
import com.alibaba.nacos.common.util.ResourceUtils;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.config.AbstractConfiguration;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.ConfigurationFactory;
import org.apache.logging.log4j.core.config.ConfigurationSource;
import org.apache.logging.log4j.core.config.composite.CompositeConfiguration;
import org.apache.logging.log4j.core.lookup.Interpolator;
import org.apache.logging.log4j.core.lookup.StrSubstitutor;
import org.apache.logging.log4j.util.PropertiesUtil;
public class Log4J2NacosLogging extends AbstractNacosLogging {
private static final String NACOS_LOG4J2_LOCATION = "classpath:nacos-log4j2.xml";
private static final String FILE_PROTOCOL = "file";
private static final String YAML_PARSER_CLASS_NAME = "com.fasterxml.jackson.dataformat.yaml.YAMLParser";
private static final String JSON_PARSER_CLASS_NAME = "com.fasterxml.jackson.databind.ObjectMapper";
private final StrSubstitutor strSubstitutor = new StrSubstitutor(new Interpolator());
private Set<String> locationList = new HashSet();
public Log4J2NacosLogging() {
String location = this.getLocation("classpath:nacos-log4j2.xml");
if (!StringUtils.isBlank(location)) {
this.locationList.add(location);
}
}
public void loadConfiguration() {
if (!this.locationList.isEmpty()) {
List<String> configList = this.findConfig(this.getCurrentlySupportedConfigLocations());
if (configList != null) {
this.locationList.addAll(configList);
}
List<AbstractConfiguration> configurations = new ArrayList();
LoggerContext loggerContext = (LoggerContext)LogManager.getContext(false);
Iterator var4 = this.locationList.iterator();
while(var4.hasNext()) {
String location = (String)var4.next();
try {
Configuration configuration = this.loadConfiguration(loggerContext, location);
if (configuration instanceof AbstractConfiguration) {
configurations.add((AbstractConfiguration)configuration);
}
} catch (Exception var7) {
throw new IllegalStateException("Could not initialize Log4J2 Nacos logging from " + location, var7);
}
}
CompositeConfiguration compositeConfiguration = new CompositeConfiguration(configurations);
loggerContext.start(compositeConfiguration);
}
}
private Configuration loadConfiguration(LoggerContext loggerContext, String location) {
try {
URL url = ResourceUtils.getResourceURL(location);
ConfigurationSource source = this.getConfigurationSource(url);
return ConfigurationFactory.getInstance().getConfiguration(loggerContext, source);
} catch (Exception var5) {
throw new IllegalStateException("Could not initialize Log4J2 logging from " + location, var5);
}
}
private ConfigurationSource getConfigurationSource(URL url) throws IOException {
InputStream stream = url.openStream();
return "file".equals(url.getProtocol()) ? new ConfigurationSource(stream, ResourceUtils.getResourceAsFile(url)) : new ConfigurationSource(stream, url);
}
private String[] getCurrentlySupportedConfigLocations() {
List<String> supportedConfigLocations = new ArrayList();
if (ClassUtils.isPresent("com.fasterxml.jackson.dataformat.yaml.YAMLParser")) {
Collections.addAll(supportedConfigLocations, new String[]{"log4j2.yaml", "log4j2.yml", "log4j2-test.yaml", "log4j2-test.yml"});
}
if (ClassUtils.isPresent("com.fasterxml.jackson.databind.ObjectMapper")) {
Collections.addAll(supportedConfigLocations, new String[]{"log4j2.json", "log4j2.jsn", "log4j2-test.json", "log4j2-test.jsn"});
}
supportedConfigLocations.add("log4j2.xml");
supportedConfigLocations.add("log4j2-test.xml");
return (String[])supportedConfigLocations.toArray(new String[supportedConfigLocations.size()]);
}
private List<String> findConfig(String[] locations) {
String configLocationStr = this.strSubstitutor.replace(PropertiesUtil.getProperties().getStringProperty("log4j.configurationFile"));
if (configLocationStr != null) {
return Arrays.asList(configLocationStr.split(","));
} else {
String[] var3 = locations;
int var4 = locations.length;
for(int var5 = 0; var5 < var4; ++var5) {
String location = var3[var5];
ClassLoader defaultClassLoader = ClassUtils.getDefaultClassLoader();
if (defaultClassLoader != null && defaultClassLoader.getResource(location) != null) {
List<String> list = new ArrayList();
list.add("classpath:" + location);
return list;
}
}
return null;
}
}
}
于是我就产生了一个不好的想法:
将配置文件修改名称,然后放到resources下面
事就这样成了!
不过没有配置info打印,
疯狂在打印,
如果不想打印需要配置为warn级别
PS:
如果配置的是logback,
启动之后疯狂打印info日志
需要如下配置:
# nacos疯狂打印
logging:
level:
com:
alibaba:
nacos:
client:
naming: warn