org.slf4j 怎么读取log4j的配置文件

package com.slf4j.test;

slf4j配置 slf4j配置日志显示级别slf4j配置 slf4j配置日志显示级别


slf4j配置 slf4j配置日志显示级别


import org.slf4j.;

/

@author Tsingxu

/

public class test {

public static final Logger logger = LoggerFactory.getLogger(test.class);

public static void main(String[] args){

System.setProperty("log4j.configuration", "log4j.properties");

test.logger.debug("test start...");

test.logger.error("test error...");

}

}

在选用 slf4j-api-1.6.4.jar + slf4j-jdk14-1.6.4.jar 时输出在控制台:

2011-11-6 21:55:18 com.slf4j.test.test main

: test error...

在选用 slf4j-api-1.6.4.jar + slf4j-log4j12-1.6.4.jar + log4j-1.2.13.jar 时输出(前提是有相应的配置文件log4j.properties)到文件logs.log和errors.log

logs.log:

2011-11-06 21:59:33 [ main:0 ] - [ DEBUG ] test start... 2011-11-06 21:59:33 [ main:0 ] - [ ERROR ] test error...

errors.log

2011-11-06 21:59:33 [ main:0 ] - [ ERROR ] test error...

其中log4j.properties简要配置如下:

log4j.debug=true

log4j.rootLogger=DEBUG,D,E

log4j.appender.E = org.apache.log4j.DailyRollingFileAppender

log4j.appender.E.File = logs/logs.log

log4j.appender.E.Append = true

log4j.appender.E.Threshold = DEBUG

log4j.appender.E.layout = org.apache.log4j.PatternLayout

log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n

#log4j.appender.E.layout.

log4j.appender.D = org.apache.log4j.DailyRollingFileAppender

log4j.appender.D.File = logs/error.log

log4j.appender.D.Append = true

log4j.appender.D.Threshold = ERROR

log4j.appender.D.layout = org.apache.log4j.PatternLayout

log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n

下面讲一下log4j.properties的配置参数

1 基本格式如下:

#配置根Logger

log4j.rootLogger = [ ll ] , appenderName1 , appenderName2 , …

#配置日志信息输出目的地Appender

log4j.appender.appenderName = fully.qualified.name.of.appender.class

log4j.appender.appenderName.option1 = value1

log4j.appender.appenderName.optionN = valueN

#配置日志信息的格式(布局)

log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class

log4j.appender.appenderName.layout.option1 = value1

log4j.appender.appenderName.layout.optionN = valueN

其中 [ ll ]日志输出级别共有五级

FATAL 0

ERROR 3

WARN 4

INFO 6

DEBUG 7

Appender 为日志输出目的地,Log4j提供的appender有以下几种:

org.apache.log4j.ConsoleAppender(控制台),

org.apache.log4j.FileAppender(文件),

org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),

org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),

org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)

Layout:日志输出格式,Log4j提供的layout有以下几种:

org.apache.log4j.HTMLLayout(以HTML表格形式布局),

org.apache.log4j.PatternLayout(可以灵活地指定布局模式),

org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),

org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

打印参数: Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,如下:

%m 输出代码中指定的消息%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL

%r 输出自应用启动到输出该log信息耗费的毫秒数

%c 输出所属的类目,通常就是所在类的全名

%t 输出产生该日志的线程名

%n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”

%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss , SSS},输出类似:2002年10月18日 22 : 10 : 28 , 921

%l 输出日志的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:test.main(test.ja: 10 )

参数意义说明

输出级别的种类

ERROR 为错误 主要是程序的错误

WARN 为一般,比如session丢失

INFO 为一般要显示的信息,比如登录登出

DEBUG 为程序的调试信息

配置日志信息输出目的地

log4j.appender.appenderName=??

(控制台)

(文件)

(每天产生一个日志文件)

(文件大小到达指定尺寸的时候产生一个新的文件)

(将日志信息以流格式发送到任意指定的地方)

配置日志信息的格式

log4j.appender.appenderName.layout = ??

(以HTML表格形式布局),

(可以灵活地指定布局模式),

(包含日志信息的级别和信息字符串),

(包含日志产生的时间、线程、类别等等信息)

ConsoleAppender选项

Threshold=DEBUG:指定日志消息的输出层次。

ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。

Target=System.err:默认情况下是:System.out,指定输出控制台

FileAppender 选项

Threshold=DEBUF:指定日志消息的输出层次。

ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。

File=mylog.txt:指定消息输出到mylog.txt文件。

Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。

RollingFileAppender 选项

Threshold=DEBUG:指定日志消息的输出层次。

ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。

File=mylog.txt:指定消息输出到mylog.txt文件。

Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。

MaxFileSize=100KB: 后缀可以是KB, MB 或者是 GB. 在日志文件到达该大小时,将会自动滚动,即将原来的内容移到mylog.log.1文件。

MaxBackupIndex=2:指定可以产生的滚动文件的数。

日志信息格式中几个符号所代表的含义:

-X号: X信息输出时左对齐;

%p: 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL,

