zoukankan      html  css  js  c++  java
  • Log4J 学习

    入门:

    最初使用 sout,简单有效,但:

    • 不知道是哪个类,哪个线程输出的
    • 不知道什么时候输出的,因此不知前后输出,间隔多长时间
    • 无法选择性的关闭调试级别的信息:输出过多时,对程序效果形成干扰、没有级别区分,查看日志很痛苦等

    因此使用日志框架,这里引入 Log4J(网上教程多为老项目 —— Log4J 1,先用着):

    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>
    

    例程:

    import org.apache.log4j.BasicConfigurator;
    import org.apache.log4j.Level;
    import org.apache.log4j.Logger;
    
    public class LogTest {
        public static void main(String[] args) {
            Logger logger = Logger.getLogger(LogTest.class);
            BasicConfigurator.configure();
            logger.setLevel(Level.DEBUG);
    
            logger.trace("跟踪信息");
            logger.debug("调试信息");
            logger.info("输出信息");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            logger.warn("警告信息");
            logger.error("错误信息");
            logger.fatal("致命信息");
        }
    }
    

    下面是新项目 Log4J 2 的例程:

    import org.apache.logging.log4j.Level;
    import org.apache.logging.log4j.LogManager;
    import org.apache.logging.log4j.Logger;
    import org.apache.logging.log4j.core.config.Configurator;
    
    public class LogTest {
        public static void main(String[] args) {
            Logger logger = LogManager.getLogger(LogTest.class);
    //        Configurator.setRootLevel(Level.DEBUG);
            Configurator.setLevel(logger.getName(), Level.DEBUG);
    
            logger.trace("跟踪信息");
            logger.debug("调试信息");
            logger.info("输出信息");
            logger.warn("警告信息");
            logger.error("错误信息");
            logger.fatal("致命信息");
        }
    }
    

    日志配置文件

    1.log4j.properties

    例子 ——:
    在 classpath 下,创建 log4j.properties 文件:

    log4j.rootLogger=debug, stdout, R
    
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
    
    log4j.appender.R=org.apache.log4j.RollingFileAppender
    log4j.appender.R.File=log4j.log
    log4j.appender.R.MaxFileSize=100KB
    log4j.appender.R.MaxBackupIndex=5
    
    log4j.appender.R.layout=org.apache.log4j.PatternLayout
    log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
    

    Java 代码:

    import org.apache.log4j.Logger;
    import org.apache.log4j.PropertyConfigurator;
    
    public class LogTest {
        public static void main(String[] args) {
            Logger logger = Logger.getLogger(LogTest.class);
            PropertyConfigurator.configure("D:\repository\quartz\src" +
                    "\main\resources\log4j.properties");
            logger.trace("跟踪信息");
            logger.debug("调试信息");
            logger.info("输出信息");
            logger.warn("警告信息");
            logger.error("错误信息");
            logger.fatal("致命信息");
        }
    }
    

    配置文件解释:

    • 设置日志等级为 debug;日志输出到两个地方,分别 stdout、R
    • stdout 输出到控制台:org.apache.log4j.ConsoleAppender;下面是控制台的格式
    • R 滚动写入到文件(在未超过文件指定大小之前,每次接着上次写入):一个文件 100k,最多 5 个文件。下面同样是输出的格式

    输出格式类是 org.apache.log4j.PatternLayout,输出格式解释:

    • %c:日志所属类的全名
    • %f :日志所属类的类名
    • %d:输出时间(日期或时间点),默认格式为 ISO8601,也可以指定格式,如 %d{yyyy-MM-dd HH:mm:ss},输出如 2019-06-15 04:39:00
    • %l :日志事件发生的位置(第几行 line)
    • %m:输出指定的 message,如 trace("message")、debug("message")
    • %n:回车换行符
    • %p:输出一个字符串(包含优先级,即日志级别,其他为空格)。可以指定总长度,长度为正数,则右对齐;长度为非正数或者不指定,则左对齐。多余的空格补齐
    • %r:从应用启动,到输出该日志,所耗费的毫秒数
    • %t:输出该日志的线程名(或者 %M)

    所以:

    • %5p [%t] (%F:%L) - %m%n 意思是:长度为 5 的日志级别 [线程名] (类名:行号) - 信息,然后再回车
    • %p %t %c - %m%n:长度不限的日志级别 线程名 类全名 - 信息,然后回车

    2.log4j.xml

    也可以只把 log4j.properties 文件,换成 log4j.xml 文件来配置:

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE log4j:configuration PUBLIC "-//log4j/log4j Configuration//EN" "log4j.dtd">
    
    <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
        <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
            <layout class="org.apache.log4j.PatternLayout">
                <param name="ConversionPattern" value="%d %-5p %c.%M:%L - %m%n"/>
            </layout>
        </appender>
    
        <!-- 设置三方库的 logger -->
        <logger name="com.opensymphony">
            <level value="ERROR"/>
        </logger>
        <logger name="org.apache">
            <level value="ERROR"/>
        </logger>
        <logger name="org.hibernate">
            <level value="ERROR"/>
        </logger>
    
        <!-- rootLogger,除了上面指定的,对其他的都适用 -->
        <root>
            <!-- priority 和 level 一样,二者都可用 -->
            <priority value="ERROR"/>
            <appender-ref ref="STDOUT"/>
        </root>
    </log4j:configuration>
    
  • 相关阅读:
    聚合支付里各扫码支付的返回报文样例
    短信平台接口安全控制
    「美团外卖APP签约快捷支付」流程体验
    多模块项目提示“Module ** must not contain source root **. The root already belongs to module **”的解决办法
    比较两种方式的form请求提交
    Linux screen命令和系统日志
    Linux 守护进程
    Linux 进程的通信方式与信号:kill命令
    Linux 进程的控制与进程之间的关系
    Linux 使用ps和top命令查看进程
  • 原文地址:https://www.cnblogs.com/quanxi/p/log4j.html
Copyright © 2011-2022 走看看