LOG4J简介

介绍

定义日志的格式、输出目的、日志级别

通过配置文件和java程序两种方式

使用log4j大概涉及3个主要概念:

         公共类 Logger Logger 负责处理日志记录的大部分操作。

         公共接口 Appender Appender 负责控制日志记录操作的输出。

         公共抽象类Layout Layout 负责格式化Appender的输出。

Logger

       级别  :debug  info  warn  error fatal    all(所有) off(关闭所有)

       Log4j建议只使用四个级别,优先级从高到低分别是ERRORWARNINFODEBUG。通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。 

       如果没有设置日志记录器(Logger)的级别,那么它将会继承最近的祖先的级别,。因此,如果在包com.foo.bar中创建一个日志记录器(Logger)并且没有设置级别,那它将会继承在包com.foo中创建的日志记录器(Logger)的级别。

      

    static Loggerlogger = Logger.getLogger(test.class);
    logger.setLevel((Level)Level.WARN);  //创建并设置级别

Appender:

  1.ConsoleAppender:使用用户指定的布局(layout) 输出日志事件到System.out或者System.err。默认的目标是System.out。

      ConsoleAppender appender = new ConsoleAppender(new PatternLayout());
       //创建了一个控制台appender,具有一个默认的PatternLayout。它使用了默认的System.out 输出。

  2.DailyRollingFileAppender 扩展FileAppender,每天产生一个文件。

log4j.appender.A2=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A2.file=dglog
log4j.appender.A2.DatePattern='.'yyyy-MM-dd
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern=%5r %-5p %c{2} - %m%n

   3. FileAppender 把日志事件写入一个文件

         log4j.appender.A2.File=dglog.txt

   4. RollingFileAppender 扩展FileAppender,指定尺寸产生新的文件

log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File= ../logs/dglog.log
# Control the maximum log file size
log4j.appender.R.MaxFileSize=100KB
# Archive log files (one backup file here)
log4j.appender.R.MaxBackupIndex=1
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n

   5. WriterAppender  把日志事件写入到Writer或者OutputStream。

   6. SMTPAppender 当特定的日志事件发生时,一般是指发生错误或者重大错误时,发送一封邮件。

   7.SocketAppender 给远程日志服务器(通常是网络套接字节点)发送日志事件(LoggingEvent)对象。

   8.SocketHubAppender 给远程日志服务器群组(通常是网络套接字节点)发送日志事件(LoggingEvent)对象。

   9.SyslogAppender给远程异步日志记录的后台精灵程序(daemon)发送消息。

  10.TelnetAppender 一个专用于向只读网络套接字发送消息的log4j appender。

 

Layout

org.apache.log4j.HTMLLayout(以HTML表格形式布局), 
org.apache.log4j.PatternLayout(可以灵活地指定布局模式), 
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串), 
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息) 


%m 输出代码中指定的消息 
%p 输出优先级,即DEBUGINFOWARNERRORFATAL 
%r 输出自应用启动到输出该log信息耗费的毫秒数 
%c 输出所属的类目,通常就是所在类的全名 
%t 输出产生该日志事件的线程名 
%n 输出一个回车换行符,Windows平台为"rn"Unix平台为"n" 
%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:20021018 221028921 
%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(Test Log4.java:10) 

例子1:显示日期和log信息
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern=%d{yyyy-MM-ddHH:mm:ss,SSS} %m%n
打印的信息是:
2002-11-12 11:49:42,866 SELECT * FROM Role WHERE 1=1 order bycreateDate desc
 
例子2:显示日期,log发生地方和log信息
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern=%d{yyyy-MM-ddHH:mm:ss,SSS} %l "#" %m%n
2002-11-12 11:51:46,313cn.net.unet.weboa.system.dao.RoleDAO.select(RoleDAO.java:409) "#"
SELECT * FROM Role WHERE 1=1 order by createDate desc
 
例子3:显示log级别,时间,调用方法,log信息
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern=[%-5p]%d{yyyy-MM-dd HH:mm:ss,SSS}
method:%l%n%m%n
log信息:
[DEBUG] 2002-11-12 12:00:57,376
method:cn.net.unet.weboa.system.dao.RoleDAO.select(RoleDAO.java:409)
SELECT * FROM Role WHERE 1=1 order by createDate desc


配置文件

Xml格式

<?xmlversion="1.0"encoding="UTF-8" ?>

<!DOCTYPElog4j:configuration SYSTEM"log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

  <appendername="appender"class="org.apache.log4j.FileAppender">

    <paramname="File"value="Indentify-Log.txt"/>

    <paramname="Append"value="false"/>

    <layoutclass="org.apache.log4j.PatternLayout">

      <paramname="ConversionPattern"value="%d [%t] %p - %m%n"/>

    </layout>

  </appender>

  <root>

    <priority value ="debug"/>

    <appender-refref="appender"/>

  </root>

</log4j:configuration>

 

Properties格式

properties 配置1

log4j.rootLogger=DEBUG
#将DAO层log记录到DAOLog,allLog中
log4j.logger.DAO=DEBUG,A2,A4
#将逻辑层log记录到BusinessLog,allLog中
log4j.logger.Businesslog=DEBUG,A3,A4
 
#A1--打印到屏幕上
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-5p[%t] %37c %3x - %m%n
 
#A2--打印到文件DAOLog中--专门为DAO层服务
log4j.appender.A2=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A2.file=DAOLog
log4j.appender.A2.DatePattern='.'yyyy-MM-dd
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern=[%-5p]%d{yyyy-MM-dd HH:mm:ss,SSS}
method:%l%n%m%n
 
