• log4j日志日记记录使用教程


       注意:每次引入Logger的时候注意引入的jar包,因为有Logger的包太多了。。。。。。

         Logger必须作为类的静态变量使用。原因如下:

    1 使用static修饰的属性是归这个类使用的
    2 也就是说不论这个类实例化多少个,大家用的都是同一个static属性
    3 log4j记录的是当前类的日志,不是每个实例的日志
    4 所以只要有一个记录就可以了



           Log4j是帮助开发人员进行日志输出管理的 API类库。它最重要的特点就可以配置文件灵活的设置日志信息的优先级、日志信息的输出目的地以及日志信息的输出格式。Log4j除了可以记录程序运行日 志信息外还有一重要的功能就是用来显示调试信息。很多程序员经常会使用System.out.println语句输出某个变量值的方法进行调试。这样会带 来一个非常麻烦的问题:一旦哪天程序员决定不要显示这些System.out.println的东西了就只能一行行的把这些语句注释掉。若哪天又需调试变 量值,则只能再 一行行去掉这些注释恢复System.out.println语句。使用log4j可以很好的处理类似情况:使用"DEBUG"等级输出会类似 System.out.println,开发后期不需要输出调试时可以把等级根据需要调高,如调到"ERROR"等级,只有出错错误时才输出

    使用步骤:

    1.导入jar包:

    2. 在项目根目录(src)下添加配置文件log4j.properties(可以修改第一行代码来设置等级和格式)

     1 #设置logger级别DEBUG、INFO、WRNING、ERROR和输出格式A、B、C或D
     2 log4j.rootLogger=DEBUG, A
     3 
     4 #输出到控制台
     5 log4j.appender.A=org.apache.log4j.ConsoleAppender
     6 log4j.appender.A.layout=org.apache.log4j.PatternLayout
     7 log4j.appender.A.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n
     8 
     9 #输出到E盘的log.log文件
    10 log4j.appender.B=org.apache.log4j.FileAppender
    11 log4j.appender.B.File=E:\log.log
    12 log4j.appender.B.layout=org.apache.log4j.SimpleLayout
    13 
    14 #输出到E盘的log.html文件
    15 log4j.appender.C=org.apache.log4j.RollingFileAppender
    16 log4j.appender.C.File=E:\log.html
    17 log4j.appender.C.MaxFileSize=1000KB
    18 log4j.appender.C.MaxBackupIndex=10
    19 log4j.appender.C.layout=org.apache.log4j.HTMLLayout
    20 
    21 log4j.appender.D=org.apache.log4j.DailyRollingFileAppender
    22 log4j.appender.D.File=E:\log.log
    23 log4j.appender.D.layout=org.apache.log4j.TTCCLayout

    如果需要输出到多个位置的时候可以逗号隔开,比如:   log4j.rootLogger=info, A, B 

     3.使用日志记录器(注意Logger的包名是org.apache.log4j.Logger)

     1 import java.io.File;
     2 import java.io.FileNotFoundException;
     3 import java.io.FileReader;
     4 import java.io.IOException;
     5 
     6 import org.apache.log4j.Logger;
     7 import org.junit.Test;
     8 public class Log4jDemo {
     9     @Test
    10     public void test1(){
    11 //        获得log4j对象
    12         Logger logger = Logger.getLogger(Log4jDemo.class);
    13         FileReader fileReader = null;
    14         try {
    15             fileReader=new FileReader("log4j.properties");
    16             logger.info("begain to read!!!!!");
    17         } catch (FileNotFoundException e) {
    18             // TODO Auto-generated catch block
    19             logger.fatal("这是fatal");
    20             logger.error(e.getMessage(),e);
    21             logger.error("系统找不到指定文件");
    22             logger.warn("这是警告!");
    23             logger.info("这是信息!!!");
    24 //            debug经常用于调试程序
    25             logger.debug("这是debug!!!");
    26         }
    27         try {
    28             fileReader.close();
    29         } catch (IOException e) {
    30             // TODO Auto-generated catch block
    31             e.printStackTrace();
    32             logger.error("file not find", e);
    33         }
    34     }
    35 }

    4.结果:

    2017-07-17 09:36:13 [Log4jDemo]-[FATAL] 这是fatal
    2017-07-17 09:36:13 [Log4jDemo]-[ERROR] log4j.properties (系统找不到指定的文件。)
    java.io.FileNotFoundException: log4j.properties (系统找不到指定的文件。)
        at java.io.FileInputStream.open(Native Method)
        at java.io.FileInputStream.<init>(FileInputStream.java:146)
        at java.io.FileInputStream.<init>(FileInputStream.java:101)
        at java.io.FileReader.<init>(FileReader.java:58)
        at Log4jDemo.test1(Log4jDemo.java:15)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
        at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
        at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
        at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
        at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
        at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
        at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
        at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
        at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
        at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
        at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
        at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
        at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
        at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
        at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
    2017-07-17 09:36:13 [Log4jDemo]-[ERROR] 系统找不到指定文件
    2017-07-17 09:36:13 [Log4jDemo]-[WARN] 这是警告!
    2017-07-17 09:36:13 [Log4jDemo]-[INFO] 这是信息!!!
    2017-07-17 09:36:13 [Log4jDemo]-[DEBUG] 这是debug!!!

    测试2

    1. logger.error(e.getMessage()):只输出错误信息,不输出其他信息

    package danger.test;
    
    import org.apache.log4j.Logger;
    import org.junit.Test;
    
    public class Log4jTest {
        Logger logger = Logger.getLogger(Log4jTest.class);
        @Test
        public void test(){
            try {
                int i = 1/0;
            } catch (Exception e) {
                // TODO Auto-generated catch block
                logger.error(e.getMessage());
            }
        }
    }
    package danger.test;
    
    import org.apache.log4j.Logger;
    import org.junit.Test;
    
    public class Log4jTest {
        Logger logger = Logger.getLogger(Log4jTest.class);
        @Test
        public void test(){
            try {
                int i = 1/0;
            } catch (Exception e) {
                // TODO Auto-generated catch block
                logger.error(e.getMessage());
            }
        }
    }
    ERROR [main] - / by zero

    2.logger.error(e.getMessage(),e) 输出具体信息与异常对象

    package danger.test;
    
    import org.apache.log4j.Logger;
    import org.junit.Test;
    
    public class Log4jTest {
        Logger logger = Logger.getLogger(Log4jTest.class);
        @Test
        public void test(){
            try {
                int i = 1/0;
            } catch (Exception e) {
                // TODO Auto-generated catch block
                logger.error(e.getMessage(),e);
            }
        }
    }
    ERROR [main] - / by zero
    java.lang.ArithmeticException: / by zero
        at danger.test.Log4jTest.test(Log4jTest.java:11)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
        at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
        at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
        at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
        at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
        at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
        at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
        at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
        at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
        at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
        at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
        at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
        at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
        at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
        at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

    总结:


    1. Logger对象的获取和创建

    Logger被指定为实体,由一个String类的名字识别。Logger的名字是大小写敏感的,且名字之间具有继承关系,子名用父名作为前缀,用点“.”分隔,例如x.y是x.y.z的父亲。
    root Logger(根Logger)是所有Logger的祖先,它有如下属性:
             1.它总是存在的。
             2.它不可以通过名字获得。
    root Logger可以通过以下语句获得:

    public static Logger Logger.getRootLogger();

    或:

    static Logger Logger.getLogger(Class clazz)

    其中调用Logger.getLogger(Class clazz)是目前ogger对象最理想的方法

    2. 日志级别
    每个Logger都被了一个日志级别(log level),用来控制日志信息的输出。日志级别从高到低分为:
    A:off         最高等级,用于关闭所有日志记录。
    B:fatal       指出每个严重的错误事件将会导致应用程序的退出。
    C:error      指出虽然发生错误事件,但仍然不影响系统的继续运行。
    D:warm     表明会出现潜在的错误情形。
    E:info         一般和在粗粒度级别上,强调应用程序的运行全程。
    F:debug     一般用于细粒度级别上,对调试应用程序非常有帮助。
    G:all           最低等级,用于打开所有日志记录。

    上 面这些级别是定义在org.apache.log4j.Level类中。Log4j只建议使用4个级别,优先级从高到低分别是 error,warn,info和debug。通过使用日志级别,可以控制应用程序中相应级别日志信息的输出。例如,如果使用b了info级别,则应用程 序中所有低于info级别的日志信息(如debug)将不会被打印出来

    3.输出端Appender
    Appender用来指定日志信息输出到哪个地方,可以同时指定多个输出目的地。Log4j允许将信息输出到许多不同的输出设备中,一个log信息输出目的地就叫做一个Appender。
    每 个Logger都可以拥有一个或多个Appender,每个Appender表示一个日志的输出目的地。可以使用 Logger.addAppender(Appender app)为Logger增加一个Appender,也可以使用Logger.removeAppender(Appender app)为Logger删除一个Appender。
    以下为Log4j几种常用的输出目的地。
    a:org.apache.log4j.ConsoleAppender:将日志信息输出到控制台。
    b:org.apache.log4j.FileAppender:将日志信息输出到一个文件。
    c:org.apache.log4j.DailyRollingFileAppender:将日志信息输出到一个日志文件,并且每天输出到一个新的日志文件。
    d:org.apache.log4j.RollingFileAppender:将日志信息输出到一个日志文件,并且指定文件的尺寸,当文件大小达到指定尺寸时,会自动把文件改名,同时产生一个新的文件。
    e:org.apache.log4j.WriteAppender:将日志信息以流格式发送到任意指定地方。
    f::org.apache.log4j.jdbc.JDBCAppender:通过JDBC把日志信息输出到数据库中

     
    4. 日志格式化器Layout
    有三种:
    HTMLLayout:格式化日志输出为HTML表格形式:如下
    SimpleLayout:以一种非常简单的方式格式化日志输出,它打印三项内容:级别-信息
    例:INFO - info
    PatternLayout::根据指定的转换模式格式化日志输出,或者如果没有指定任何转换模式,就使用默认的转化模式格式

    总结:log4j.appender.stdout.Target=System.out,意味着控制台输出标准信息,log4j.appender.stdout.Target=System.err输出错误信息

  • 相关阅读:
    AT SELECTIONSCREEN的用法
    ADD的用法
    ~的用法
    DIV+CSS布局
    CSS 列表
    CSS 文本
    VC include 路径解析
    CRITICAL_SECTION临界区学习
    UI设计时要注意的几个方面
    使用和扩展marshal_as库
  • 原文地址:https://www.cnblogs.com/qlqwjy/p/7192947.html
Copyright © 2020-2023  润新知