%d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921

%r: 输出自应用启动到输出该log信息耗费的毫秒数

%c: 输出日志信息所属的类目,通常就是所在类的全名

%t: 输出产生该日志的线程名

%l: 输出日志的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main (TestLog4.ja:10)

%x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像ja servlets这样的多客户多线程的应用中。

%%: 输出一个"%"字符

%F: 输出日志消息产生时所在的文件名称

%L: 输出代码中的行号

%m: 输出代码中指定的消息,产生的日志具体信息

%n: 输出一个回车换行符,Windows平台为"rn",Unix平台为"n"输出日志信息换行

示例的配置文件 log4j.properties

log4j.debug=true

log4j.rootLogger=DEBUG,D,E

log4j.appender.E = org.apache.log4j.DailyRollingFileAppender

log4j.appender.E.File = logs/logs.log

log4j.appender.E.Append = true

log4j.appender.E.Threshold = DEBUG

log4j.appender.E.layout = org.apache.log4j.PatternLayout

log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n

#log4j.appender.E.layout.

log4j.appender.D = org.apache.log4j.DailyRollingFileAppender

log4j.appender.D.File = logs/error.log

log4j.appender.D.Append = true

log4j.appender.D.Threshold = ERROR

log4j.appender.D.layout = org.apache.log4j.PatternLayout

log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n

加载配置文件时 控制台会显示log4j解析配置文件的过程 有错误会报错

log4j: Parsing for [root] with value=[DEBUG,D,E].

log4j: Ll token is [DEBUG].

log4j: Category root set to DEBUG

log4j: Parsing appender named "D".

log4j: Parsing layout options for "D".

log4j: Setting property [conversionPattern] to [%-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n].

log4j: End of parsing for "D".

log4j: Setting property [threshold] to [ERROR].

log4j: Setting property [append] to [true].

log4j: Setting property [file] to [logs/error.log].

log4j: setFile called: logs/error.log, true

log4j: setFile ended

log4j: Appender [D] to be rolled at midnight.

log4j: Parsed "D" options.

log4j: Parsing appender named "E".

log4j: Parsing layout options for "E".

log4j: Setting property [conversionPattern] to [%-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n].

log4j: End of parsing for "E".

log4j: Setting property [file] to [logs/logs.log].

log4j: Setting property [threshold] to [DEBUG].

log4j: Setting property [append] to [true].

log4j: setFile called: logs/logs.log, true

log4j: setFile ended

log4j: Appender [E] to be rolled at midnight.

log4j: Parsed "E" options.

log4j: Finished configuring.

如何配置SLF4J不同的日志实现

使用slf4j库作为你的Ja应用日志API层有很多好处,这里我会展示一小部分关于如何使用和配置它的例子。

你可以把slf4j想成一个Ja的接口,然后你需要实现这个接口,从而在运行时提供实际的日志记录,例如把日志写到控制台(STDOUT)或者一个文件上等等。每种实现(或成为绑定)都显而易见地有他们自己的方式来配置日志的输出,但是你的应用对实现者并无感知并且一直使用相同的org.slf4j.Logger API。让我们看看如何在实际中使用它。

使用slf4j做简单的日志记录

创建基于Men的工程,在pom.xml中添加如下内容

org.slf4j

slf4j-api

1.7.5

现在你可以在你的Ja代码中这样使用Logger

package deng;

import org.slf4j.;

public class Hello {

static Logger LOGGER = LoggerFactory.getLogger(Hello.class);

public static void main(String[] args) {

for (int i = 0; i < 10; i++)

if (i % 2 == 0)

LOGGER.("Hello {}", i);

else

LOGGER.debug("I am on index {}", i);

}

}

以上代码可以编译通过,但是当你运行它时,你会看到这样的输出

bash> ja deng.Hello

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".

SLF4J: Defaulting to no-operation (NOP) logger implementation

SLF4J: See for further details.

上面的意思是,在运行时,你没有做日志的实现(或者说日志的绑定),所以slf4j简简单单的使用了一个什么也不会做的空实现。

为了看到正确的输出,你应该尝试使用一个简单()的实现,这个实现根本不需要任何配置!只要回到pom.xml然后添加如下配置

org.slf4j

slf4j-

1.7.5

现在你可以在控制台(STDOUT)看见INFO级别的日志输出了。这个简单的logger会默认显示任何INFO或者更高级别的信息。想要看DEBUG级别的信息,你需要在Ja启动时传入这个系统属性( property)

-Dorg.slf4j.Logger.defaultLogLl=DEBUG

使用slf4j与Log4j日志

现在我们可以试验并更换不同的日志实现,但你的程序代码可以保持不变。

我们要做的是用另一个流行的日志实现来替换掉slf4j-,比如Log4j。

org.slf4j

slf4j-log4j12

1.7.5

又一次,我们必须对我们选的每一个日志实现做配置。在这个例子中,我们需要一个文件src/main/resources/log4j.properties。

log4j.rootLogger=DEBUG, STDOUT

log4j.logger.deng=INFO

