首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

Struts-输出日记-使用log4j

2012-09-15 
Struts-输出日志-使用log4j1。什么是日志:  程序运行时,往特定输出文件或数据库里输出程序信息, 如:出错信

Struts-输出日志-使用log4j
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代码
<?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" 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 value="DEBUG"/> 
  <!-- 指定输出LOG内容的最高等级 --> 
  <param name="LevelMax" value="DEBUG"/> 
</filter> 
</appender> 
<!-- 输出通道"INFO",输出方式是:只输出INFO级别的LOG,并文件大小 
 
     到达指定大小时产生新的Log文件 --> 
<appender name="INFO" value="logs/info/info.log"/> 
<param name="Append" value="true"/> 
<param name="MaxFileSize" value="500KB"/> 
<param name="MaxBackupIndex" value="2"/> 
<layout value="INFO"/> 
  <param name="LevelMax"   value="INFO" /> 
</filter> 
</appender> 
<!-- 输出通道"WARN",输出方式是:只输出WARN级别的LOG,并文件 
 
     大小到达指定大小时产生新的Log文件 --> 
<appender name="WARN" value="logs/warn/warn.log"/> 
<param name="Append" value="true"/> 
<param name="MaxFileSize" value="500KB"/> 
<param name="MaxBackupIndex" value="2"/> 
<layout value="WARN"/> 
  <param name="LevelMax" value="WARN"/> 
</filter> 
</appender> 
<!-- 输出通道"ERROR",输出方式是:只输出ERROR级别的LOG,并文件 
 
     大小到达指定大小时产生新的Log文件 --> 
<appender name="ERROR" value="logs/error/error.log"/> 
<param name="Append" value="true"/> 
<param name="MaxFileSize" value="500KB"/> 
<param name="MaxBackupIndex" value="2"/> 
<layout value="ERROR"/> 
  <param name="LevelMax" value="ERROR"/> 
</filter> 
</appender> 
<!-- 输出通道"FATAL",输出方式是:只输出INFO级别的LOG,并文件大小 
 
     到达指定大小时产生新的Log文件 --> 
<appender name="FATAL" value="logs/fatal/fatal.log"/> 
<param name="Append" value="true"/> 
<param name="MaxFileSize" value="500KB"/> 
<param name="MaxBackupIndex" value="2"/> 
<layout value="FATAL"/> 
  <param name="LevelMax" value="FATAL"/> 
</filter> 
</appender> 
<!-- 输出通道"ALL",输出方式是:输出所有级别的LOG,并文件大小到达 
 
     指定大小时产生新的Log文件 --> 
<appender name="ALL" value="logs/all/all.log"/> 
<param name="Append" value="true"/> 
<param name="MaxFileSize" value="500KB"/> 
<param name="MaxBackupIndex" value="2"/> 
<layout value="DEBUG"/> 
  <param name="LevelMax" value="FATAL"/> 
</filter> 
</appender> 
<!-- 输出通道"EVERYDAY",输出方式是:输出所有级别的LOG,并每天一个 
 
     日志文件 --> 
<appender name="EVERYDAY" 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 value="DEBUG"/> 
  <param name="LevelMax" value="FATAL"/> 
</filter> 
</appender> 
 
<!-- 输出通道"DATABASE",输出方式是:输出所有级别的LOG到数据库 --> 
<appender name="DATABASE" 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 value="ERROR"/> 
   <param name="LevelMax" value="FATAL"/> 
  </filter> 
</appender> 
  
<!-- 输出通道"HTML",输出方式是:输出所有级别的LOG到数据库 --> 
<appender name="HTML" 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 value="TSD HP HTML LOG" /> 
</layout> 
<filter 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)
)

热点排行