1。什么是日志:
  程序运行时,往特定输出文件或数据库里输出程序信息,
    如:出错信息,运行记录,调试记录,等等。
 
    日志(LOG)一般分为以下几种类型。
    FATAL:系统错误(大错误)(程序被错误中断)
           系统出现大错误时输出 (程序无法处理的大错误,如硬件错误)
    ERROR:异常(程序被错误中断)
           程序运行时出现的错误(程序员可以捕获处理)
    WARN :警告(程序不会中断)
           程序不算出错,但以不推荐方式运行时输出。
    INFO : 信息(程序不会中断)
           程序中有意输出的信息,如程序运行信息,
           如“程序开始”“程序结束”等。
    DEBUG: 调试记录(程序不会中断)
           调试程序时,跟踪程序运行的输出信息。
2.Log4J的使用。
    Log4J是为了输出日志的Java程序包,是Apached的一个子项目。
    可在http://logging.apache.org 下载并免费使用。
    可以把LOG输出到,控制台,文件,或数据库。
    这个网址里有很多Log4程序包,他们分别是,
    log4c          -- ANSI C 版
    log4E          -- Eiffel 版
    log::Log4perl  -- Perl 版
    log4net        -- .NET 版
    log4r          -- Ruby 版
    log4j          -- Java版
 
3.Log4J的能输出LOG的优先级。
级别高  OFF   关闭所有LOG
        FATAL 不可预想的无法继续运行程序的场合,一般是写进 syslog(
              系统日志),在应用程序中很难捕获。
        ERROR 出现异常,应用 程序停止运行等,需要紧急对应的程度的错误。
        WARN  警告,以 不建议的方式运行。
        INFO  信息,实际运行中最基本程度的信息,如,启动服务器,
              运行某某程序或方法,运行结束等。
        DEBUG 调试时输出的信息,有可能产生非常大量的LOG文件。
              如为解决问题而设置输出断点LOG等。DEBUG调试时输出的
              信息,所以投入运行时一般关闭DEBUG级别的LOG 。
       tracever log4j的 1.2.12 新加入比DEBUG还小的断点。
级别低 ALL    打开所有LOG
 
4.Struts使用Log4J。
    项目里的,[JavaSource]下做一个,log4j.xml或log4j.properties以后
    Struts就可以使用Log4J了,log4j.xml,log4j.properties是Log4J的
    设置文档。struts先读入log4j.xml,要是没有再读入log4j.properties。
    我认为log4j.xml更容易理解,而且可以做到赛选各种级别LOG后输出
   (log4j.properies无法赛选),所以只讲log4j.xml。
 
5.Log4j.xml设置方法。
 