log4j.appender.STDOUT=org.apache.log4j.ConsoleAppender

log4j.appender.STDOUT.layout=org.apache.log4j.PatternLayout

log4j.appender.STDOUT.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n

重运行你的程序,你会看到同样的输出结果。

使用slf4j和JDK日志

JDK实际上带有一个日志包,你可以在pom.xml中替换为另一个日志实现。

org.slf4j

slf4j-jdk14

1.7.5

现在JDK日志的配置起来有一点困难。这里不仅需要一个配置文件src/main/resources/logging.properties,你还需要添加一个系统属性

-Dja.util.logging.config.file=logging.properties

这是一个logging.properties的示例

ll=INFO

handlers=ja.util.logging.ConsoleHandler

ja.util.logging.ConsoleHandler.ll=FINEST

deng.ll=FINEST

使用slf4j和Logback日志

Logback日志实现是一个高质量的实现。如果你想在项目中写认真的代码,你会想要考虑这中方式。还是修改你的pom.xml文件,替换成这样

ch.qos.logback

logback-classic

1.0.13

这是一个简单的配置src/main/resources/logback.xml

%d{HH:mm:ss.SSS} [%thread] %-5ll %logger{36} - %msg%n

用slf4j写你自己的日志库

如果你正在很多终端用户(END USER)提供Ja库,那么让你的项目仅依赖slf4j-api是个好想法,然后让你的用户在他们开发和运营环境中选择任意的日志实现。作为终端用户,他们可以快速地从上面提到的日志库中选择一个,并且从他们自己喜欢的日志实现的特性中受益。

idea JAVA非web项目如何配置slf4j-Log4j

PropertyConfigurator.configure("E:/study/log4j/log4j.properties");

//DOMConfigurator.configure("E:/study/log4j/log4j.xml");//加载.xml文件

//从项目目录开始读

PropertyConfigurator.configure("log4j/log4j.properties");

//DOMConfigurator.configure("log4j/log4j.xml");//加载.xml文件

Scala配置logback

scala+spark的工程中采用men构建

1、首先在src/main/resources下加入logback.xml

2、men下加入

com.typesafe.scala-logging

scala-logging_2.11

3.5.0

ch.qos.logback

logback-classic

1.2.3

3、使用的方法

private[this]val logger =Logger(this.getClass)

logger.("server ready ...... ")

SLF4J: Class path contains multiple SLF4J bindings.

SLF4J: Found binding in [jar:file:/Users/nibaohua/onway/menpro/repo/org/slf4j/slf4j-log4j12/1.7.16/slf4j-log4j12-1.7.16.jar!/org/slf4j/impl/StaticLoggerBinder.class]

SLF4J: Found binding in [jar:file:/Users/nibaohua/onway/menpro/repo/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar!/org/slf4j/impl/StaticLoggerBinder.class]

SLF4J: See for an explanation.

SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]

log4j:WARN No appenders could be found for logger (Test1$).

log4j:WARN Please initialize the log4j properly.

log4j:WARN See for more .

其实很简单,查看问题说明引入了多个slf4j,在men下面饮用的jar包也可以看到,找到依赖该jar的包,修改如下,增加exclusions

org.apache.spark

spark-core_2.11

${spark}

org.slf4j

slf4j-log4j12

log4j

log4j

log4j2 配置文件 log4j2.xml 详解(转载)

最近由于项目的需要,我们把 log4j 1.x 的版本全部迁移成 log4j 2.x 的版本,那随之而来的 slf4j 整合 log4j 的配置( 使用 Slf4j 集成 Log4j2 构建项目日志系统的完美解决方案 )以及 log4j2 配置文件的详解,就需要我们来好好聊一聊了。本文就专门来讲解下 log4j2.xml 配置文件的各项标签的意义。

log4j 2.x 版本不再支持像 1.x 中的 .properties 后缀的文件配置方式, 2.x 版本配置文件后缀名只能为 .xml , .json 或者 .jsn 。系统选择配置文件的优先级(从先到后)如下:

我们一般默认使用 log4j2.xml 进行命名。如果本地要测试,可以把 log4j2-test.xml 放到 classpath ,而正式环境使用 log4j2.xml ,则在打包部署的时候不要打包 log4j2-test.xml 即可。

log4j2配置文件详解(springboot+slf4j+log4j2+yaml+lombok)

log4j2配置文件学习笔记:

说明1:本文主要针对yml配置,其他xml配置或者json配置。

说明2:下面是大致介绍了结构,什么作用,当然还有其他分类,比如:logger,AsyncLogger | appenders fileAppenders | rollingFile,rollingRandomAccessFile这些不同的分类和里面具体的参数设置。见,写的非常好: log4j2

yaml格式可以参考: YAML语法入门

大致配置(比较长,看有注释的就可以,没注释的大致都相同):

备注:关于各种filter的配置参数见: filter介绍

springboot+slf4j+log4j2+yaml中使用:主要是@slf4j(topic="自定义的logger name")。

其实@slf4j注解就是实现: