log4j  入门. 详解

转自雪飘寒的文章

1. Log4j  简介

在应用程序中添加日志记录总的来说基于三 个目的:
    监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析工作;
    跟踪代码运行时轨迹,作为日后审计的依据;
    担当集成开发环境中的调试器的作用,向文件或控制台打印代码的调试信息。

最普通的做法就是在代码中嵌入许多的打印语句,这些打印语句可以输出到控制台或文件中,比较好的做法就是构造一个日志操作类来封装此类操作,而不是让一系列的打印语句充斥了代码的主体。在强调可重用组件开发的今天,除了自己从头到尾开发一个可重用的日志操作类外,Apache 为我们提供了一个强有力的日志操作包 Log4j。

官方站点:http://logging.apache.org/log4j/

Log4j 是 Apache 的一个开放源代码项目, 通过使用 Log4j, 我们可以控制日志信息输送的目的地是控制台、文件、GUI 组件、甚至是套接口服务器、NT 的事件记录器、UNIX Syslog 守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就 是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。此外,通过Log4j 其他语言接口,您可以在 C、C+ +、.Net、PL/SQL 程序中使用 Log4j,其语法和用法与在 Java 程序中一样, 使得多语言分布式系统得到一个统一一致的日志组件模块。 而且, 通过使用各种第三方扩展,您可以很方便地将 Log4j 集成到 J2EE、JINI 甚至是 SNMP 应用中。

2.下载与使用
  2.1下载 log4j 的 的 jar  文件
     下载地址:http://logging.apache.org/log4j/1.2/download.html

2.2 编写一个测试类
        
package test;
        
        import org.apache.log4j.Logger;
        
        public class HelloLog4j {

private static Logger logger = Logger.getLogger(HelloLog4j.class);
    
        public static void main(String[] args) {
    
            //  记录debug 级别的信息
                logger.debug("This is debug message.");
                //  记录info 级别的信息
                logger.info("This is info message.");
                //  记录error 级别的信息
                logger.error("This is error message.");
            }
        }

2.3  编写配置文件
    在类路径下(src 文件夹下)创建 log4j.properties 文件,配置文件 log4j.properties 内容如下:

log4j.rootLogger=debug,appender1
    log4j.appender.appender1=org.apache.log4j.ConsoleAppender
    log4j.appender.appender1.layout=org.apache.log4j.TTCCLayout
    
    2.4  输出结果
    [main] DEBUG com.coderdream.log4j.HelloLog4j - This is debug message.
    [main] INFO com.coderdream.log4j.HelloLog4j - This is info message.
    [main] ERROR com.coderdream.log4j.HelloLog4j - This is error message.

3. Log4j  构成
    
    通过配置文件可知,我们需要配置 3 个方面的内容:
    1.根目录(级别和目的地) ;
    2.目的地(控制台、文件等等) ;
    3.输出样式
    
    Logger - 日志写出器,供程序员输出日志信息
    Appender - 日志目的地,把格式化好的日志信息输出到指定的地方去
    ConsoleAppender - 目的地为控制台的 Appender
    FileAppender - 目的地为文件的 Appender
    RollingFileAppender - 目的地为大小受限的文件的 Appender
    Layout - 日志格式化器,用来把程序员的 logging request 格式化成字符串
    PatternLayout - 用指定的 pattern 格式化 logging request 的 Layout

4. Log4j  使用方法
    
    Log4j 由三个重要的组件构成:日志信息的优先级,日志信息的输出目的地,日志信息的输出格式。日志信息的优先级从高到低有 ERROR、WARN、 INFO、DEBUG,分别用来指定这条日志信息的重要程度;日志信息的输出目的地指定了日志将打印到控制台还是文件中;而输出格式则控制了日志信息的显示内容。

4.1 properties  配置文件 详解

其实您也可以完全不使用配置文件,而是在代码中配置 Log4j 环境。但是,使用配置文件将使您的应用程序更加灵活。Log4j 支持两种配置文件格式,Log4j 支持两种配置文件格式,一种是 XML 格式的文件,一种是 properties(key=value)文件。下面我们介绍使用 properties 文件做为配置文件的方法:
    根配置根 Logger ,其语法为:

log4j.rootLogger = level,appenderName1,appenderName2,