Xml代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">  
  3. <log4j:configuration   xmlns:log4j='http://jakarta.apache.org/log4j/'>  
  4.   
  5. <!-- org.apache.log4j.ConsoleAppender (输出到控制台),  
  6.      org.apache.log4j.FileAppender    (输出到文件),  
  7.      org.apache.log4j.DailyRollingFileAppender  
  8.   
  9.                             (每天输出产生一个日志文件),  
  10.      org.apache.log4j.RollingFileAppender  
  11.   
  12.                (文件大小到达指定尺寸的时候产生一个新的文件),  
  13.   
  14.                 可通过 log4j.appender.R.MaxFileSize=100KB 设置文件  
  15.   
  16.                 大小,还可通过 log4j.appender.R.MaxBackupIndex=1  
  17.   
  18.                 设置为保存一个备份文件。  
  19.      org.apache.log4j.WriterAppender  
  20.   
  21.                (将日志信息以流格式发送到任意指定的地方) -->  
  22.    
  23. <!-- 输出通道"STDOUT",输出所有信息到控制台  
  24.   
  25.                (也就是System.out.println()) -->  
  26. <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">  
  27.  <!--org.apache.log4j.HTMLLayout    (以 HTML 表格形式布局),  
  28.   org.apache.log4j.PatternLayout (可以灵活地指定Log内容布局模式),  
  29.   org.apache.log4j.SimpleLayout  (包含日志信息的级别和信息字符串),  
  30.   org.apache.log4j.TTCCLayout     
  31.   
  32.                      (包含日志产生的时间、线程、类别等等信息) -->  
  33.  <!-- 输出自定义内容的LOG -->  
  34.  <layout   class="org.apache.log4j.PatternLayout">  
  35.   <!--  
  36.    %m 输出代码中指定的消息  
  37.    %p 输出优先级,即 DEBUG , INFO , WARN , ERROR , FATAL  
  38.    %r 输出自应用启动到输出该 log 信息耗费的毫秒数  
  39.    %c 输出打了Log的类名,%c{1}从类名开始输出一个,  
  40.   
  41.       例如com.tongshida.Action,{1}时只输出Action,  
  42.   
  43.           {2}输出 tongshida.Action  
  44.    %C 输出.Error()方法所在的类。  
  45.    %M 输出生成LOG的类当中的方法名称  
  46.    %t 输出产生该日志事件的线程名  
  47.    %n 输出一个回车换行符, Windows 平台为 “rn”,Unix 平台为 “n”  
  48.    %d 输出日志时间点的日期或时间,默认格式为 ISO8601 ,也可以在  
  49.   
  50.       其后指定格式,比如: %d{yyyy MMM dd HH:mm:ss,SSS} ,输出类似:  
  51.   
  52.       2002 年 10 月 18 日 22 : 10 : 28 , 921  
  53.    %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中  
  54.   
  55.       的行数。  
  56.    %[数值]p 输出的%p字符串长度小于[数值]时,补空格,默认右对齐,  
  57.   
  58.       前加-号,左对齐,这里也可以是%m等别的  
  59.    %.[数值]p输出的%p字符串长度大于[数值],后面切掉。  
  60.    %[数值].[数值]p 就是综合上两行。  
  61.    -->  
  62.   <!-- 输出时Log内容的具体定义 -->  
  63.   <param name="ConversionPattern"  
  64.   
  65.      value="[%d{yyyy-MM-dd HH:mm:ss,SSS}][%-20c{1}]★%-5p★%m%n"/>  
  66.  </layout>  
  67. </appender>  
  68.   
  69. <!-- 输出通道"DEBUG",输出方式是:只输出DEBUG级别的LOG,并文件  
  70.   
  71.       大小到达指定大小时产生新的Log文件 -->  
  72. <appender name="DEBUG" class="org.apache.log4j.RollingFileAppender">  
  73.  <!-- 输出Log文件的路径和文件名 -->  
  74.  <param name="File" value="logs/debug/debug.log"/>  
  75.  <!-- TOMCAT等WEB服务器重新启动时,是否插入到原有的LOG文件里,  
  76.   
  77.       true 插入false 新建 -->  
  78.  <param name="Append" value="true"/>  
  79.   
  80.  <!-- 只输出定义的级别以上的LOG,因为在下面过滤LOG信息所以屏蔽 -->  
  81.  <!-- param name="Threshold" value="info"/ -->  
  82.    
  83.  <!-- 因选择了RollingFileAppender了才有下面两个 MaxFileSize,  
  84.   
  85.       MaxBackupIndex 选项 -->  
  86.  <!-- MaxFileSize是一个LOG文件的最大的文件大小,当LOG文件超过这个  
  87.   
  88.       值时,自动转成 *.log.1的LOG文件 -->  
  89.  <param name="MaxFileSize" value="500KB"/>  
  90.  <!-- MaxBackupIndex生成自动转成 *.log.1的LOG文件的个数,设置3时最多  
  91.   
  92.       生成3个LOG备份文件,它们是[*.log.1][*.log.2][*.log.3] -->  
  93.  <param name="MaxBackupIndex" value="2"/>  
  94.  <!-- 输出时Log内容的具体定义 -->  
  95.  <layout class="org.apache.log4j.PatternLayout">  
  96.   <param name="ConversionPattern"  
  97.   
  98.         value="[%d{yyyy-MM-dd HH:mm:ss,SSS}][%-20c{1}]★%-5p★%m%n"/>  
  99.  </layout>  
  100.  <!-- 过滤输出时Log内容,在这里,LevelMin,LevelMax都定义了DEBUG,  
  101.   
  102.         所以只输出DEBUG级别LOG的数据 -->  
  103.  <filter class="org.apache.log4j.varia.LevelRangeFilter">  
  104.   <!-- 指定输出LOG内容的最低等级 -->  
  105.   <param name="LevelMin" value="DEBUG"/>  
  106.   <!-- 指定输出LOG内容的最高等级 -->  
  107.   <param name="LevelMax" value="DEBUG"/>  
  108.  </filter>  
  109. </appender>  
  110. <!-- 输出通道"INFO",输出方式是:只输出INFO级别的LOG,并文件大小  
  111.   
  112.      到达指定大小时产生新的Log文件 -->  
  113. <appender name="INFO" class="org.apache.log4j.RollingFileAppender">  
  114.  <param name="File" value="logs/info/info.log"/>  
  115.  <param name="Append" value="true"/>  
  116.  <param name="MaxFileSize" value="500KB"/>  
  117.  <param name="MaxBackupIndex" value="2"/>  
  118.  <layout class="org.apache.log4j.PatternLayout">  
  119.   <param name="ConversionPattern"  
  120.   
  121.       value="[%d{yyyy-MM-dd HH:mm:ss,SSS}][%-20c{1}]★%-5p★%m%n"/>  
  122.  </layout>  
  123.  <filter   class="org.apache.log4j.varia.LevelRangeFilter">  
  124.   <param name="LevelMin" value="INFO"/>  
  125.   <param name="LevelMax"   value="INFO" />  
  126.  </filter>  
  127. </appender>  
  128. <!-- 输出通道"WARN",输出方式是:只输出WARN级别的LOG,并文件  
  129.   
  130.      大小到达指定大小时产生新的Log文件 -->  
  131. <appender name="WARN" class="org.apache.log4j.RollingFileAppender">  
  132.  <param   name="File" value="logs/warn/warn.log"/>  
  133.  <param name="Append" value="true"/>  
  134.  <param name="MaxFileSize" value="500KB"/>  
  135.  <param name="MaxBackupIndex" value="2"/>  
  136.  <layout class="org.apache.log4j.PatternLayout">  
  137.   <param name="ConversionPattern"  
  138.   
  139.       value="[%d{yyyy-MM-dd HH:mm:ss,SSS}][%-20c{1}]★%-5p★%m%n"/>  
  140.  </layout>  
  141.  <filter class="org.apache.log4j.varia.LevelRangeFilter">  
  142.   <param name="LevelMin" value="WARN"/>  
  143.   <param name="LevelMax" value="WARN"/>  
  144.  </filter>  
  145. </appender>  
  146. <!-- 输出通道"ERROR",输出方式是:只输出ERROR级别的LOG,并文件  
  147.   
  148.      大小到达指定大小时产生新的Log文件 -->  
  149. <appender name="ERROR" class="org.apache.log4j.RollingFileAppender">  
  150.  <param name="File" value="logs/error/error.log"/>  
  151.  <param name="Append" value="true"/>  
  152.  <param name="MaxFileSize" value="500KB"/>  
  153.  <param name="MaxBackupIndex" value="2"/>  
  154.  <layout class="org.apache.log4j.PatternLayout">  
  155.   <param name="ConversionPattern"  
  156.   
  157.        value="[%d{yyyy-MM-dd HH:mm:ss,SSS}][%-20c{1}]★%-5p★%m%n"/>  
  158.  </layout>  
  159.  <filter class="org.apache.log4j.varia.LevelRangeFilter">  
  160.   <param name="LevelMin" value="ERROR"/>  
  161.   <param name="LevelMax" value="ERROR"/>  
  162.  </filter>  
  163. </appender>  
  164. <!-- 输出通道"FATAL",输出方式是:只输出INFO级别的LOG,并文件大小  
  165.   
  166.      到达指定大小时产生新的Log文件 -->  
  167. <appender name="FATAL" class="org.apache.log4j.RollingFileAppender">  
  168.  <param name="File" value="logs/fatal/fatal.log"/>  
  169.  <param name="Append" value="true"/>  
  170.  <param name="MaxFileSize" value="500KB"/>  
  171.  <param name="MaxBackupIndex" value="2"/>  
  172.  <layout class="org.apache.log4j.PatternLayout">  
  173.   <param name="ConversionPattern"  
  174.   
  175.        value="[%d{yyyy-MM-dd HH:mm:ss,SSS}][%-20c{1}]★%-5p★%m%n"/>  
  176.  </layout>  
  177.  <filter class="org.apache.log4j.varia.LevelRangeFilter">  
  178.   <param name="LevelMin" value="FATAL"/>  
  179.   <param name="LevelMax" value="FATAL"/>  
  180.  </filter>  
  181. </appender>  
  182. <!-- 输出通道"ALL",输出方式是:输出所有级别的LOG,并文件大小到达  
  183.   
  184.      指定大小时产生新的Log文件 -->  
  185. <appender name="ALL" class="org.apache.log4j.RollingFileAppender">  
  186.  <param name="File" value="logs/all/all.log"/>  
  187.  <param name="Append" value="true"/>  
  188.  <param name="MaxFileSize" value="500KB"/>  
  189.  <param name="MaxBackupIndex" value="2"/>  
  190.  <layout class="org.apache.log4j.PatternLayout">  
  191.   <param name="ConversionPattern"  
  192.   
  193.       value="[%d{yyyy-MM-dd HH:mm:ss,SSS}][%-20c{1}]★%-5p★%m%n"/>  
  194.  </layout>  
  195.  <filter class="org.apache.log4j.varia.LevelRangeFilter">  
  196.   <param name="LevelMin" value="DEBUG"/>  
  197.   <param name="LevelMax" value="FATAL"/>  
  198.  </filter>  
  199. </appender>  
  200. <!-- 输出通道"EVERYDAY",输出方式是:输出所有级别的LOG,并每天一个  
  201.   
  202.      日志文件 -->  
  203. <appender name="EVERYDAY" class="org.apache.log4j.DailyRollingFileAppender">  
  204.  <param name="File" value="logs/ereryday/ereryday.log"/>  
  205.  <param name="Append" value="true"/>  
  206.     <!-- param name="Threshold"   value="DEBUG"/ -->    
  207.  <!-- 以日为单位输出LOG文件,每日输出一个LOG文件-->  
  208.  <param name="DatePattern" value="'.'yyyy-MM-dd"/>  
  209.  <!-- 以时为单位输出LOG文件,每小时输出一个LOG文件  
  210.  <param name="DatePattern" value="'.'yyyy-MM-dd-HH"/>  
  211.  -->  
  212.  <layout class="org.apache.log4j.PatternLayout">  
  213.   <!-- The default pattern: Date Priority [Category] Message -->  
  214.   <param name="ConversionPattern"  
  215.   
  216.    value="[%d{yyyy-MM-dd HH:mm:ss,SSS}][%-20c{1}]★%-5p★%m%n"/>  
  217.   <!-- The full pattern: Date MS Priority [Category] (Thread:NDC)  
  218.   
  219.        Message <param name="ConversionPattern"  
  220.   
  221.        value="%d %-5r %-5p [%c] (%t:%x) %m%n"/>  
  222.   -->  
  223.  </layout>  
  224.  <!-- 过滤输出时Log内容,在这里,LevelMin是DEBUG,LevelMax都FATAL,  
  225.   
  226.       所以输出DEBUG级别到FATAL级别的LOG数据 -->   
  227.  <filter class="org.apache.log4j.varia.LevelRangeFilter">  
  228.   <param name="LevelMin" value="DEBUG"/>  
  229.   <param name="LevelMax" value="FATAL"/>  
  230.  </filter>  
  231. </appender>  
  232.   
  233. <!-- 输出通道"DATABASE",输出方式是:输出所有级别的LOG到数据库 -->  
  234. <appender name="DATABASE" class="org.apache.log4j.jdbc.JDBCAppender">  
  235.         <!--数据库的驱动,这里用的是MSSQL-->  
  236.         <param name="driver" value="com.microsoft.jdbc.sqlserver.SQLServerDriver"/>  
  237.   <!--这是Oracle用的驱动,在这里用MSSQL所以屏蔽掉了  
  238.      <param name="driver" value="oracle.jdbc.driver.OracleDriver" />  
  239.   -->  
  240.         <!--要连接的数据库-->  
  241.         <param name="URL"   
  242.   
  243.                   value="jdbc:microsoft:sqlserver://192.168.0.120:  
  244.   
  245.                   1433;DatabaseName=test/>  
  246.        <!--连接数据库的用户名-->  
  247.         <param name="user" value="sa" />  
  248.       <!--连接数据库的密码-->    
  249.         <param name="password" value="sa" />  
  250.       <!--向MSSQL数据库表LOG中插入数据的sql语句-->  
  251.         <param name="sql" value=" INSERT INTO LOG  
  252.   
  253.            (LOGDATE,LOGLEVEL,LOGCLASS,LOGLOGGER,LOGMESSAGE)  
  254.   
  255.            values ('%d{yyyy-MM-dd HH:mm:ss}','%.50p', '%.50c',  
  256.   
  257.                    '%.50l', '%.1000m')"/>  
  258.   
  259.    
  260.   
  261.   <!-- Oracle 的 insert 语句  
  262.         <param name="sql" value=" insert into logrecord  
  263.   
  264.        (id,packageid,userid,syscodeid,info,logtime,loglevel)  
  265.   
  266.        values(?,?,?,?,?,to_date('%d{yyyy-MM-dd HH:mm:ss}',  
  267.   
  268.        'yyyy-MM-dd HH24:mi:ss'),'%p')" />  
  269.   -->  
  270.   <!-- 过滤输出时Log内容,在这里,LevelMin是ERROR,LevelMax都  
  271.   
  272.        FATAL,所以输出DEBUG级别到FATAL级别的LOG数据 -->   
  273.   <filter class="org.apache.log4j.varia.LevelRangeFilter">  
  274.    <param name="LevelMin" value="ERROR"/>  
  275.    <param name="LevelMax" value="FATAL"/>  
  276.   </filter>  
  277.  </appender>  
  278.    
  279. <!-- 输出通道"HTML",输出方式是:输出所有级别的LOG到数据库 -->  
  280. <appender name="HTML" class="org.apache.log4j.RollingFileAppender">  
  281.    
  282.  <param name="File" value="logs/html/htmllog.html" />  
  283.  <param name="Append" value="true" />  
  284.    
  285.  <!-- 只输出定义的级别以上的LOG,因为在下面过滤LOG信息所以屏蔽 -->  
  286.  <!-- param name="Threshold" value="info"/ -->  
  287.  <param name="MaxFileSize" value="50KB"/>  
  288.  <param name="MaxBackupIndex" value="2"/>  
  289.  <!-- 好像现在只有固定输出格式 -->   
  290.  <!-- 输出的HTML都缺少</table></body>等代码,log4j的Bug?  
  291.   
  292.       我建议是不要使用 -->    
  293.  <layout class="org.apache.log4j.HTMLLayout">  
  294.   <param name="Title" value="TSD HP HTML LOG" />  
  295.  </layout>  
  296.  <filter class="org.apache.log4j.varia.LevelRangeFilter">  
  297.   <param name="LevelMin" value="DEBUG"/>  
  298.   <param name="LevelMax" value="FATAL"/>  
  299.  </filter>   
  300. </appender>  
  301.   
  302. <!-- 设置域名限制,即com.tongshida域及以下的日志均输出到下面  
  303.   
  304.      对应的通道中, 虽然下面<roo><priority value="ERROR">设置  
  305.   
  306.      成ERROR,但com.tongshida下面的程序中的LOG要输出  
  307.   
  308.      level="DEBUG"的 DEBUG级别以上的LOG-->  
  309. <!--给客户交货时要把它屏蔽-->  
  310. <logger name="com.tongshida">  
  311.  <!-- 设置com.tongshida以下函数输出LOG的级别 -->  
  312.  <level value="DEBUG"/>  
  313.  <!-- 好像是指定输出通道,因为下面root里指定了所以这里屏蔽掉了  
  314.  <appender-ref ref="DEBUG"/>  
  315.  -->  
  316. </logger>  
  317.   
  318. <root>  
  319.  <!-- 设置输出范围,在这里光输出ERROR以上的,ERROR级别,  
  320.   
  321.       FATAL级别的LOG -->  
  322.  <priority value="ERROR"/>  
  323.  <!-- 上边设置的输出通道,使用的在这里定义 -->  
  324.  <appender-ref ref="STDOUT"/>  
  325.  <appender-ref ref="DEBUG"/>  
  326.  <appender-ref ref="INFO"/>  
  327.  <appender-ref ref="WARN"/>  
  328.  <appender-ref ref="ERROR"/>  
  329.  <appender-ref ref="FATAL"/>  
  330.  <appender-ref ref="ALL"/>  
  331.  <appender-ref ref="EVERYDAY"/>  
  332.  <appender-ref ref="DATABASE"/>  
  333.  <appender-ref ref="HTML"/>  
  334.   
  335. </root>  
  336. </log4j:configuration>  
  337.   
  338.    
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration   xmlns:log4j='http://jakarta.apache.org/log4j/'>

