使用log4j输出日志

1. 什么是日志:

程序运行时,往特定输出文件或数据库里输出程序信息,如出错信息,运行记录,调试记录等等。

日志[LOG]一般分为以下几种类型。

     FATAL:程序无法处理的大错误如硬件错误,程序被错误中断

     ERROR:异常(程序被错误中断)程序运行时出现的错误,程序员可以捕获处理

     WARN :警告(程序不会中断)程序不算出错,但以不推荐方式运行时输出。

     INFO:信息(程序不会中断)程序中有意输出的信息,如程序运行信息,程序开始、程序结束等。

     DEBUG:调试记录(程序不会中断)调试程序时,跟踪程序运行的输出信息。

2.  Log4J的使用。

     Log4J是为了输出日志的Java程序包,是Apached的一个子项目。可以把LOG输出到控制台,文件,或数据库

    可在http://logging.apache.org下载并免费使用。这个网址里有很多Log4程序包,他们分别是,

     log4c -- ANSI C 版          log4E    -- Eiffel 版

     log4j   -- Java版              log4net   -- .NET 版

     log4r  -- Ruby 版             log::Log4perl     -- Perl 版

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 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内容的具体定义-->

<layoutclass="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的数据 -->

<filterclass="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"/>

<layoutclass="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>

<filterclass="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"/>

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

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

</layout>

<filterclass="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"/>

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

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

</layout>

<filterclass="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"/>

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

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

</layout>

<filterclass="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"/>

-->

<layoutclass="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数据 -->

<filterclass="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?我建议是不要使用 -->

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

 <param name="Title" value="TSD HP HTML LOG" />

</layout>

<filterclass="org.apache.log4j.varia.LevelRangeFilter">

 <param name="LevelMin" value="DEBUG"/>

 <param name="LevelMax" value="FATAL"/>

</filter>

</appender>

 <!-- 设置域名限制,即com.tongshida域及以下的日志均输出到下面对应的通道中, 虽然下面<roo>的<priorityvalue="ERROR">设置成ERROR,但com.tongshida下面的程序中的LOG要输出level="DEBUG"的 DEBUG级别以上的LOG-->

<!--给客户交货时要把它屏蔽-->

<loggername="com.tongshida">

<!-- 设置com.tongshida以下函数输出LOG的级别 -->

<level value="DEBUG"/>

<!-- 好像是指定输出通道,因为下面root里指定了所以这里屏蔽掉了

<appender-ref ref="DEBUG"/>

-->

</logger>

 <root>

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

<priority value="ERROR"/>

<!-- 上边设置的输出通道,使用的在这里定义-->

<appender-refref="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-refref="EVERYDAY"/>

<appender-refref="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 NOTNULL PRIMARY KEY,

        LOGDATE            DATETIME,

        LOGTIME             TIMESTAMP,

        LOGTHREAD      VARCHAR(50),

        LOGLEVEL          VARCHAR(50),

        LOGCLASS         VARCHAR(50),

        LOGLOGGER      VARCHAR(200),

        LOGMESSAGE    VARCHAR(2000)

 )

http://seed.iteye.com/blog/174376

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
需求说明 (1)使用UserDaoImp1类的方法查找用户,并用User类的getUserInfo()方法输出用户信息 (2)使用一个不存在的用户名查找用户,使用try-catch对抛出的异常进行处理 实现思路及关键代码 (1)在测试类中调用UserDaoImp类的addUser(User user)方法,添加用户,然后用findUser(String uName)方法查找并输出用户信息 (2)在测试类中调用UserDaoImp1类的findUser(String uName)方法,使用不存在的用户名查找用户,并试图输出用户信息 (3)对抛出的异常使用try-catch进行异常处理。 实践二:使用try-catch-finally进行异常处理 需求说明 (1)对实践1的异常使用try-catch-finally进行异常处理 (2)在finally块输出是否抛出了异常 实现思路及关键代码 (1)在任务一中的代码上增加finally块 (2)为了判断在finally块输出是否抛出异常,可以设置一个变量,在catch块里修改这个变量 实践三:使用throw和throws 需求说明 修改UserDaoImpl类的updateUser(User user)方法,要求如果用户id被修改,则: (1)不执行更新 (2)抛出一个Exception异常 (3)异常消息是“用户id不能修改” 实现思路及关键代码 (1)修改UserDao类的updateUser(User user)方法,声明抛出异常 (2)修改UserDaoImpl类的updateUser(User user)方法,加入判断语句,并抛出异常 (3)在测试类中调用,并进行异常处理 实践四:使用log4j 需求说明 (1)使用log4j输出日志信息 (2)查看输出日志信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值