JAVA学习笔记_利用slf4j进行log4j日志管理

来源:互联网 发布:thomson数据库 编辑:程序博客网 时间:2024/06/05 19:05

slf4j介绍
slf4j官网:http://www.slf4j.org/
SLF4J,即简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,它只服务于各种各样的日志系统。SLF4J所提供的核心API是一些接口以及一个LoggerFactory的工厂类。
log4j是一个日志系统。

slf4j其实用到了一种设计模式(Facade设计模式,门面设计模式)。如下图:
这里写图片描述

举例:原先项目使用slf4j统一管理使用log4j而现在改使用logback
步骤:
1、删除log4j-1.2.12.jar、slf4j-log4j12-1.7.5.jar
2、删除配置文件log4j.properties
3、导入jar包:log4j-over-slf4j-1.7.5.jar、logback-access-1.0.13.jar、logback-classic-1.0.13.jar、logback-core-1.0.13.jar
4、增加logback-1.0.13配置文件logback.xml
不需要修改项目之前的代码,只要更换jar包和相应日志的配置文件即可


在应用程序中添加日志记录目的:

a.监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析工作;b.跟踪代码运行时轨迹,作为日后审计的依据;c.担当集成开发环境中的调试器的作用,向文件或控制台打印代码的调试信息。

最普通的做法就是在代码中嵌入许多的打印语句,这些打印语句可以输出到控制台或文件中,比较好的做法就是构造一个日志操作类来封装此类操作,而不是让一系列的打印语句充斥了代码的主体。

Log4j简介
官网:http://logging.apache.org/log4j/2.x/index.html
通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。

Log4j 的目标是:它允许开发人员以任意的精细程度控制哪些日志说明被输出。通过使用 外部的配置文件,可以在运行时配置它。

1)日志级别
日志级别从高到低分为:
A:off 最高等级,用于关闭所有日志记录。
B:fatal 指出每个严重的错误事件将会导致应用程序的退出。
C:error 指出虽然发生错误事件,但仍然不影响系统的继续运行。
D:warn 表明会出现潜在的错误情形。
E:info 一般和在粗粒度级别上,强调应用程序的运行全程。
F:debug 一般用于细粒度级别上,对调试应用程序非常有帮助。
G:all 最低等级,用于打开所有日志记录。

2)Log4j组成:
Log4j中有三个主要的组件,它们分别是:Logger、Appender、Layout

Logger:Log4j 允许开发人员定义多个Logger,每个Logger拥有自己的名字,Logger之间通过名字来表明隶属关系。有一个Logger称为Root,它永远存在,且不能通过名字检索或引用,可以通过Logger.getRootLogger()方法获得,其它Logger通过 Logger.getLogger(String name)方法。(这是我们最常用的方法)

Appender:Appender则是用来指明将所有的log信息存放到什么地方,Log4j中支持多种appender,如 console、files、GUI components、NT Event Loggers等,一个Logger可以拥有多个Appender,也就是你既可以将Log信息输出到屏幕,同时存储到一个文件中。

Layout:Layout的作用是控制Log信息的输出方式,也就是格式化输出的信息。

Log4j的配置文件:
Log4j可以通过Java程序动态设置,该方式明显缺点是:如果需要修改日志输出级别等信息,则必须修改java文件,然后重新编译
Log4j 支持两种配置文件格式,一种是 XML 格式的文件,一种是 Java 特性文件 lg4j.properties (键 = 值),properties文件简单易读,xml文件可以配置更多的功能(比如过滤)


java平台日志组件的介绍 common-logging,log4j,slf4j,logback
http://www.cnblogs.com/nuccch/p/6770431.html


项目中运用:
引入jar包
这里写图片描述

导入log4j.properties配置文件

### 设置###log4j.rootLogger = debug,stdout,D,E### 输出信息到控制抬 ###log4j.appender.stdout = org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.Target = System.outlog4j.appender.stdout.layout = org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n### 输出DEBUG 级别以上的日志到=E://logs/error.log ###log4j.appender.D = org.apache.log4j.DailyRollingFileAppenderlog4j.appender.D.File = E://logs/log.loglog4j.appender.D.Append = truelog4j.appender.D.Threshold = DEBUG log4j.appender.D.layout = org.apache.log4j.PatternLayoutlog4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n### 输出ERROR 级别以上的日志到=E://logs/error.log ###log4j.appender.E = org.apache.log4j.DailyRollingFileAppenderlog4j.appender.E.File =E://logs/error.log log4j.appender.E.Append = truelog4j.appender.E.Threshold = ERROR log4j.appender.E.layout = org.apache.log4j.PatternLayoutlog4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]

java

public class DBUtilTest {    @Test    public  void test(){        Logger logger = LoggerFactory.getLogger(DBUtilTest.class);        DBUtil.getCon();            logger.debug("在{}登录",new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));               logger.info("info....");                logger.error("error....");                  logger.warn("warn....");            }}

后台打印效果:
这里写图片描述

log4j.properties

log4j.rootLogger=DEBUG, Console  #Console  log4j.appender.Console=org.apache.log4j.ConsoleAppender  log4j.appender.Console.layout=org.apache.log4j.PatternLayout  log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n  log4j.logger.java.sql.ResultSet=INFO  log4j.logger.org.apache=INFO  log4j.logger.java.sql.Connection=DEBUG  log4j.logger.java.sql.Statement=DEBUG  log4j.logger.java.sql.PreparedStatement=DEBUG 

参考 :
http://blog.csdn.net/w410589502/article/details/52129582
http://www.cnblogs.com/shanheyongmu/p/5650632.html