<!-- org.apache.log4j.ConsoleAppender (输出到控制台),
     org.apache.log4j.FileAppender    (输出到文件),
     org.apache.log4j.DailyRollingFileAppender

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

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

                可通过 log4j.appender.R.MaxFileSize=100KB 设置文件

                大小,还可通过 log4j.appender.R.MaxBackupIndex=1

                设置为保存一个备份文件。
     org.apache.log4j.WriterAppender

               (将日志信息以流格式发送到任意指定的地方) -->
 
<!-- 输出通道"STDOUT",输出所有信息到控制台

               (也就是System.out.println()) -->
<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
 <!--org.apache.log4j.HTMLLayout    (以 HTML 表格形式布局),
  org.apache.log4j.PatternLayout (可以灵活地指定Log内容布局模式),
  org.apache.log4j.SimpleLayout  (包含日志信息的级别和信息字符串),
  org.apache.log4j.TTCCLayout   

                     (包含日志产生的时间、线程、类别等等信息) -->
 <!-- 输出自定义内容的LOG -->
 <layout   class="org.apache.log4j.PatternLayout">
  <!--
   %m 输出代码中指定的消息
   %p 输出优先级,即 DEBUG , INFO , WARN , ERROR , FATAL
   %r 输出自应用启动到输出该 log 信息耗费的毫秒数
   %c 输出打了Log的类名,%c{1}从类名开始输出一个,

      例如com.tongshida.Action,{1}时只输出Action,

          {2}输出 tongshida.Action
   %C 输出.Error()方法所在的类。
   %M 输出生成LOG的类当中的方法名称
   %t 输出产生该日志事件的线程名
   %n 输出一个回车换行符, Windows 平台为 “rn”,Unix 平台为 “n”
   %d 输出日志时间点的日期或时间,默认格式为 ISO8601 ,也可以在

      其后指定格式,比如: %d{yyyy MMM dd HH:mm:ss,SSS} ,输出类似:

      2002 年 10 月 18 日 22 : 10 : 28 , 921
   %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中

      的行数。
   %[数值]p 输出的%p字符串长度小于[数值]时,补空格,默认右对齐,

      前加-号,左对齐,这里也可以是%m等别的
   %.[数值]p输出的%p字符串长度大于[数值],后面切掉。
   %[数值].[数值]p 就是综合上两行。
   -->
  <!-- 输出时Log内容的具体定义 -->
  <param name="ConversionPattern"

     value="[%d{yyyy-MM-dd HH:mm:ss,SSS}][%-20c{1}]★%-5p★%m%n"/>
 </layout>