其中,level 是日志记录的优先级,分为 OFF.FATAL.ERROR.WARN.INFO.DEBUG.ALL 或者您定义的级别。Log4j 建议只使用四个级别,优先级从高到低分别是 ERROR、WARN、INFO、DEBUG。通过在这里定义的 级别,您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定义了 INFO 级别,则应用程序中所有DEBUG 级别的日志信息将不被打印出来。 appenderName 就是指 B 日志信息输出到哪个地方。 您可以同时指定多个输出目的地。优先级:ALL < DEBUG < INFO <WARN < ERROR < FATAL < OFF

配置日志信息输出目的地 Appender ,其语法为:
    log4j.appender.appenderName = Log4j  提供的 appender  类
    log4j.appender.appenderName.属性名 = 属性值
    ..
    log4j.appender.appenderName.属性名 = 属性值

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

1) ConsoleAppender  选项
       Threshold=WARN:指定日志消息的输出最低层次。
       ImmediateFlush=true:默认值是 true,意谓着所有的消息都会被立即输出。
       Target=System.err:默认情况下是:System.out,指定输出控制台

2) FileAppender  选项
        Threshold=WARN:指定日志消息的输出最低层次。
        ImmediateFlush=true:默认值是 true,意谓着所有的消息都会被立即输出。
        File=mylog.txt:指定消息输出到 mylog.txt 文件。
        Append=false:默认值是 true,即将消息增加到指定文件中,false 指将消息覆盖指定的文件内容。

3) DailyRollingFileAppender  选项
        Threshold=WARN:指定日志消息的输出最低层次。
        ImmediateFlush=true:默认值是 true,意谓着所有的消息都会被立即输出。
        File=mylog.txt:指定消息输出到 mylog.txt 文件。
        Append=false:默认值是 true,即将消息增加到指定文件中,false 指将消息覆盖指定的文件内容。
        DatePattern=''.''yyyy-ww:每周滚动一次文件,即每周产生一个新的文件。

当然也可以指定按月、周、天、时和分。即对应的格式如下:
        1)''.''yyyy-MM: 每月
        2)''.''yyyy-ww: 每周
        3)''.''yyyy-MM-dd: 每天
        4)''.''yyyy-MM-dd-a: 每天两次
        5)''.''yyyy-MM-dd-HH: 每小时
        6)''.''yyyy-MM-dd-HH-mm: 每分钟

举例:

log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.file=log4j.log
log4j.appender.file.DatePattern='.'yyyy-MM-dd
log4j.appender.file.layout=org.apache.log4j.PatternLayout
#log4j.appender.file.layout.ConversionPattern=[%-5p] [%t] %C{1}.%M(%L) %-d{yyyy-MM-dd HH:mm:ss} | %m%n
log4j.appender.file.layout.ConversionPattern= %-d{yyyy-MM-dd HH:mm:ss.SSS}, [%-5p], [%-16t], %C.%M(%L), | %m%n

4) RollingFileAppender  选项
        Threshold=WARN:指定日志消息的输出最低层次。
        ImmediateFlush=true:默认值是 true,意谓着所有的消息都会被立即输出。
        File=mylog.txt:指定消息输出到 mylog.txt 文件。
        Append=false:默认值是 true,即将消息增加到指定文件中,false 指将消息覆盖指定的文件内容。
        MaxFileSize=100KB: 后缀可以是 KB, MB 或者是 GB. 在日志文件到达该大小时,将会自动滚动,
        即将原来的内容移到 mylog.log.1 文件。
        MaxBackupIndex=2:指定可以产生的滚动文件的最大数。
        配置日志信息的格式(布局) ,其语法为:
        log4j.appender.appenderName.layout = Log4j  提供的 layout  类
        log4j.appender.appenderName.layout.属性 = 值
        ....
        log4j.appender.appenderName.layout.属性 = 值

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

1) HTMLLayout  选项
       LocationInfo=true:默认值是 false,输出 java 文件名称和行号
       Title=my app file: 默认值是 Log4J Log Messages.

2) PatternLayout  选项
       ConversionPattern=%m%n :指定怎样格式化指定的消息。

3) XMLLayout  选项
       LocationInfo=true:默认值是 false,输出 java 文件和行号
       Log4J 采用类似 C 语言中的 printf 函数的打印格式格式化日志信息,打印参数如下:
       og4j.appender.A1.layout.ConversionPattern=%-4r %-5p %d{yyyy-MM-dd HH:mm:ssS} %c %m%n

