您的当前位置:首页正文

java log4j,logback日志总结

来源:一二三四网
一:java开发常用日志概括

slf4j由log4j作者Ceki开发,逐步取代apahce commons-logging

logback由log4j作者Ceki开发,逐步取代log4j。

关系:

slf4j=====commons-logging

*.各种日志实现的通用入口,会根据classpath中存在下面哪一个Jar来决定具体的日志实现库。

logback====log4j *.日志实现类

日志管理:slf4j(commons-logging)+logback(log4j)

二:logback简介

1、Logback为取代log4j而生

Logback是由log4j创始人Ceki Gülcü设计的又一个开源日志组件。logback当前分成三个模块:logback-core,logback- classic和logback-access。

2、Logback的核心对象:Logger、Appender、Layout

Logback主要建立于Logger、Appender 和 Layout 这三个类之上。

Logger:日志的记录器,把它关联到应用的对应的context上后,主要用于存放日志对象,也可以定义日志类型、级别。Logger对象一般多定义为静态常量,如:

1 package com.logs;

2

3 import org.slf4j.Logger;

4 import org.slf4j.LoggerFactory; 5

6 public class MyApp {

7 final static Logger logger = LoggerFactory.getLogger(\"MyApp.class\"); 8 public static void main(String[] args) { 9

10 logger.trace(\"trace\"); 11 logger.debug(\"debug str\"); 12 logger.info(\"info str\"); 13 logger.warn(\"warn\"); 14 logger.error(\"error\"); 15 } 16 }

Appender:用于指定日志输出的目的地,目的地可以是控制台、文件、远程套接字服务器、 MySQL、 PostreSQL、Oracle和其他数据库、 JMS和远程UNIX Syslog守护进程等。

Layout:负责把事件转换成字符串,格式化的日志信息的输出。具体的Layout通配符,可以直接查看帮助文档。

3、Level 有效级别

Logger可以被分配级别。级别包括:TRACE、DEBUG、INFO、WARN和ERROR,定义于ch.qos.logback.classic.Level类。程序会打印高于或等于所设置级别的日志,设置的日志等级越高,打印出来的日志就越少。如果设置级别为INFO,则优先级高于等于INFO级别(如:INFO、 WARN、ERROR)的日志信息将可以被输出,小于该级别的如DEBUG将不会被输出。为确保所有logger都能够最终继承一个级别,根logger总是有级别,默认情况下,这个级别是DEBUG。

4、 三值逻辑

Logback的过滤器基于三值逻辑(ternary logic),允许把它们组装或成链,从而组成任意的复合过滤策略。过滤器很大程度上受到Linux的iptables启发。这里的所谓三值逻辑是说,过滤器的返回值只能是ACCEPT、DENY和NEUTRAL的其中一个。 如果返回DENY,那么记录事件立即被抛弃,不再经过剩余过滤器; 如果返回NEUTRAL,那么有序列表里的下一个过滤器会接着处理记录事件;

如果返回ACCEPT,那么记录事件被立即处理,不再经过剩余过滤器。

5、Filter 过滤器

Logback-classic提供两种类型的过滤器:常规过滤器和TuroboFilter过滤器。Logback整体流程:Logger 产生日志信息;Layout修饰这条msg的显示格式;Filter过滤显示的内容;Appender具体的显示,即保存这日志信息的地方。

6、Logback的使用

要在工程里面使用logback需要以下jar文件:

slf4j-api-1.6.1.jar

官网网址:http://www.slf4j.org/

下载地址:http://www.slf4j.org/dist/slf4j-1.6.1.zip

logback-access-0.9.29.jar logback-classic-0.9.29.jar logback-core-0.9.29.jar

官网网址:http://logback.qos.ch/

下载地址:http://logback.qos.ch/dist/logback-0.9.29.zip

在工程src目录下建立logback.xml 注:

1.logback首先会试着查找logback.groovy文件; 2.当没有找到时,继续试着查找logback-test.xml文件; 3.当没有找到时,继续试着查找logback.xml文件; 4.如果仍然没有找到,则使用默认配置(打印到控制台)。

在工程src目录下建立logback包,然后在包下建立LogbackDemo.java用于测试,代码如 Java代码

package logback;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory; public class LogbackDemo {

private static Logger log = LoggerFactory.getLogger(LogbackDemo.class); public static void main(String[] args) {

log.trace(\"======trace\"); log.debug(\"======debug\"); log.info(\"======info\"); log.warn(\"======warn\"); log.error(\"======error\"); String name = \"Aub\"; String message = \"3Q\";

String[] fruits = { \"apple\

// logback提供的可以使用变量的打印方式,结果为\"Hello,Aub!\" log.info(\"Hello,{}!\

// 可以有多个参数,结果为“Hello,Aub! 3Q!” log.info(\"Hello,{}! {}!\ // 可以传入一个数组,结果为\"Fruit: apple,banana\" log.info(\"Fruit: {},{}\ } }

三:Logback配置详解

1:根节点包含的属性:

scan:

当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。 scanPeriod:

设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 debug:

当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 例如:

Xml代码

2:根节点的子节点:

2.1设置上下文名称:

每个logger都关联到logger上下文,默认上下文名称为“default”。但可以使用设置成其他名字,用于区分不同应用程序的记录。一旦设置,不能修改。

Xml代码

myAppName

2.2设置变量:

用来定义变量值的标签, 有两个属性,name和value;其中name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。

例如使用定义上下文名称,然后在设置logger上下文时使用。

Xml代码

${APP_Name}

2.3获取时间戳字符串:

两个属性 key:标识此 的名字;datePattern:设置将当前时间(解析配置文件的时间)转换为字符串的模式,遵循java.txt.SimpleDateFormat的格式。 例如将解析配置文件的时间作为上下文名称:

Xml代码

${bySecond}

2.4设置loger

用来设置某一个包或者具体的某一个类的日志打印级别、以及指定仅有一个name属性,一个可选的level和一个可选的addtivity属性。 name:

用来指定受此loger约束的某一个包或者具体的某一个类。 level:

用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。 如果未设置此属性,那么当前loger将会继承上级的级别。 addtivity:

是否向上级loger传递打印信息。默认是true。

可以包含零个或多个元素,标识这个appender将会添加到这个loger。

也是元素,但是它是根loger。只有一个level属性,应为已经被命名为\"root\". level:

用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,不能设置为INHERITED或者同义词NULL。 默认是DEBUG。

可以包含零个或多个元素,标识这个appender将会添加到这个loger。

例如:

LogbackDemo.java类 Java代码

package logback;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

public class LogbackDemo {

private static Logger log = LoggerFactory.getLogger(LogbackDemo.class);

public static void main(String[] args) { log.trace(\"======trace\"); log.debug(\"======debug\"); log.info(\"======info\"); log.warn(\"======warn\"); log.error(\"======error\"); } }

logback.xml配置文件

第1种:只配置root

Xml代码

1. 2.

3.

4. 5.

6. %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n 7. 8.

9.

10. 11. 12. 13.

14.

其中appender的配置表示打印到控制台(稍后详细讲解appender );

将root的打印级别设置为“INFO”,指定了名字为“STDOUT”的appender。

当执行logback.LogbackDemo类的main方法时,root将级别为“INFO”及大于“INFO”的日志信息交给已经配置好的名为“STDOUT”的appender处理,“STDOUT”appender将信息打印到控制台;

打印结果如下:

13:30:38.484 [main] INFO logback.LogbackDemo - ======info 13:30:38.500 [main] WARN logback.LogbackDemo - ======warn 13:30:38.500 [main] ERROR logback.LogbackDemo - ======error

第2种:带有loger的配置,不指定级别,不指定appender,

Xml代码

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

其中appender的配置表示打印到控制台(稍后详细讲解appender );

将控制logback包下的所有类的日志的打印,但是并没用设置打印级别,所以继承他的上级的日志级别“DEBUG”;

没有设置addtivity,默认为true,将此loger的打印信息向上级传递; 没有设置appender,此loger本身不打印任何信息。

将root的打印级别设置为“DEBUG”,指定了名字为“STDOUT”的appender。

当执行logback.LogbackDemo类的main方法时,因为LogbackDemo 在包logback中,所以首先执行,将级别为“DEBUG”及大于“DEBUG”的日志信息传递给root,本身并不打印;

root接到下级传递的信息,交给已经配置好的名为“STDOUT”的appender处理,“STDOUT”appender将信息打印到控制台;

打印结果如下: Xml代码

13:19:15.406 [main] DEBUG logback.LogbackDemo - ======debug 13:19:15.406 [main] INFO logback.LogbackDemo - ======info 13:19:15.406 [main] WARN logback.LogbackDemo - ======warn 13:19:15.406 [main] ERROR logback.LogbackDemo - ======error

第3种:带有多个loger的配置,指定级别,指定appender

Xml代码

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

其中appender的配置表示打印到控制台(稍后详细讲解appender );

将控制logback包下的所有类的日志的打印,但是并没用设置打印级别,所以继承他的上级的日志级别“DEBUG”;

没有设置addtivity,默认为true,将此loger的打印信息向上级传递; 没有设置appender,此loger本身不打印任何信息。

控制logback.LogbackDemo类的日志打印,打印级别为“INFO”;

additivity属性为false,表示此loger的打印信息不再向上级传递,

指定了名字为“STDOUT”的appender。

将root的打印级别设置为“ERROR”,指定了名字为“STDOUT”的appender。

当执行logback.LogbackDemo类的main方法时,先执行name=\"logback.LogbackDemo\" level=\"INFO\" additivity=\"false\">,将级别为“INFO”及大于“INFO”的日志信息交给此loger指定的名为“STDOUT”的appender处理,在控制台中打出日志,不再向次loger的上级 传递打印信息;

未接到任何打印信息,当然也不会给它的上级root传递任何打印信息;

打印结果如下:

14:05:35.937 [main] INFO logback.LogbackDemo - ======info 14:05:35.937 [main] WARN logback.LogbackDemo - ======warn 14:05:35.937 [main] ERROR logback.LogbackDemo - ======error

如果将修改

那打印结果将是什么呢?

没错,日志打印了两次,想必大家都知道原因了,因为打印信息向上级传递,logger本身打印一次,root接到后又打印一次

打印结果如下:

14:09:01.531 [main] INFO logback.LogbackDemo - ======info 14:09:01.531 [main] INFO logback.LogbackDemo - ======info 14:09:01.531 [main] WARN logback.LogbackDemo - ======warn 14:09:01.531 [main] WARN logback.LogbackDemo - ======warn 14:09:01.531 [main] ERROR logback.LogbackDemo - ======error 14:09:01.531 [main] ERROR logback.LogbackDemo - ======error

2.5设置

的子节点,是负责写日志的组件。

有两个必要属性name和class。name指定appender名称,class指定appender的全限定名。

1.ConsoleAppender:

把日志添加到控制台,有以下子节点:

:对日志进行格式化。(具体参数稍后讲解 )

:字符串 System.out 或者 System.err ,默认 System.out ; 例如:

Xml代码

%-4relative [%thread] %-5level %logger{35} - %msg %n

2.FileAppender:

把日志添加到文件,有以下子节点:

:被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。

:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。

:对记录事件进行格式化。(具体参数稍后讲解 )

:如果是 true,日志会被安全的写入文件,即使其他的FileAppender也在向此文件做写入操作,效率低,默认是 false。

例如:

Xml代码

testFile.log true

%-4relative [%thread] %-5level %logger{35} - %msg%n

3.RollingFileAppender:

滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。有以下子节点:

:被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。

:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。

:对记录事件进行格式化。(具体参数稍后讲解 )

:当发生滚动时,决定 RollingFileAppender 的行为,涉及文件移动和重命名。

: 告知 RollingFileAppender 合适激活滚动。 :当为true时,不支持FixedWindowRollingPolicy。支持

TimeBasedRollingPolicy,但是有两个限制,1不支持也不允许文件压缩,2不能设置file属性,必须留空。

rollingPolicy:

TimeBasedRollingPolicy: 最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动。有以下子节点: :

必要节点,包含文件名及“%d”转换符, “%d”可以包含一个 java.text.SimpleDateFormat指定的时间格式,如:%d{yyyy-MM}。如果直接使用 %d,默认格式是 yyyy-MM-dd。 RollingFileAppender 的file字节点可有可无,通过设置file,可以为活动文件和归档文件指定不同位置,当前日志总是记录到file指定的文件(活动文件),活动文件的名字不会改变;如果没设置file,活动文件的名字会根据fileNamePattern 的值,每隔一段时间改变一次。“/”或者“\\”会被当做目录分隔符。

:

可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件。假设设置每个月滚动,且 是6,则只保存最近6个月的文件,删除之前的旧文件。注意,删除旧文件是,那些为了归档而创建的目录也会被删除。

FixedWindowRollingPolicy: 根据固定窗口算法重命名文件的滚动策略。有以下子节点: :窗口索引最小值

:窗口索引最大值,当用户指定的窗口过大时,会自动将窗口设置为12。 :

必须包含“%i”例如,假设最小值和最大值分别为1和2,命名模式为 mylog%i.log,会产生归档文件mylog1.log和mylog2.log。还可以指定文件压缩选项,例如,mylog%i.log.gz 或者 没有log%i.log.zip

triggeringPolicy:

SizeBasedTriggeringPolicy: 查看当前活动文件的大小,如果超过指定大小会告知 RollingFileAppender 触发当前活动文件滚动。只有一个节点: :这是活动文件的大小,默认值是10MB。

例如:每天生成一个日志文件,保存30天的日志文件。

Java代码

logFile.%d{yyyy-MM-dd}.log 30

%-4relative [%thread] %-5level %logger{35} - %msg%n

例如:按照固定窗口模式生成日志文件,当文件大于20MB时,生成新的日志文件。窗口大

小是1到3,当保存了3个归档文件后,将覆盖最早的日志。

Xml代码

test.log

tests.%i.log.zip 1 3

5MB

%-4relative [%thread] %-5level %logger{35} - %msg%n

4.另外还有SocketAppender、SMTPAppender、DBAppender、SyslogAppender、

SiftingAppender,并不常用,这些就不在这里讲解了,大家可以参考官方文档。当然大家可以编写自己的Appender。

负责两件事,一是把日志信息转换成字节数组,二是把字节数组写入到输出流。

目前PatternLayoutEncoder 是唯一有用的且默认的encoder ,有一个节点,用来设置日志的输入格式。使用“%”加“转换符”方式,如果要输出“%”,则必须用“\\”对“\\%”进行转义。

例如:

Xml代码

%-4relative [%thread] %-5level %logger{35} - %msg%n 格式修饰符,与转换符共同使用:

可选的格式修饰符位于“%”和转换符之间。

第一个可选修饰符是左对齐 标志,符号是减号“-”;接着是可选的最小宽度 修饰符,用十进制数表示。如果字符小于最小宽度,则左填充或右填充,默认是左填充(即右对齐),填充符为空格。如果字符大于最小宽度,字符永远不会被截断。最大宽度 修饰符,符号是点号\".\"后面加十进制数。如果字符大于最大宽度,则从前面截断。点符号“.”后面加减号“-”在加数字,表示从尾部截断。

例如:%-4relative 表示,将输出从程序启动到创建日志记录的时间 进行左对齐 且最小宽度为4。

3:过滤器

:

过滤器,执行一个过滤器会有返回个枚举值,即DENY,NEUTRAL,ACCEPT其中之一。返回DENY,日志将立即被抛弃不再经过其他过滤器;返回NEUTRAL,有序列表里的下个过滤器过接着处理日志;返回ACCEPT,日志会被立即处理,不再经过剩余过滤器。

过滤器被添加到 中,为 添加一个或多个过滤器后,可以用任意条件对日志进行过滤。 有多个过滤器时,按照配置顺序执行。 下面是几个常用的过滤器:

LevelFilter: 级别过滤器,根据日志级别进行过滤。如果日志级别等于配置级别,过滤器会根据onMath 和 onMismatch接收或拒绝日志。有以下子节点: :设置过滤级别

:用于配置符合过滤条件的操作 :用于配置不符合过滤条件的操作

例如:将过滤器的日志级别配置为INFO,所有INFO级别的日志交给appender处理,非INFO级别的日志,被过滤掉。

Xml代码

INFO ACCEPT DENY

%-4relative [%thread] %-5level %logger{30} - %msg%n

ThresholdFilter: 临界值过滤器,过滤掉低于指定临界值的日志。当日志级别等于或高于临界值时,过滤器返回NEUTRAL;当日志级别低于临界值时,日志会被拒绝。 例如:过滤掉所有低于INFO级别的日志。 Xml代码

class=\"ch.qos.logback.core.ConsoleAppender\">

INFO

%-4relative [%thread] %-5level %logger{30} - %msg%n

EvaluatorFilter: 求值过滤器,评估、鉴别日志是否符合指定条件。需要额

外的两个JAR包,commons-compiler.jar和janino.jar有以下子节点: :

鉴别器,常用的鉴别器是JaninoEventEvaluato,也是默认的鉴别器,它以任意的java布尔值表达式作为求值条件,求值条件在配置文件解释过成功被动态编译,布尔值表达式返回true就表示符合过滤条件。evaluator有个子标签,用于配置求值条件。 求值表达式作用于当前日志,logback向求值表达式暴露日志的各种字段: Name Type Description

与记录请求相关联的原始记录事件,下面所有变量都来自event,例如,

event.getMessage()返回下面\"message\"相同的字符串

日志的原始消息,例如,设有logger mylogger,\"name\"的值是\"AUB\",对于 mylogger.info(\"Hello {}\\"Hello {}\"就是原始消息。

日志被各式话的消息,例如,设有

logger mylogger,\"name\"的值是\"AUB\",对于 mylogger.info(\"Hello {}\\"Hello Aub\"就是格式化后的消息。 logger 名。

日志所属的logger上下文。

级别对应的整数值,所以 level > INFO 是正确的表达式。 创建日志的时间戳。

与日志请求相关联的Marker对象,注意“Marker”有可能为null,所以你要确

event LoggingEvent

message String

formatedMessage logger loggerContext level timeStamp marker

String

String

LoggerContextVO int long Marker

保它不能是null。

包含创建日志期间的MDC所有值得map。访问方法是: mdc.get(\"myKey\") 。mdc.get()返回的是Object不是

String,要想调用String的方法就要强转,例如,

((String) mdc.get(\"k\")).contains(\"val\") .MDC可能为null,调用时注意。 如果没有异常与日志关联\"throwable\" 变量为 null. 不幸的是, \"throwable\" 不能被序列化。在远程系统上永远为

null,对于与位置无关的表达式请使用下面的变量throwableProxy

与日志事件关联的异常代理。如果没有异常与日志事件关联,则变量

\"throwableProxy\" 为 null. 当异常被关联到日志事件时,\"throwableProxy\" 在远程系统上不会为null

mdc Map

throwable

java.lang.Throwable

throwableProxy

IThrowableProxy

:用于配置符合过滤条件的操作 :用于配置不符合过滤条件的操作

例如:过滤掉所有日志消息中不包含“billing”字符串的日志。

Xml代码

return message.contains(\"billing\");

ACCEPT DENY

%-4relative [%thread] %-5level %logger - %msg%n

匹配器,尽管可以使用String类的matches()方法进行模式匹配,但会导致每次调用过滤器时都会创建一个新的Pattern对象,为了消除这种开销,可以预定义一个或多个matcher对象,定以后就可以在求值表达式中重复引用。的子标签。

中包含两个子标签,一个是,用于定义matcher的名字,求值表达式中使用这个名字来引用matcher;另一个是,用于配置匹配条件。

例如:

Xml代码

odd

statement [13579]

odd.matches(formattedMessage)

NEUTRAL DENY

%-4relative [%thread] %-5level %logger - %msg%n

其他Filter不太常用我这里就不讲了,大家可以参见官网。

四:log4j配置详解

配置实例:

在工程目录src下创建名为 “log4j.properties” 文件,内容如下: Properties代码

五:配置实例

1.logback

1 2 3

4

5 6

7 %date [%thread] %-5level %logger{80} - %msg%n 8 9 10

11 12 13 class=\"ch.qos.logback.core.rolling.RollingFileAppender\"> 14

15 DEBUG 16 ACCEPT 17 DENY 18 19 class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\"> 20 D:/logs/debug.%d{yyyy-MM-dd}.log

21 30 22 23

24 %date [%thread] %-5level %logger{80} - %msg%n 25 26 27

28 29 30 class=\"ch.qos.logback.core.rolling.RollingFileAppender\"> 31 32 ERROR 33 ACCEPT 34 DENY 35 36 class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\"> 37 D:/logs/error.%d{yyyy-MM-dd}.log

38 30 39 40

41 %date [%thread] %-5level %logger{80} - %msg%n 42 43 44

45 46 47 class=\"ch.qos.logback.core.rolling.RollingFileAppender\"> 48 49

50 message.contains(\"str\") 51

52 ACCEPT 53 DENY 54 55 class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\">

56 D:/logs/contains.%d{yyyy-MM-dd}.log 57

58 30 59 60

61 %date [%thread] %-5level %logger{80} - %msg%n 62 63 64

65

66 67 class=\"ch.qos.logback.core.db.DriverManagerConnectionSource\"> 69 com.mysql.jdbc.Driver 70 jdbc:mysql://host_name:3306/datebase_name 71 username

72 password 73 74 75

76 77 78

79 80 81

82 83 84

85 86 87

88 89 90

91 92 93

94 95 96

97 98 99

100 101 102 103

104

105 106 107 108 109 110 111

112

2.log4j

在日常的开发中经常需要通过输出一些信息进行程序的调试,如果到处都用

system.out.println()则在项目发布之后要逐一删除,而log4j提供了一种新的调试输出机制以解决输出的问题。log4j的原理是使用一个配置文件log4j.properties进行管理,在调试的时候可以把输出级别调低,项目正式发布之后把级别调高,这样以前的一些输出就可以屏蔽了,不用到程序当中再进行逐一删除。我们可以结合了commons-logging和log4j来进行日常的输出调试信息和记录系统运行的信息日志

在spring的项目中,spring为我们提供了管理log4j的类,

如果项目中使用了spring我一般都会通过spring提供的类来管理日志信息 一,首先我们来看看非spring环境中使用log4j 使用步骤。 1.添加必须jar包

a。commons-logging.jar b. log4j-1.2.14.jar

2.在web目录的src目录下面添加两个文件:commons-logging.properties和 log4j.properties

a.commons-logging.properties(文件名必须是此指定文件名),通用日志接口从此属性文件中获取实现日志添加内容如下: #通过Log4J日志器来实现日志记录功能

org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger

b.log4j.properties ,为log4j指定相应的属性

#指定日志的级别为DEBUG,log4j共有OFF(关闭),FATAL(严重的错误),ERROR(一般性错误),WARN(警告),INFO(信息),DEBUG(调试信息),TRACE(追踪)和ALL等8个基本

#并配置了两个输出目的地为e1(输出在控制台上),e2(输出在日志文件中) log4j.rootLogger=DEBUG,e1,e2 #指定e1日志信息输出在控制台

log4j.appender.e1=org.apache.log4j.ConsoleAppender

#指定e1日志信息输出格式为简单格式,它打印级别 Level,然后跟着一个破折号“-“ ,最后是日志消息。也可以自己定义格式

log4j.appender.e1.layout=org.apache.log4j.SimpleLayout #指定e2日志信息输出在指定文件中

log4j.appender.e2=org.apache.log4j.FileAppender log4j.appender.e2.layout=org.apache.log4j.SimpleLayout

#指定e2日志信息输出在logging.txt文件中,默认生成的logging.txt文件在tomcat的bin目录下

log4j.appender.e2.File=logging.txt 如果自己定义输出的日志,如下 log4j.rootLogger=DEBUG,e1,e2

log4j.appender.e1=org.apache.log4j.ConsoleAppender #log4j.appender.e1.layout=org.apache.log4j.SimpleLayout #指定布局模式格式

log4j.appender.e1.layout=org.apache.log4j.PatternLayout #定义自己的输出格式

log4j.appender.e1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%-

5p][%c] - %m%n

log4j.appender.e2=org.apache.log4j.FileAppender log4j.appender.e2.layout=org.apache.log4j.PatternLayout

log4j.appender.e2.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%-5p][%c] - %m%n

log4j.appender.e2.File=logging.txt 详细配置信息 配置Appender组件

配置日志消息输出目的地Appender,有以下几种 org.apache.log4j.ConsoleAppender(控制台) org.apache.log4j.FileAppender(文件)

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

org.apache.log4j.RollingFileAppender(文件大小达到指定尺寸的时候产生一个新文件) org.apache.log4j.WriterAppender(将日志信息以流个格式发送到任意指定的地方) 例如以下代码定义了一个名了file的Appender,它把日志信息输出到log.txt文件 log4j.appender.file=org.apache.log4j.RollingFileAppender log4j.appender.file.File=log.txt

配置Layout组件

Log4j提供下面几种Layout

org.apache.log4j.HTMLLayout(以html表格形式布局) org.apache.log4j.PatterLayout(可以灵活的指定布局模式)

org.apache.log4j.SimpleLayout(包含日志消息的级别和信息字符串) org.apache.log4j.TTCCLayout(包含日志产生的时间线程和类别)

Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,打印参数如下: %m 输出代码中指定的消息

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

%m 输出代码中指定的消息

%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL %r 输出自应用启动到输出该log信息耗费的毫秒数 %c 输出所属的类目,通常就是所在类的全名 %t 输出产生该日志事件的线程名

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

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

%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10) 二、在spring的项目中使用log4j 首先需要在web.xml进行声明:

webAppRootKey ssh.root

这里的ssh是http://localhost:8080/ssh/ 而root是系统开发目录中ssh/root

这样配置文件以及日志文件可以在spring的帮助下,放到开发环境中的任意位置

log4jConfigLocation /WEB-INF/log4j.properties

在这里定位配置文件,需要的是从root开始的绝对路径

log4jRefreshInterval 60000 设置监听器

org.springframework.web.util.Log4jConfigListener

之后我们就可以配置log4j配置文件了,内容如上的log4j.properties 我找了一个格式,copy如下 #先设置级别

log4j.rootLogger=INFO, file

log4j.appender.file=org.apache.log4j.RollingFileAppender

#在这里设置日志需要存放的位置,这里的变量就是我们在web.xml里设置的 log4j.appender.file.File=${ssh.root}/WEB-INF/logs/subject.log

log4j.appender.file.MaxFileSize=100KB log4j.appender.file.MaxBackupIndex=0

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

log4j.appender.file.layout.ConversionPattern=[ssh] %p %t %c - %m%n

logback相比较log4j的优势

slf4j支持参数化的logger.error(\"帐号ID:{}不存在\告别了if(logger.isDebugEnable()) 时代。

另外logback的整体性能比log4j也较佳,hibernate等项目已经采用了slf4j。

因篇幅问题不能全部显示,请点此查看更多更全内容

Top