</appender>

<!-- 输出通道"DEBUG",输出方式是:只输出DEBUG级别的LOG,并文件

      大小到达指定大小时产生新的Log文件 -->
<appender name="DEBUG" class="org.apache.log4j.RollingFileAppender">
 <!-- 输出Log文件的路径和文件名 -->
 <param name="File" value="logs/debug/debug.log"/>
 <!-- TOMCAT等WEB服务器重新启动时,是否插入到原有的LOG文件里,

      true 插入false 新建 -->
 <param name="Append" value="true"/>

 <!-- 只输出定义的级别以上的LOG,因为在下面过滤LOG信息所以屏蔽 -->
 <!-- param name="Threshold" value="info"/ -->
 
 <!-- 因选择了RollingFileAppender了才有下面两个 MaxFileSize,

      MaxBackupIndex 选项 -->
 <!-- MaxFileSize是一个LOG文件的最大的文件大小,当LOG文件超过这个

      值时,自动转成 *.log.1的LOG文件 -->
 <param name="MaxFileSize" value="500KB"/>
 <!-- MaxBackupIndex生成自动转成 *.log.1的LOG文件的个数,设置3时最多

      生成3个LOG备份文件,它们是[*.log.1][*.log.2][*.log.3] -->
 <param name="MaxBackupIndex" value="2"/>
 <!-- 输出时Log内容的具体定义 -->
 <layout class="org.apache.log4j.PatternLayout">
  <param name="ConversionPattern"

        value="[%d{yyyy-MM-dd HH:mm:ss,SSS}][%-20c{1}]★%-5p★%m%n"/>
 </layout>
 <!-- 过滤输出时Log内容,在这里,LevelMin,LevelMax都定义了DEBUG,

        所以只输出DEBUG级别LOG的数据 -->
 <filter class="org.apache.log4j.varia.LevelRangeFilter">
  <!-- 指定输出LOG内容的最低等级 -->
  <param name="LevelMin" value="DEBUG"/>
  <!-- 指定输出LOG内容的最高等级 -->
  <param name="LevelMax" value="DEBUG"/>
 </filter>
