api 1.7 和 slf4j-simple 作为实现。我只是找不到如何使用这种组合配置日志记录级别。
任何人都可以帮忙吗?
它要么通过系统属性
-Dorg.slf4j.simpleLogger.defaultLogLevel=debug
或simplelogger.properties
类路径上的文件
详见http://www.slf4j.org/api/org/slf4j/impl/SimpleLogger.html _
这是您可以放置在类路径中的示例simplelogger.properties
(取消注释您希望使用的属性):
# SLF4J's SimpleLogger configuration file
# Simple implementation of Logger that sends all enabled log messages, for all defined loggers, to System.err.
# Default logging detail level for all instances of SimpleLogger.
# Must be one of ("trace", "debug", "info", "warn", or "error").
# If not specified, defaults to "info".
#org.slf4j.simpleLogger.defaultLogLevel=info
# Logging detail level for a SimpleLogger instance named "xxxxx".
# Must be one of ("trace", "debug", "info", "warn", or "error").
# If not specified, the default logging detail level is used.
#org.slf4j.simpleLogger.log.xxxxx=
# Set to true if you want the current date and time to be included in output messages.
# Default is false, and will output the number of milliseconds elapsed since startup.
#org.slf4j.simpleLogger.showDateTime=false
# The date and time format to be used in the output messages.
# The pattern describing the date and time format is the same that is used in java.text.SimpleDateFormat.
# If the format is not specified or is invalid, the default format is used.
# The default format is yyyy-MM-dd HH:mm:ss:SSS Z.
#org.slf4j.simpleLogger.dateTimeFormat=yyyy-MM-dd HH:mm:ss:SSS Z
# Set to true if you want to output the current thread name.
# Defaults to true.
#org.slf4j.simpleLogger.showThreadName=true
# Set to true if you want the Logger instance name to be included in output messages.
# Defaults to true.
#org.slf4j.simpleLogger.showLogName=true
# Set to true if you want the last component of the name to be included in output messages.
# Defaults to false.
#org.slf4j.simpleLogger.showShortLogName=false
在 Maven 或 Gradle 项目中,“类路径”上的一个方便位置是src/main/resources/simplelogger.properties
.
您可以通过设置系统属性以编程方式更改它:
public class App {
public static void main(String[] args) {
// for the code below to work, it must be executed before the
// logger is created. see note below
System.setProperty(org.slf4j.impl.SimpleLogger.DEFAULT_LOG_LEVEL_KEY, "TRACE");
org.slf4j.Logger log = LoggerFactory.getLogger(App.class);
log.trace("trace");
log.debug("debug");
log.info("info");
log.warn("warning");
log.error("error");
}
}
日志级别是ERROR
> WARN
> INFO
> DEBUG
> TRACE
。
请注意,一旦创建了记录器,就无法更改日志级别。如果您需要动态更改日志记录级别,您可能希望将log4j与 SLF4J 一起使用。
我注意到 Eemuli 说您不能在创建日志级别后更改它们 - 虽然这可能是设计,但这并不完全正确。
我遇到了一种情况,我正在使用一个登录到 slf4j 的库 - 我在编写 maven mojo 插件时正在使用该库。
Maven 使用 slf4j SimpleLogger 的(黑客)版本,我无法让我的插件代码将其日志重新路由到我可以控制的 log4j 之类的东西。
而且我无法更改 Maven 日志记录配置。
因此,为了消除一些嘈杂的信息消息,我发现我可以像这样使用反射,在运行时使用 SimpleLogger。
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.spi.LocationAwareLogger;
try
{
Logger l = LoggerFactory.getLogger("full.classname.of.noisy.logger"); //This is actually a MavenSimpleLogger, but due to various classloader issues, can't work with the directly.
Field f = l.getClass().getSuperclass().getDeclaredField("currentLogLevel");
f.setAccessible(true);
f.set(l, LocationAwareLogger.WARN_INT);
}
catch (Exception e)
{
getLog().warn("Failed to reset the log level of " + loggerName + ", it will continue being noisy.", e);
}
当然,请注意,这不是一个非常稳定/可靠的解决方案......因为它会在下次 Maven 人员更改他们的记录器时中断。