zoukankan      html  css  js  c++  java
  • log4j学习总结

    一直使用log4j来记录日志,但是一直以来没有深入研究过log4j,最近研究了下log4j,下面总结一下:

    log4j配置:

    1. 配置根Logger,其语法为: 

     log4j.rootLogger = [level] , appenderName1, appenderName2, … 

    其中,level 是日志记录的优先级,分为 OFF、FATAL、ERROR、WARN、INFO、
    DEBUG、ALL 或者您定义的级别。Log4j 建议只使用四个级别,优先级从高到低分
    别是 ERROR、WARN、INFO、DEBUG。
    2. 配置日志信息输出目的地Appender,其语法为:

    log4j.appender.appenderName = fully.qualified.name.of.appender.class  
    log4j.appender.appenderName.option1 = value1  
    …  
    log4j.appender.appenderName.option = valueN  

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

    log4j.appender.appenderName.layout= fully.qualified.name.of.layout.class  
    log4j.appender.appenderName.layout.option1 = value1  
    …  
    log4j.appender.appenderName.layout.option = valueN  

      其中,Log4j 提供的layout有以下几种: 
      org.apache.log4j.HTMLLayout(以HTML 表格形式布局), 
      org.apache.log4j.PatternLayout(可以灵活地指定布局模式), 
      org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
      org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
      Log4J 采用类似 C 语言中的 printf 函数的打印格式格式化日志信息,打印参数如下: 
      %m 输出代码中指定的消息
      %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL 
      %r 输出自应用启动到输出该log信息耗费的毫秒数 
      %c 输出所属的类目,通常就是所在类的全名 
      %t 输出产生该日志事件的线程名 
      %n 输出一个回车换行符,Windows平台为“ ”,Unix 平台为“ ” 
      %d 输出日志时间点的日期或时间,默认格式为 ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002 年10 月18 日 22:10:28,921 
      %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)   

    在代码中使用Log4j
    1. 得到记录器
    使用Log4j, 第一步就是获取日志记录器, 这个记录器将负责控制日志信息。其语法为:

    public static Logger getLogger( String name)  
    public static Logger getLogger( Class clazz) 
    ``` 
    getLogger( Class class)//其实调用的是getLogger(class.getName())

    2. 插入记录信息(格式化日志信息)
    当上两个必要步骤执行完毕,您就可以轻松地使用不同优先级别的
    语句插入到您想记录日志的任何地方,其语法如下:

    Logger.debug ( Object message ) ; 
    Logger.info ( Object message ) ; 
    Logger.warn ( Object message ) ; 
    Logger.error ( Object message ) ; 


    深入Log4j


    1. Log4j总结
    所有的logger都会继承rootLogger,logger通过名字中的"."来确定继承关系,如com.test继承com。
    通过Logger logger =Logger.getLogger(loggerName)获取logger时,Log4j首先检查配置文件中是否存在名为loggerName的logger,若存在则返回这个logger;若不存在则新建一个名为loggerName的logger并继承离它最近的父logger直到rootLogger。
    关于loggerName的命名,最佳实践为按类名命名。

    log4j.rootLogger=INFO,Console
    log4j.appender.Console=org.apache.log4j.ConsoleAppender
    log4j.appender.Console.layout=org.apache.log4j.PatternLayout
    log4j.appender.Console.layout.ConversionPattern= %d{yyyy-MM-dd HH:mm:ss} %x %-5p [%c{3}] %m%n
    ###自定义logger名为cn.hdt同时会继承rootLogger的appender,即包cn.hdt下的日子写入文件和控制台
    log4j.logger.cn.hdt=info,File
    log4j.appender.File=org.apache.log4j.FileAppender
    log4j.appender.File.File=logs/catalina.out
    log4j.appender.File.Append=true
    log4j.appender.File.DatePattern='.'yyyy-MM-dd
    log4j.appender.File.layout=org.apache.log4j.PatternLayout
    log4j.appender.File.layout.ConversionPattern=%d{ABSOLUTE} %-5p [%c] %m%n
    ###自定义logger名为com.test,修改日志记录级别为error,即包com.test下的error日志会被打印
    log4j.logger.com.test=error


    2. 自定义appender
    自定义log4j appender需要继承log4j公共的基类AppenderSkeleton并实现下列方法:

    •  打印日志核心方法:abstract protected void append(LoggingEvent event);
    •  初始化加载资源:public void activateOptions(),默认实现为空
    •  释放资源:public void close()
    •  是否需要按格式输出文本:public boolean requiresLayout()
    •  正常情况下我们只需要覆盖append方法即可。然后就可以在log4j中使用了

    demo代码:

    package cn.hdt;
    import org.apache.log4j.AppenderSkeleton;
    import org.apache.log4j.spi.LoggingEvent;
    public class MyAppender extends AppenderSkeleton{
      private String account ;  
     public String getAccount() {
      return account;
     }
     public void setAccount(String account) {
      this.account = account;
     }
     @Override
     protected void append(LoggingEvent event) {
      
      System.out.println("Hello, " + account + " : "+ event.getMessage());  
      
     }
     @Override
     public void close() {
      
      
     }
     @Override
     public boolean requiresLayout() {
      
      return false;
     }
      @Override
       public void activateOptions() {
       
      System.out.print("myappender init");
      }
    }

    配置文件:

    log4j.rootLogger=INFO,hello
    log4j.appender.hello=org.apache.log4j.ConsoleAppender
    log4j.appender.hello.layout=org.apache.log4j.PatternLayout
    log4j.appender.hello.layout.ConversionPattern= %d{yyyy-MM-dd HH:mm:ss} %x %-5p [%c{3}] %m%n
    log4j.appender.hello=cn.hdt.MyAppender
    log4j.appender.hello.account=World


    测试代码:

    package cn.hdt;
    
    import org.apache.log4j.Logger;
    
    public class LogTest {
    
     public static void main(String[] args) {
      Logger logger = Logger.getLogger(LogTest.class);
      logger.info("this is info") ;
    
     }
    
    }

    执行main函数,输出结果:

    Myappender  init
    Hello, World : this is info


    由于未实现布局格式,所以输出为未格式化;MyAppender带有一个account的属性,可在配置文件中指定该属性的值,通过appenderName后加".propertyName = value"指定,如log4j.appender.hello.account=World。
    注意为了给MyAppender的account注入值,MyAppender中必须有account的setter方法。
    关于log4j的xml配置方法和property配置大体差不多

  • 相关阅读:
    Leetcode NO.110 Balanced Binary Tree 平衡二叉树
    Leetcode NO.226 Invert Binary Tree 翻转二叉树
    Leetcode NO.215 Kth Largest Element In An Array 数组中的第K个最大元素
    根据特征的浏览器判断
    Cygwin在打开在当前目录
    【转帖】科学对待 健康养猫 打造快乐孕妇
    解决chrome浏览器安装扩展、应用程序一直处在“检查中”的问题
    对【SQL SERVER 分布式事务解决方案】的心得补充
    关于“点击这里继续访问您选择的百度XXX”
    VBA一例:如何保持文本框焦点
  • 原文地址:https://www.cnblogs.com/sandyfog/p/3853860.html
Copyright © 2011-2022 走看看