</appender>
<!-- 输出通道"INFO",输出方式是:只输出INFO级别的LOG,并文件大小

     到达指定大小时产生新的Log文件 -->
<appender name="INFO" class="org.apache.log4j.RollingFileAppender">
 <param name="File" value="logs/info/info.log"/>
 <param name="Append" value="true"/>
 <param name="MaxFileSize" value="500KB"/>
 <param name="MaxBackupIndex" value="2"/>
 <layout class="org.apache.log4j.PatternLayout">
  <param name="ConversionPattern"

      value="[%d{yyyy-MM-dd HH:mm:ss,SSS}][%-20c{1}]★%-5p★%m%n"/>
 </layout>
 <filter   class="org.apache.log4j.varia.LevelRangeFilter">
  <param name="LevelMin" value="INFO"/>
  <param name="LevelMax"   value="INFO" />
 </filter>
</appender>
<!-- 输出通道"WARN",输出方式是:只输出WARN级别的LOG,并文件

     大小到达指定大小时产生新的Log文件 -->
<appender name="WARN" class="org.apache.log4j.RollingFileAppender">
 <param   name="File" value="logs/warn/warn.log"/>
 <param name="Append" value="true"/>
 <param name="MaxFileSize" value="500KB"/>
 <param name="MaxBackupIndex" value="2"/>
 <layout class="org.apache.log4j.PatternLayout">
  <param name="ConversionPattern"

      value="[%d{yyyy-MM-dd HH:mm:ss,SSS}][%-20c{1}]★%-5p★%m%n"/>
 </layout>
 <filter class="org.apache.log4j.varia.LevelRangeFilter">
  <param name="LevelMin" value="WARN"/>
  <param name="LevelMax" value="WARN"/>
 </filter>