这里需要说明的就是日志信息格式中几个符号所代表的含义:
      -X  号: X 信息输出时左对齐;
      %p: 输出日志信息优先级,即 DEBUG,INFO,WARN,ERROR,FATAL,
      %d: 输出日志时间点的日期或时间,默认格式为 ISO8601,也可以在其后指定格式,
      比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002 年 10 月 18 日 22:10:28,921
     %r: 输出自应用启动到输出该 log 信息耗费的毫秒数
     %c: 输出日志信息所属的类目,配置文件中的名字,通常就是所在类的全名(若使用 rootLogger)
     %t: 输出产生该日志事件的线程名
     %l: 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及行数。
     举例:Testlog4.main(TestLog4.java:10)
     %x: 输出和当前线程相关联的 NDC(嵌套诊断环境),尤其用到像 java servlets 这样的多客户多线程的应
     用中。
     %%: 输出一个"%"字符
     %F: 输出日志消息产生时所在的文件名称
     %L: 输出代码中的行号
     %m: 输出代码中指定的消息,产生的日志具体信息
     %n: 输出一个回车换行符,Windows 平台为"\r\n",Unix 平台为"\n"输出日志信息换行
     %M: 输出日志信息所属的方法
 
     可以在% 与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如:
     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 字符,就从左边交远销出的字符截掉

5.注意事项
    5.1为什么使用 logger  之前要判断日志输入级别 ?
    经常看到代码中有这样的写法:
    if(logger.isDebugEnabled()){
    logger.debug(AssessmentParamsUtils.getParams().toString());
    }
    有人就有疑问了,这个和下面直接 debug 的写法有什么区别?
    logger.debug(AssessmentParamsUtils.getParams().toString());
    我们来看一下源码:
    debug  方法的源码(log4j )
    public void debug(Object message) {
    if (repository.isDisabled(Level.DEBUG_INT))
    return;
    if (Level.DEBUG.isGreaterOrEqual(this.getEffectiveLevel())) {
    forcedLog(FQCN, Level.DEBUG, message, null);
    }
    }
    isDebugEnabled  方法的源码 (log4j )
    public boolean isDebugEnabled() {
    if (repository.isDisabled(Level.DEBUG_INT))
    return false;
    return Level.DEBUG.isGreaterOrEqual(this.getEffectiveLevel());
    }
    其实判断是一样的,都判断了 debug 级别是否开启,这样看来,判断似乎没有区别,那为什么还要加这个判断呢?
    答: 为了性能。
    在 其实原因不在 debug  上,而在日志输入的东西上 ,如果只输入简单的字符串,或者小对象,异常等等, 那么这两个没有区别,建议就不用判断了,区别不大 。但是,一旦输出前执行了比较费时的方法,那么就很影响性能了 ,如上面这段 中的 AssessmentParamsUtils.getParams().toString()如果这句话执行需要 1 分钟,那么加判断的就一下子过去了,不执行这句话,而没有加判断的需要先执行这句话,1 分钟后执行完毕,才去执行 debug,一判断不输出,跳过,虽然结果一样,但是多执行了 1 分钟,严重影响性能。现实中不会到 1 分钟的,这里的 1 分钟只是示例,但是高并发时,影响还是挺大的。

同理其他方法:
    logger.isDebugEnabled();
    logger.isErrorEnabled();
    logger.isFatalEnabled();
    logger.isInfoEnabled();
    logger.isTraceEnabled();
    logger.isWarnEnabled();
    为了更健壮的代码,像这样的小细节以后也要多注意了。
    
    5.2 log4j.logger.com.neusoft=DEBUG
         指定 com.neusoft 包下的所有类的等级为 DEBUG。
         可以把 com.neusoft 改为自己项目所用的包名。
    
        log4j.logger.org.apache.commons=ERROR
        log4j.logger.org.apache.struts=WARN
        这两句是 struts 的包。