#A3--打印到文件BusinessLog中--专门记录逻辑处理层服务log信息
log4j.appender.A3=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A3.file=BusinessLog
log4j.appender.A3.DatePattern='.'yyyy-MM-dd
log4j.appender.A3.layout=org.apache.log4j.PatternLayout
log4j.appender.A3.layout.ConversionPattern=[%-5p]%d{yyyy-MM-dd HH:mm:ss,SSS}
method:%l%n%m%n
 
#A4--打印到文件alllog中--记录所有log信息
log4j.appender.A4=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A4.file=alllog
log4j.appender.A4.DatePattern='.'yyyy-MM-dd
log4j.appender.A4.layout=org.apache.log4j.PatternLayout
log4j.appender.A4.layout.ConversionPattern=[%-5p]%d{yyyy-MM-dd HH:mm:ss,SSS}
method:%l%n%m%n
 


properties的配置2

先看一个常见的log4j.properties文件,它是在控制台和myweb.log文件中记录日志:

log4j.rootLogger=DEBUG, stdout, logfile
 
log4j.category.org.springframework=ERROR
log4j.category.org.apache=INFO
 
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d%p [%c] - %m%n
 
log4j.appender.logfile=org.apache.log4j.RollingFileAppender
log4j.appender.logfile.File=${myweb.root}/WEB-INF/log/myweb.log
log4j.appender.logfile.MaxFileSize=512KB
log4j.appender.logfile.MaxBackupIndex=5
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d%p [%c] - %m%n


如果想对不同的类输出不同的文件(以cn.com.Test为例),先要在Test.java中定义:

private static Log logger =LogFactory.getLog(Test.class);
  然后在log4j.properties中加入:
log4j.logger.cn.com.Test= DEBUG, test
log4j.appender.test=org.apache.log4j.FileAppender
log4j.appender.test.File=${myweb.root}/WEB-INF/log/test.log
log4j.appender.test.layout=org.apache.log4j.PatternLayout
log4j.appender.test.layout.ConversionPattern=%d%p [%c] - %m%n

  也就是让cn.com.Test中的logger使用log4j.appender.test所做的配置。

  但是,如果在同一类中需要输出多个日志文件呢?其实道理是一样的,先在Test.java中定义:

private static Log logger1 =LogFactory.getLog("myTest1");
private static Log logger2 =LogFactory.getLog("myTest2");
  然后在log4j.properties中加入:
log4j.logger.myTest1= DEBUG, test1
log4j.appender.test1=org.apache.log4j.FileAppender
log4j.appender.test1.File=${myweb.root}/WEB-INF/log/test1.log
log4j.appender.test1.layout=org.apache.log4j.PatternLayout
log4j.appender.test1.layout.ConversionPattern=%d%p [%c] - %m%n
  
log4j.logger.myTest2= DEBUG, test2
log4j.appender.test2=org.apache.log4j.FileAppender
log4j.appender.test2.File=${myweb.root}/WEB-INF/log/test2.log
log4j.appender.test2.layout=org.apache.log4j.PatternLayout
log4j.appender.test2.layout.ConversionPattern=%d%p [%c] - %m%n

  也就是在用logger时给它一个自定义的名字(如这里的"myTest1"),然后在log4j.properties中做出相应配置即可。别忘了不同日志要使用不同的logger(如输出到test1.log的要用logger1.info("abc"))。

log4j.logger.myTest1=DEBUG, test1,stdout  //输出stdout和test1

加载到java

log4j可以使用3中配置器来初始化:BasicConfigurator,DOMConfigurator,PropertyConfigurator 
其语法为: 
BasicConfigurator.configure()
自动快速地使用缺省Log4j环境。 
PropertyConfigurator.configure( String configFilename):读取使用
Java的特性文件编写的配置文件。 
DOMConfigurator.configure( String filename ) :读取
XML形式的配置文件。 
这里用的是PropertyConfigurator。使用PropertyConfigurator适用于所有的系统。如下的语句: 
PropertyConfigurator.configure("log4j.properties"); 

就以log4j.properties为配置文件初始化好了log4j环境。 
注意一点:这个语句只需要在系统启动的时候执行一次。

实例:配置信息读入到Java程序

importorg.apache.log4j.Logger;
importorg.apache.log4j.xml.DOMConfigurator;
public classexternalxmltest {
   static Logger logger =Logger.getLogger(filetest.class);
   public static void main(String args[]) {
     DOMConfigurator.configure("xmllog4jconfig.xml");
      logger.debug("Here is someDEBUG");
      logger.info("Here is someINFO");
      logger.warn("Here is someWARN");
      logger.error("Here is someERROR");
      logger.fatal("Here is someFATAL");
   }
}
 


实例

实例: 程序定义log

importorg.apache.log4j.Level;
importorg.apache.log4j.Logger;
importorg.apache.log4j.SimpleLayout;
importorg.apache.log4j.FileAppender;
public classsimpandfile {
   staticLogger logger = Logger.getLogger(simpandfile.class);
   public static void main(String args[]) {
      SimpleLayout layout = new SimpleLayout();
      FileAppender appender = null;
      try {
         appender = newFileAppender(layout,"output1.txt",false);
      } catch(Exception e) {}
      logger.addAppender(appender);
      logger.setLevel((Level) Level.DEBUG);
      logger.debug("Here is someDEBUG");
      logger.info("Here is someINFO");
      logger.warn("Here is someWARN");
      logger.error("Here is someERROR");
      logger.fatal("Here is someFATAL");
   }
}
 

log4j2 

特点:

自动配置加载: 配置改变时热加载,调试比较好用

filter: 基于上下文数据、标记、正则表达式、日志事件的过滤。

属性: 配置文件、系统属性、环境变量、线程上下文、事件中数据中定义的值

jsp中支持日志标签

参考教程: 
  http://www.cnblogs.com/leo-lsw/p/log4j2tutorial.html
     http://logging.apache.org/log4j/2.x/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值