</appender>
<!-- 输出通道"ERROR",输出方式是:只输出ERROR级别的LOG,并文件

     大小到达指定大小时产生新的Log文件 -->
<appender name="ERROR" class="org.apache.log4j.RollingFileAppender">
 <param name="File" value="logs/error/error.log"/>
 <param name="Append" value="true"/>
 <param name="MaxFileSize" value="500KB"/>
 <param name="MaxBackupIndex" value="2"/>
 <layout class="org.apache.log4j.PatternLayout">
  <param name="ConversionPattern"

       value="[%d{yyyy-MM-dd HH:mm:ss,SSS}][%-20c{1}]★%-5p★%m%n"/>
 </layout>
 <filter class="org.apache.log4j.varia.LevelRangeFilter">
  <param name="LevelMin" value="ERROR"/>
  <param name="LevelMax" value="ERROR"/>
 </filter>
</appender>
<!-- 输出通道"FATAL",输出方式是:只输出INFO级别的LOG,并文件大小

     到达指定大小时产生新的Log文件 -->
<appender name="FATAL" class="org.apache.log4j.RollingFileAppender">
 <param name="File" value="logs/fatal/fatal.log"/>
 <param name="Append" value="true"/>
 <param name="MaxFileSize" value="500KB"/>
 <param name="MaxBackupIndex" value="2"/>
 <layout class="org.apache.log4j.PatternLayout">
  <param name="ConversionPattern"

       value="[%d{yyyy-MM-dd HH:mm:ss,SSS}][%-20c{1}]★%-5p★%m%n"/>
 </layout>
 <filter class="org.apache.log4j.varia.LevelRangeFilter">
  <param name="LevelMin" value="FATAL"/>
  <param name="LevelMax" value="FATAL"/>
 </filter>
