关于Log4x

本文大部分转载自:

http://www.cnblogs.com/dennisit/archive/2013/01/01/2841603.html

http://www.cnblogs.com/gpcuster/archive/2009/08/29/1556248.html

log4x是Apache的开放源代码的项目,通过使用log4x,我们可以:
控制日志输出目标(Appender):控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;
控制日志的输出格式(Layout);
控制日志的输出信息的级别(Logger):OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。
对应的java版本为log4j,网址是:http://logging.apache.org/log4j
对应的.net版本为log4net,网址是:http://logging.apache.org/log4net/

log4x配置文件的定义:

1.Logger

(1)根logger。
Log4J中总是存在一个rootLogger,即使没有显示配置也是存在的,并且默认输出级别为DEBUG,根logger的配置格式为:
log4j.rootLogger = [ level ] , appenderName, appenderName, …

(2)logger继承
logger是通过名称来区别的,而且可以通过名称来构成一个继承关系,如:log4j.logger.A.B.C,这样我们建立了3个logger实例,它们分别是"A"、"A.B"、"A.B.C",以后我们可以通过Logger

logger = Logger.getLogger("A.B")来取得对应的logger实例。

(3)限制叠加性。
如果我们做了如下配置:
log4j.rootLogger=DEBUG, Console
log4j.logger.A=DEBUG, Console
对于logger A 输出的任何日志会往控制台输出两次,原因是A继承父logger的所有appender,这种继承关系仅仅是把父logger的appender添加到自己的appender列表中,父logger的输出level

不会影响子logger的输出。
我们可以通过:
log4j.additivity.A=false来限制叠加
logger A的日志仅会输出到自己Console中,不会继承任何父logger的appender。


2.Appender
log4x使用Appender指定输出目标,其提供的目标有如下几种:
  org.apache.log4j.ConsoleAppender(控制台)
  org.apache.log4j.FileAppender(文件)
  org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
  org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生新文件)
  org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)

3.Layout
log4x使用Layout指定输出格式,其提供的layout有以下几种:
  org.apache.log4j.HTMLLayout(以HTML表格形式布局),
  org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
  org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
  org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

log4x采用类似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 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)
%x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
%%: 输出一个”%”字符 %F: 输出日志消息产生时所在的文件名称
%L: 输出代码中的行号
%m: 输出代码中指定的消息,产生的日志具体信息
%n: 输出一个回车换行符,Windows平台为”\r\n”,Unix平台为”\n”输出日志信息换行 可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。

如:
1)%20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,默认的情况下右对齐。
2)%-20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,”-”号指定左对齐。
3)%.30c:指定输出category的名称,最大的宽度是30,如果category的名称大于30的话,就会将左边多出的字符截掉,但小于30的话也不会有空格。
4)%20.30c:如果category的名称小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边交远销出的字符截掉。

log4x支持三种方式来进行配置:xml、properties、代码

1、XML文件(如:log4j.xml)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
    <appender name="appender1"
        class="org.apache.log4j.RollingFileAppender">
        <param name="File" value="logfile08.html" />
        <param name="MaxFileSize" value="1MB" />
        <param name="MaxBackupIndex" value="5" />
        <layout class="org.apache.log4j.HTMLLayout">
        </layout>
    </appender>
    <root>
        <level value="debug" />
        <appender-ref ref="appender1" />
    </root>
</log4j:configuration>


2、properties文件(如:log4j.properties)

#定义3个输出端
log4j.rootCategory=INFO,A1,A2,A3

#定义A1输出到控制器
log4j.appender.A1=org.apache.log4j.ConsoleAppender
#定义A1的布局模式为PaternLayout
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
# 定义A1的输出格式
log4j.appender.A1.layout.ConversionPattern=%4p [%t] (%F:%L) - %m%n

#定义A2输出到文件
log4j.appender.A2=org.apache.log4j.RollingFileAppender
#定义A2输出到哪个文件
log4j.appender.A2.File=./log/sysLog.log
#定义A2输出文件的最大长度
log4j.appender.A2.MaxFileSize = 1KB
#定义A2的备份文件数
log4j.appender.A2.MaxBackupIndex = 3
#定义A2的布局模式为PatternLayout
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
#定义A2的输出模式
log4j.appender.A2.layout.ConversionPattern=%d{yyyy-MM-dd hh:mm:ss}:%p %t %c - %m%n

