如何配置slf4j-simple


Answers:


218

通过系统属性

-Dorg.slf4j.simpleLogger.defaultLogLevel=debug

simplelogger.properties文件放在类路径中

有关详细信息,请参见http://www.slf4j.org/api/org/slf4j/impl/SimpleLogger.html


谢谢我在System.properties中将“ org.slf4j.simpleLogger.defaultLogLevel”设置为“ error”,但是slf4j仍然记录INFO级别的消息。任何想法?顺便说一句,我应该在哪里放置simplelogger.properties?
罗敏麟2013年

2
尝试使用org.slf4j.simplelogger.defaultlog代替org.slf4j.simpleLogger.defaultLogLevel。文件必须位于类路径的默认包中
Evgeniy Dorofeev

2
其实它(defaultLogLevel)起作用。只是发现我在错误的文件夹中修改了该程序;-)并且defaultlog不起作用。因此,尽管我已经接受了它,但您可能仍想编辑答案
Gelin Luo 2013年

11
请注意:实际上,两个答案都是好的,这取决于您使用的SimpleLogger的版本。例如,defaultLogLevel适用于1.7.5,而defaultlog适用于1.6.6。我在配置项目日志记录时发现了这一点,并看到了这篇文章
Ken Shih 2013年

112

这是一个示例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

1
@RobertHunt如何将该日志保存到文件中?
Devavrata

6
@Devavrata添加属性org.slf4j.simpleLogger.logFile-输出目标,可以是文件的路径,也可以是特殊值“ System.out”和“ System.err”。默认值为“ System.err”。参见slf4j.org/api/org/slf4j/impl/SimpleLogger.html
罗伯特·亨特

是否可以有多个值?如果是,怎么办?就像我想要org.slf4j.simpleLogger.logFile = test.log,System.err吗?
LOLWTFasdasd asdad

1
@LOLWTFasdasdasdad不幸的是,它仅支持单个目标,即System.out,System.err或文件路径。它设计得很简单,如果您想要更多高级功能,则应考虑使用Log4J或Logback之类的完整日志记录实现。
罗伯特·亨特

74

您可以通过设置system属性以编程方式更改它:

public class App {

    public static void main(String[] args) {

        System.setProperty(org.slf4j.impl.SimpleLogger.DEFAULT_LOG_LEVEL_KEY, "TRACE");

        final org.slf4j.Logger log = LoggerFactory.getLogger(App.class);

        log.trace("trace");
        log.debug("debug");
        log.info("info");
        log.warn("warning");
        log.error("error");

    }
}

日志级别为错误>警告>信息>调试>跟踪。

请注意,一旦创建了记录器,就无法更改日志级别。如果需要动态更改日志记录级别,则可能需要将log4j与SLF4J 一起使用。


3
“请注意,一旦创建了记录器,就无法更改日志级别。” -实际在哪里指定?
ksl 2015年

2
ksl,在org.slf4j.impl.SimpleLogger中。创建第一个记录器时,将运行init()方法,并从系统属性中获取默认的记录级别。这一点在任何时候都不会刷新。同样,org.slf4j.impl.SimpleLoggerFactory仅为一个类创建一个记录器,因此,对于给定的类(或名称)总是返回相同的记录器。但是,可能会有不同级别的记录器。因此,可能的解决方法是,当您想更改日志记录级别时,将这些不同级别的日志记录器分配给“ log”变量。这不是一个很好的解决方案,但应该可以。
eemelipa

@Eemuli org.slf4j.impl.SimpleLogger您的意思是实际的源代码而不是doc?
ksl

LOG_FILE_KEY创建记录器后也不能更改该属性吗?
ksl

1
是的,我的意思是实际的源代码。我不确定LOG_FILE_KEY。
eemelipa '16

4

我注意到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员工更换记录仪时,它会中断。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.