</appender>
<!-- 输出通道"ALL",输出方式是:输出所有级别的LOG,并文件大小到达

     指定大小时产生新的Log文件 -->
<appender name="ALL" class="org.apache.log4j.RollingFileAppender">
 <param name="File" value="logs/all/all.log"/>
 <param name="Append" value="true"/>
 <param name="MaxFileSize" value="500KB"/>
 <param name="MaxBackupIndex" value="2"/>
 <layout class="org.apache.log4j.PatternLayout">
  <param name="ConversionPattern"

      value="[%d{yyyy-MM-dd HH:mm:ss,SSS}][%-20c{1}]★%-5p★%m%n"/>
 </layout>
 <filter class="org.apache.log4j.varia.LevelRangeFilter">
  <param name="LevelMin" value="DEBUG"/>
  <param name="LevelMax" value="FATAL"/>
 </filter>
</appender>
<!-- 输出通道"EVERYDAY",输出方式是:输出所有级别的LOG,并每天一个

     日志文件 -->
<appender name="EVERYDAY" class="org.apache.log4j.DailyRollingFileAppender">
 <param name="File" value="logs/ereryday/ereryday.log"/>
 <param name="Append" value="true"/>
    <!-- param name="Threshold"   value="DEBUG"/ -->  
 <!-- 以日为单位输出LOG文件,每日输出一个LOG文件-->
 <param name="DatePattern" value="'.'yyyy-MM-dd"/>
 <!-- 以时为单位输出LOG文件,每小时输出一个LOG文件
 <param name="DatePattern" value="'.'yyyy-MM-dd-HH"/>
 -->
 <layout class="org.apache.log4j.PatternLayout">
  <!-- The default pattern: Date Priority [Category] Message -->
  <param name="ConversionPattern"

   value="[%d{yyyy-MM-dd HH:mm:ss,SSS}][%-20c{1}]★%-5p★%m%n"/>
  <!-- The full pattern: Date MS Priority [Category] (Thread:NDC)

       Message <param name="ConversionPattern"

       value="%d %-5r %-5p [%c] (%t:%x) %m%n"/>
  -->
 </layout>
 <!-- 过滤输出时Log内容,在这里,LevelMin是DEBUG,LevelMax都FATAL,

      所以输出DEBUG级别到FATAL级别的LOG数据 --> 
 <filter class="org.apache.log4j.varia.LevelRangeFilter">
  <param name="LevelMin" value="DEBUG"/>
  <param name="LevelMax" value="FATAL"/>
 </filter>
</appender>