#定义A3输出到数据库
log4j.appender.A3=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.A3.URL=jdbc:mysql://localhost:3306/db_log4j
log4j.appender.A3.driver=com.mysql.jdbc.Driver
log4j.appender.A3.user=root
log4j.appender.A3.password=root
#定义A3的布局和执行的SQL语句
log4j.appender.A3.layout=org.apache.log4j.PatternLayout
log4j.appender.A3.layout.ConversionPattern=INSERT INTO tb_log(createDate,thread,level,class,message) values('%d','%t','%-5p','%c','%m')

 
3、代码
在程序中使用Log4j之前,首先要将commons-logging.jar和logging-log4j-1.2.9.jar导入到classpath中,并将log4j.properties放于src根目录中。 在类中使用log4j,首先声明一个静态变量

Logger logger=Logger.getLog("classname").现在就可以使用了。
用法如下:logger.debug("debug message")或者logger.info("info message").

(1)得到记录器
  使用Log4j,第一步就是获取日志记录器,这个记录器将负责控制日志信息。
其语法为:
  public static Logger getLogger( String name)
  通过指定的名字获得记录器,如果必要的话,则为这个名字创建一个新的记录器。Name一般取本类的名字,比如:
  static Logger logger = Logger.getLogger ( ServerWithLog4j.class.getName () )

(2)读取配置文件
  当获得了日志记录器之后,第二步将配置Log4j环境,其语法为:
  BasicConfigurator.configure (): 自动快速地使用缺省Log4j环境。
  PropertyConfigurator.configure ( String configFilename) :读取使用Java的特性文件编写的配置文件。
  DOMConfigurator.configure ( String filename ) :读取XML形式的配置文件。

(3)插入记录信息(格式化日志信息)
  当上两个必要步骤执行完毕,您就可以轻松地使用不同优先级别的日志记录语句插入到您想记录日志的任何地方,   Logger.debug ( Object message ) ;
   Logger.info ( Object message ) ;
   Logger.warn ( Object message ) ;
   Logger.error ( Object message ) ; ao.");

例子:

 package org.demo.log4j.dennisit;
 
 import java.io.IOException;
 import org.apache.commons.logging.impl.Log4JLogger;
 import org.apache.log4j.BasicConfigurator;
 import org.apache.log4j.FileAppender;
 import org.apache.log4j.Layout;
 import org.apache.log4j.Level;
 import org.apache.log4j.Logger;
 import org.apache.log4j.SimpleLayout;
 
 
 public class Log4jPrintByCode {
 
     private static Logger logger = Logger.getLogger(Log4jPrintByCode.class);
     
     private Layout layout = new SimpleLayout();
     private FileAppender fileAppender;
     
 
     //使用构造依赖,创建对象时初始化
     public Log4jPrintByCode(Layout layout, Level level,String distDir){
         
         BasicConfigurator.configure();        //使用默认的配置信息,不需要写log4j.properties
         
         try {
             init(layout,level, distDir);
         } catch (Exception e) {
             e.printStackTrace();
         }
         
     }
     
     public void init(Layout layout, Level level,String distDir) throws Exception{
         
         logger.setLevel(level);                //设置日志输出级别
         fileAppender = new FileAppender(layout,distDir,false);
         logger.addAppender(fileAppender);    //添加输出端
         
     }
     
     
     public static void main(String[] args) {
         
         SimpleLayout layout = new SimpleLayout();
         String logDir = "log4jcode.Log";
         Log4jPrintByCode log4jCode = new Log4jPrintByCode(layout,Level.INFO,logDir);
         
         
         //下面信息将被输出
         log4jCode.logger.info("log info print by log4j");
         log4jCode.logger.warn("log warn print by log4j");
         log4jCode.logger.error("log error print by log4j");
         
     }
 
 
     public Layout getLayout() {
         return layout;
     }
 
     public void setLayout(Layout layout) {
         this.layout = layout;
     }
 
     public FileAppender getFileAppender() {
         return fileAppender;
     }
 
     public void setFileAppender(FileAppender fileAppender) {
         this.fileAppender = fileAppender;
     }
 }
}
转载请注明出处:http://www.cnblogs.com/yuanyee
原文地址:https://www.cnblogs.com/yuanyee/p/2944184.html