日志处理(一) log4j 入门和详解(转)的更多相关文章

  1. java 日志体系(三)log4j从入门到详解

    java 日志体系(三)log4j从入门到详解 一.Log4j 简介 在应用程序中添加日志记录总的来说基于三个目的: 监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析工作: 跟踪代 ...

  2. commons-logging和Log4j 日志管理/log4j.properties配置详解

    commons-logging和Log4j 日志管理 (zz) 什么要用日志(Log)? 这个……就不必说了吧. 为什么不用System.out.println()? 功能太弱:不易于控制.如果暂时不 ...

  3. Hibernate4搭建Log4J日志管理(附Log4j.properties配置详解)

    1.首先加入slf4j的jar包,即slf4j-api-1.6.1.jar 在hibernate官网下载hibernate-release-4.2.2.Final.zip并解压,在hibernate- ...

  4. slf4j log4j logback关系详解和相关用法

    slf4j log4j logback关系详解和相关用法 写java也有一段时间了,一直都有用slf4j log4j输出日志的习惯.但是始终都是抱着"拿来主义"的态度,复制粘贴下配 ...

  5. log4j.properties配置详解与实例

    log4j.properties配置详解与实例 第一步:加入log4j-1.x.x.jar到lib下. 第二步:在工程的src下下建立log4j.properties.内容如下: #OFF,syste ...

  6. Log4j介绍,log4j.properties配置详解

    http://www.cnblogs.com/simle/archive/2011/09/29/2195341.html本文主要解释log4j的配置文件各个配置项的含义,内容是从网上转载的 1.Log ...

  7. [转帖]持久化journalctl日志清空命令查看配置参数详解

    持久化journalctl日志清空命令查看配置参数详解 最近 linux上面部署服务 习惯使用systemd 进行处理 这样最大的好处能够 使用journalctl 进行查看日志信息. 今天清理了下 ...

  8. (十八)整合Nacos组件,环境搭建和入门案例详解

    整合Nacos组件,环境搭建和入门案例详解 1.Nacos基础简介 1.1 关键特性 1.2 专业术语解释 1.3 Nacos生态圈 2.SpringBoot整合Nacos 2.1 新建配置 2.2 ...

  9. Log4j.properties 属性详解以及 LOG4J日志级别详解

    转自:https://blog.csdn.net/lovely0903jpp/article/details/82261607 假如项目的生产环境上增加请求以及响应信息的打印,这个时候,对于新手来说, ...

随机推荐

  1. Unity3D笔记二十 多媒体与网络

    1 游戏音频 1.游戏音乐:如游戏背景音乐 2.游戏音效:如开枪或打怪物时“砰砰”的游戏音效 Unity 3D游戏引擎共支持4种音乐格式的文件,具体如下. aiff:适用于较短的音乐文件,可用作游戏音 ...

  2. Ubuntu 16.04系统下apt-get和dpkg区别

    两者的区别是dpkg绕过apt包管理数据库对软件包进行操作,所以你用dpkg安装过的软件包用apt可以再安装一遍,系统不知道之前安装过了,将会覆盖之前dpkg的安装.1.dpkg是用来安装.deb文件 ...

  3. 关于python的【if __name__ == "__main__":】

    学习东西真的需要自己动手,然后遇到问题,自己学着去解决.当然如果能得到高人指点,那真是走了八辈子运了.可以节省很多时间.但是大多数情况下,不能总是有高人来指点我们.这时就需要靠我们自己了. 在学习py ...

  4. Des加密(js+java结果一致)【原创】

    des加密算法,javascript版本和java版本 目录: 1.资源文件下载 2.JavaScript文件(des.js) 3.html文件(des.html) 4.java文件(des.java ...

  5. return 通过文件后缀名得到的函数字符串

    <?php//图片处理工具类class Image{//属性private $thumb_width; //缩略图的宽private $thumb_height;//错误属性public $th ...

  6. POJ 1185 - 炮兵阵地 & HDU 4539 - 郑厂长系列故事——排兵布阵 - [状压DP]

    印象中这道题好像我曾经肝过,但是没肝出来,现在肝出来了也挺开心的 题目链接:http://poj.org/problem?id=1185 Time Limit: 2000MS Memory Limit ...

  7. 《MYSQL必知必会》

    1. 同一个数据库中不允许出现同名表:不同的数据库中可以出现同名表2. 每一行记录都用有一个key(一列或一组列作为key)3. 作为key的列不允许值为空(NULL)4. 多个列作为key时,多个列 ...

  8. MYSQL 命令行显示乱码 解决方案

    中文乱码是因为编码集不支持,所以要改变编码 先查看下设置的编码 使用如下命令 show variables like 'character%'; 在 mysql.conf (Ubuntu mysql5 ...

  9. CDN工作过程(第二种版本)

    作者:代希刚链接:https://www.zhihu.com/question/36514327/answer/121026637来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...

  10. go for cryptocurrency

    https://blog.conformal.com/category/btcd/ https://github.com/btcsuite/btcd/tree/master/docs https:// ...