• log4j组件的用法(log4j1)


    在实际的项目开发和维护中,日志是经常用到的一个内容。遇到问题的时候,经常需要通过日志去查出问题的所在并解决问题。

    通常我们会用:

    System.out.println(xxx);

    来打印运行中所需要的内容。但在日志非常多的情况下,或者在项目上线的情况下,这种方式就狠不实用了。总不能盯着控制台看日志吧?如果想看前段时间的日志呢?如果要大批的改变日志打印出的内容呢?如果想只看异常信息的日志呢?所以,要使用日志组件。

    Java中的日志组件有很多,如:Apache的log4j、commons-logging.jar,slf4j(slf4j做的是包装简化的工作,是把底层jdk中的日志等内容包装了)。jdk中也有日志,java.util.logging.Logger。目前在工作中接触的也就是log4j了。

    log4j是apache下的一个开源项目。官网: http://logging.apache.org/, 其中有Apache下各个编程语言的日志组件。log4j现在有2和1,现在用1版本的(2版本目前还是beta版),下载log4j,其中包含log4j的jar包。版本下载1最新的log4j-1.2.17.jar。下载后,解压,把log4j的jar包放入项目的lib下,就可以开始使用了。

    一、

    (1)在程序中写日志,如下:

     1 import org.apache.log4j.Logger;
     2 
     3 public class LoggerTest {
     4     private Logger log = Logger.getLogger(LoggerTest.class);//创建Logger对象,构造函数的参数写该类的class,表明是该类中的日志,日志中打印的信息中,类名也是这个
     5     
     6     public void add() {
     7         //1. 写日志
     8         log.debug("LoggerTest debug message");
     9         log.info("LoggerTest info message");
    10         log.warn("LoggerTest warn message");
    11         log.error("LoggerTest error message");
    12         log.fatal("LoggerTest fatal message");
    13         //log输出的规则: debug < info < warn < error < fatal
    14     }
    15 }

    log4j中的日志分五个级别,分别是debug、info、warn、error、fatal,它们的级别高低是:debug < info < warn < error < fatal。在配置文件中可以设置日志的输出级别,只有该级别的和高于该级别的日志才可以被看到。比如,在配置文件中设置的输出级别是warn,那么只有输出级别为warn、error、fatal的日志才会输出,debug和info的日志不会被输出。
    该例子中,当执行到log.xxx(xxx);方法的时候,日志就会按照配置文件中的设置输出。接下来看如何写配置文件。

    (2)写配置文件

    在源文件包中建一个名为log4j.properties的文件(文件名固定)。

    下载的log4j包中,example文件夹里是一些例子,可以参考其中的sort1.properties,sort2.properties...来写配置文件。

    官网上的Java Doc是log4j的API,供查询参考。

    ①先看一个基本的写法: 

    1 log4j.appender.A1=org.apache.log4j.ConsoleAppender 
    2 log4j.appender.A1.layout=org.apache.log4j.PatternLayout
    3 log4j.appender.A1.layout.ConversionPattern=(%d)[%m]--%l%n
    4 
    5 log4j.rootLogger=DEBUG,A1

    第一行:表示日志的输出方式。A1是我们自己起的名字。值是ConsoleAppender类的完全限定名。ConsoleAppender表示在控制台上输出。

    第二行:日志的输出形式

    第三行:输出的格式,其中的括号、中括号、横线,都是普通字符,为了显示的好看而已,没有其他含义。各个"%"+字母的含义如下:

    1 %m 输出代码中指定的消息
    2 %p 输出优先级, 即DEBUG, INFO, WARN, ERROR, FATAL
    3 %r 输出自应用启动到输出该log信息耗费的毫秒数
    4 %c 输出所属的类目, 通常就是所在类的全名
    5 %t 输出产生该日志事件的线程名
    6 %n 输出一个回车换行符, Windows平台为“/r/n” , Unix平台为“/n”
    7 %d 输出日志时间点的日期或时间, 默认格式为ISO8601, 也可以在其后指定格式, 比如: %d{yyy MMM dd
    8 HH:mm:ss , SSS}
    9 %l 输出日志事件的发生位置, 包括类目名、 发生的线程, 以及在代码中的行数。
    View Code

    %m:指我们在代码中写的输出日志的内容。%l输出的内容比较全,也通常是开发者要看的。例子:(%d)[%m]--%l%n输出的样子是:

    (2013-03-28 09:28:46,130)[LoggerTest debug message]--com.google.test.LoggerTest.add(LoggerTest.java:16)

    (2013-03-28 09:28:46,156)[LoggerTest info message]--com.google.test.LoggerTest.add(LoggerTest.java:16)

    (2013-03-28 09:28:46,256)[LoggerTest warn message]--com.google.test.LoggerTest.add(LoggerTest.java:16)

    (2013-03-28 09:28:46,316)[LoggerTest error message]--com.google.test.LoggerTest.add(LoggerTest.java:16)

    (2013-03-28 09:28:46,356)[LoggerTest fatal message]--com.google.test.LoggerTest.add(LoggerTest.java:16)

    第五行:rootLogger表示,src代码包下的所有包的日志级别,和使用的配置的名字。

    %m是log.debug等里面写的内容

    ②当项目部署到服务器上后,通常把日志存在文件中,便于查找问题时使用,写法如下:

    1 log4j.appender.fout=org.apache.log4j.FileAppender
    2 log4j.appender.fout.layout=org.apache.log4j.PatternLayout
    3 log4j.appender.fout.layout.ConversionPattern=[%p](%d)---%l--%m
    
    4 log4j.appender.fout.file=C:/logs/system.log
    5 log4j.rootLogger=DEBUG, fout

    第一行:使用FileAppender

    第四行:写上存放日志的路径。

        可以在log4j的apidoc中查看类FileAppender,file是FileAppender的属性,这一行我们给file属性赋值。

    ③上一种方法日积月累之后,日志文件会变的非常大,可能上G。查看这么大的log文本,实在是不方便。通常会按照日期存放日志。

    1 log4j.appender.fout=org.apache.log4j.DailyRollingFileAppender
    2 log4j.appender.fout.layout=org.apache.log4j.PatternLayout
    3 log4j.appender.fout.layout.ConversionPattern=[%p](%d)---%l--%m
    
    4 log4j.appender.fout.DatePattern='.'yyyy-MM-dd
    5 log4j.appender.fout.Threshold=INFO
    6 log4j.appender.fout.file=C:/logs/x.log

    第一行:使用DailyRollingFileAppender

    第四行:表示按照日来存放日志,到了第二天,第一天的日志名称就自动由"x.log"变成"x年-月-日.log"

    第五行:表示存到文件中的日志的级别。如果同时写的有:log4j.rootLogger=DEBUG, fout级别以第五行的为准

    该部分可以写多个,然后设置不同的log级别,这样不同级别的log就存放在不同的文件里了。

    ④日志也可以根据源文件的包来存放

    1 log4j.appender.fout=org.apache.log4j.DailyRollingFileAppender
    2 log4j.appender.fout.layout=org.apache.log4j.PatternLayout
    3 log4j.appender.fout.layout.ConversionPattern=[%p](%d)---%l--%m
    
    4 log4j.appender.fout.DatePattern='.' yyyy-MM-dd
    5 log4j.appender.fout.file=C:/logs/x.log
    6 
    7 log4j.logger.com.google=ERROR, fout 

    第七行:log4j.logger后面加上包名,表名这个包里的日志的输出设置是fout,级别是error 

    ⑤ 日志文件存放目录,设置相对路径:

    1 #全局日志文件存储路径
    2 filepath = /opt/logs/${weblogic.Name}
    3 
    4 log4j.appender.DAYFILE=org.apache.log4j.DailyRollingFileAppender
    5 log4j.appender.DAYFILE.file=${filepath}/nhupload
    6 log4j.appender.DAYFILE.DatePattern='-'yyyy-MM-dd'.log' 
    7 log4j.appender.DAYFILE.layout=org.apache.log4j.PatternLayout   
    8 log4j.appender.DAYFILE.layout.ConversionPattern=[%d{yy/MM/dd HH:mm:ss:SSS}][%C-%M] %m%n

    第2行:filepath设置日志存放的目录。使用“/”开头的路径,在windows系统里,表示:在服务启动所在磁盘的根目录。

    二、今天看了公司项目的日志,发现是在XML文件里配置的。看了一遍,会了用properties,这个XML就也能看懂,只是换了一种写法而已。

    在下载的log4j包中,有XML配置log4j的例子。这里附上一个项目里的例子log4j.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     debug="false">    
     5 
     6     <appender name="COMMON" class="org.apache.log4j.RollingFileAppender">
     7         <param name="File" value="log/common.log" />
     8         <param name="MaxFileSize" value="10MB" />
     9         <param name="MaxBackupIndex" value="5" />
    10         <param name="Append" value="true" />
    11         <layout class="org.apache.log4j.PatternLayout">
    12             <param name="ConversionPattern" value="%m%n" />
    13         </layout>
    14     </appender>
    15     <appender name="ASYNC-COMMON" class="org.apache.log4j.AsyncAppender">
    16         <param name="BufferSize" value="8192" />
    17         <appender-ref ref="COMMON" />
    18     </appender>
    19     <category name="google.common">
    20         <param name="additivity" value="false" />
    21         <priority value="ERROR" />
    22         <appender-ref ref="ASYNC-COMMON" />
    23     </category>
    24 
    25     <appender name="UNCATEGORIZED" class="org.apache.log4j.RollingFileAppender">
    26         <param name="File" value="log/uncategorized.log" />
    27         <param name="MaxFileSize" value="30MB" />
    28         <param name="MaxBackupIndex" value="5" />
    29         <param name="Append" value="true" />
    30         <layout class="org.apache.log4j.PatternLayout">
    31             <param name="ConversionPattern" value="%d %p [%c] - %m%n" />
    32         </layout>
    33     </appender>
    34     <appender name="ASYNC-UNCATEGORIZED" class="org.apache.log4j.AsyncAppender">
    35         <param name="BufferSize" value="8192" />
    36         <appender-ref ref="UNCATEGORIZED" />
    37     </appender>
    38     
    39     <appender name="console"  class="org.apache.log4j.ConsoleAppender">
    40           <param name="Threshold" value="ERROR"></param>
    41           <layout class="org.apache.log4j.PatternLayout">  
    42             <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %5p %c{1}:%L - %m%n"></param>  
    43         </layout>  
    44       </appender>
    45 
    46     <root>
    47         <level value="ERROR" />
    48         <appender-ref ref="ASYNC-UNCATEGORIZED" />
    49         <appender-ref ref="console" />
    50     </root>
    51 </log4j:configuration>
    View Code

    分段解释这个例子:

     1   <appender name="COMMON" class="org.apache.log4j.RollingFileAppender">
     2         <param name="File" value="log/common.log" />
     3         <param name="MaxFileSize" value="10MB" />
     4         <param name="MaxBackupIndex" value="5" />
     5         <param name="Append" value="true" />
     6         <layout class="org.apache.log4j.PatternLayout">
     7             <param name="ConversionPattern" value="%m%n" />
     8         </layout>
     9     </appender>
    10     <appender name="ASYNC-COMMON" class="org.apache.log4j.AsyncAppender">
    11         <param name="BufferSize" value="8192" />
    12         <appender-ref ref="COMMON" />
    13     </appender>
    14     <category name="google.common">
    15         <param name="additivity" value="false" />
    16         <priority value="ERROR" />
    17         <appender-ref ref="ASYNC-COMMON" />
    18     </category>

    <appender>对应properties文件的log4j.appender,对应org.apache.log4j.Appender接口

    行1:用的是RollingFileAppender(可以在log4j的apidoc中查看这些类和接口,<param>中的name是类的属性或者方法,value是我们给这些属性填的值)。API中:

    RollingFileAppender在当日志文件达到一定大小时,备份日志。

    File参数,对应log4j.appender.file

    MaxFileSize,日志文件的最大大小,当达到这个大小之后,会自动备份。备份的文件名后加上序号:.1,.2

    MaxBackupIndex,备份的最大索引,这里是5,即文件名最大的是:common.log.5

    <layout>对应log4j.appender.file.layout

    <param name="ConversionPattern" value="%m%n">对应log4j.appender.file.layout.ConversionPattern="%m%n"

    行10:org.apache.log4j.AsyncAppender,API中:

    AsyncAppender使日志异步。它收集事件发送,然后递送事件给绑定到AsyncAppender的appender,可以给AsyncAppender绑定多个appender,AsyncAppender会用单独的线程给在缓冲区中的事件服务。

    行11:BufferSize定义缓冲区的大小

    行12:<appender-ref />是绑定到这个AsyncAppender的appender的名字

    行14:<category /> API中:This class has been deprecated and replaced by the Logger subclass

      即这个标签已经过时了,被logger代替,相当于properties中的log4j.logger

      name属性值:项目中的包名。

      <priority />被level代替,表示日志的输出级别

      这一段相当于log4j.logger.google.common=ERROR,ASYNC-COMMON(ASYNC-COMMON的输出级别:ERROR)

     1   <appender name="UNCATEGORIZED" class="org.apache.log4j.RollingFileAppender">
     2         <param name="File" value="log/uncategorized.log" />
     3         <param name="MaxFileSize" value="30MB" />
     4         <param name="MaxBackupIndex" value="5" />
     5         <param name="Append" value="true" />
     6         <layout class="org.apache.log4j.PatternLayout">
     7             <param name="ConversionPattern" value="%d %p [%c] - %m%n" />
     8         </layout>
     9     </appender>
    10     <appender name="ASYNC-UNCATEGORIZED" class="org.apache.log4j.AsyncAppender">
    11         <param name="BufferSize" value="8192" />
    12         <appender-ref ref="UNCATEGORIZED" />
    13     </appender>
    14     
    15     <appender name="console"  class="org.apache.log4j.ConsoleAppender">
    16           <param name="Threshold" value="ERROR"></param>
    17           <layout class="org.apache.log4j.PatternLayout">  
    18             <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %5p %c{1}:%L - %m%n"></param>  
    19         </layout>  
    20       </appender>
    21 
    22     <root>
    23         <level value="ERROR" />
    24         <appender-ref ref="ASYNC-UNCATEGORIZED" />
    25         <appender-ref ref="console" />
    26     </root>

    行22:相当于log4j.rootLogger=ERROR, ASYNC-UNCATEGORIZED,console

    XML的写法说的比较繁琐,其实呢,这两种是相通的,只是写法不同。

  • 相关阅读:
    procmon ProcessMonitor,追踪软件权限的一般方法
    加入域的电脑,使用域管理员账号 无法访问指定设备路径
    odoo domain 的三种方法
    vmware 启动虚拟机蓝屏
    ruby gem修改国内镜像源
    Centos7无界面启动
    AjaxHelper简介
    C#的语句
    jQuery的工厂函数$()的妙用
    记录windwos10 rocketmq无法自动创建topic的问题
  • 原文地址:https://www.cnblogs.com/mySummer/p/4574178.html
Copyright © 2020-2023  润新知