<!-- 输出通道"DATABASE",输出方式是:输出所有级别的LOG到数据库 -->
<appender name="DATABASE" class="org.apache.log4j.jdbc.JDBCAppender">
        <!--数据库的驱动,这里用的是MSSQL-->
        <param name="driver" value="com.microsoft.jdbc.sqlserver.SQLServerDriver"/>
  <!--这是Oracle用的驱动,在这里用MSSQL所以屏蔽掉了
     <param name="driver" value="oracle.jdbc.driver.OracleDriver" />
  -->
        <!--要连接的数据库-->
        <param name="URL" 

                  value="jdbc:microsoft:sqlserver://192.168.0.120:

                  1433;DatabaseName=test" />
       <!--连接数据库的用户名-->
        <param name="user" value="sa" />
      <!--连接数据库的密码-->  
        <param name="password" value="sa" />
      <!--向MSSQL数据库表LOG中插入数据的sql语句-->
        <param name="sql" value=" INSERT INTO LOG

           (LOGDATE,LOGLEVEL,LOGCLASS,LOGLOGGER,LOGMESSAGE)

           values ('%d{yyyy-MM-dd HH:mm:ss}','%.50p', '%.50c',

                   '%.50l', '%.1000m')"/>

 

  <!-- Oracle 的 insert 语句
        <param name="sql" value=" insert into logrecord

       (id,packageid,userid,syscodeid,info,logtime,loglevel)

       values(?,?,?,?,?,to_date('%d{yyyy-MM-dd HH:mm:ss}',

       'yyyy-MM-dd HH24:mi:ss'),'%p')" />
  -->
  <!-- 过滤输出时Log内容,在这里,LevelMin是ERROR,LevelMax都

       FATAL,所以输出DEBUG级别到FATAL级别的LOG数据 --> 
  <filter class="org.apache.log4j.varia.LevelRangeFilter">
   <param name="LevelMin" value="ERROR"/>
   <param name="LevelMax" value="FATAL"/>
  </filter>
 </appender>
 
<!-- 输出通道"HTML",输出方式是:输出所有级别的LOG到数据库 -->
<appender name="HTML" class="org.apache.log4j.RollingFileAppender">
 
 <param name="File" value="logs/html/htmllog.html" />
 <param name="Append" value="true" />
 
 <!-- 只输出定义的级别以上的LOG,因为在下面过滤LOG信息所以屏蔽 -->
 <!-- param name="Threshold" value="info"/ -->
 <param name="MaxFileSize" value="50KB"/>
 <param name="MaxBackupIndex" value="2"/>
 <!-- 好像现在只有固定输出格式 --> 
 <!-- 输出的HTML都缺少</table></body>等代码,log4j的Bug?

      我建议是不要使用 -->  
 <layout class="org.apache.log4j.HTMLLayout">
  <param name="Title" value="TSD HP HTML LOG" />
 </layout>
 <filter class="org.apache.log4j.varia.LevelRangeFilter">
  <param name="LevelMin" value="DEBUG"/>
  <param name="LevelMax" value="FATAL"/>
 </filter> 
</appender>

<!-- 设置域名限制,即com.tongshida域及以下的日志均输出到下面

     对应的通道中, 虽然下面<roo>的<priority value="ERROR">设置

     成ERROR,但com.tongshida下面的程序中的LOG要输出

     level="DEBUG"的 DEBUG级别以上的LOG-->
<!--给客户交货时要把它屏蔽-->
<logger name="com.tongshida">
 <!-- 设置com.tongshida以下函数输出LOG的级别 -->
 <level value="DEBUG"/>
 <!-- 好像是指定输出通道,因为下面root里指定了所以这里屏蔽掉了
 <appender-ref ref="DEBUG"/>
 -->
</logger>

<root>
 <!-- 设置输出范围,在这里光输出ERROR以上的,ERROR级别,

      FATAL级别的LOG -->
 <priority value="ERROR"/>
 <!-- 上边设置的输出通道,使用的在这里定义 -->
 <appender-ref ref="STDOUT"/>
 <appender-ref ref="DEBUG"/>
 <appender-ref ref="INFO"/>
 <appender-ref ref="WARN"/>
 <appender-ref ref="ERROR"/>
 <appender-ref ref="FATAL"/>
 <appender-ref ref="ALL"/>
 <appender-ref ref="EVERYDAY"/>
 <appender-ref ref="DATABASE"/>
 <appender-ref ref="HTML"/>

</root>
</log4j:configuration>

 
 

6.Log4j在Java程序里的使用。

  Logger log = Logger.getLogger(inputClass);

  //输出到数据库时有"'"会出错所以把它换成全角
  String outmessage = message.replaceAll("'", "’");
  log.debug(outmessage);log.error(outmessage);log.warn(outmessage);

  如想要动态输出LOG(更改输出目录和文件名),也就是强制改变读到

  内存中的[Log4j.xml]里的相应输出目录和文件名。鉴于篇幅没能写下。

 

7.MSSQL_log_table_Creater.sql

CREATE TABLE [LOG] (

        ID                 INTEGER NOT NULL PRIMARY KEY,

        LOGDATE            DATETIME,

        LOGTIME            TIMESTAMP,

        LOGTHREAD          VARCHAR(50),

        LOGLEVEL           VARCHAR(50),

        LOGCLASS           VARCHAR(50),

        LOGLOGGER          VARCHAR(200),

        LOGMESSAGE         VARCHAR(2000)

)