• Java日志介绍(2)-Log4j


      Log4j是Apache的一个开源项目,官网地址为http://logging.apache.org/log4j/1.2/index.html。通过使用Log4j,可控制日志信息输出到控制台、文件、数据库等不同的地方;可以控制每一条日志的输出格式,通过定义每一条日志信息的级别,可以更加细致的控制日志的生成过程。Log4j是曾经风靡一时的日志框架,但现在逐渐被新的日志框架所取代:Log4j2、logback。本文主要介绍下Log4j的使用方法,文中所使用到的软件版本:Java 1.8.0_191、log4j 1.2.17。

    1、初始化过程

    log4j初始化是会查找log4j.configuration系统属性对应的配置文件,如果没有则在classpath下查找log4j.properties文件;程序中也可以通过PropertyConfigurator来加载配置文件。

    2、日志信息的优先级

    Log4j日志级别是定义在org.apache.log4j.Level类中,Log4j只建议使用其中4个级别,优先级从高到低分别是error、warn、info、debug。

    3、日志信息的输出目的地 (appender)

    Log4j提供的appender有以下几种:

    org.apache.log4j.ConsoleAppender(控制台)
    org.apache.log4j.FileAppender(文件)
    org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
    org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
    org.apache.log4j.JDBCAppender(数据库)
    org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)

    4、日志信息的输出格式(layout)

    Log4j提供的layout有以下几种:

    org.apache.log4j.HTMLLayout(以HTML表格形式布局)
    org.apache.log4j.PatternLayout(可以灵活地指定布局模式,常用)
    org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
    org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

    这里主要介绍PatternLayout,它通过参数来格式化日志信息:

    %d 输出日志记录事件的日期,默认格式为ISO8601,也可以在其后指定格式;如:%d{dd MMM yyyy HH:mm:ss,SSS},输出类似:02 Nov 2012 14:34:02,781
    %p 输出日志记录事件的优先级
    %t 输出生成日志记录事件的线程的名称
    %c 输出日志记录事件的类别;后面可以给出精度,如类别为"a.b.c",%c{2}将输出"b.c"
    %C 输出发出日志记录请求的调用方的完全限定类名称;后面可以给出精度,如类别为"a.b.c",%c{1}将输出"c"
    %M 输出发出日志记录请求的方法名称
    %F 输出发出日志记录请求的文件名。生成调用方位置信息的速度极其缓慢,除非执行速度不是问题,否则应避免使用。
    %L 输出发出日志记录请求的文件行号。生成调用方位置信息的速度极其缓慢,除非执行速度不是问题,否则应避免使用。
    %m 输出应用程序提供的消息
    %n 输出与平台相关的行分隔符,Windows平台为 ,Unix平台为
    %x 输出与生成日志记录事件的线程关联的NDC(嵌套诊断上下文)
    %X 用于输出与生成日志记录事件的线程关联的MDC(映射诊断上下文)。通常用于多个客户端连接同一台服务器,方便服务器区分是哪个客户端访问留下来的日志。如%X{5}将记录代号为5的客户端的日志

    默认情况下,相关信息会全部输出;可以借助格式修改器,更改最小字段宽度、最大字段宽度和对齐方向。格式修改器放置在百分比符号和转换字符之间。

    %20c 如果类别名称少于20个字符,则用空格左垫。
    %-20c 如果类别名称少于20个字符,则用空格右垫。
    %.30c 如果类别名称长于30个字符,则从左开始截取掉多余的字符。
    %20.30c 如果类别名称少于20个字符,则用空格左垫;如果类别名称长于30个字符,则从左开始截取掉多余的字符。
    %-20.30c 如果类别名称少于20个字符,则用空格右垫;如果类别名称长于30个字符,则从左开始截取掉多余的字符。

    更多相关说明参见 http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html

    5、与SLF4J结合使用

    5.1、log4j转为SLF4j

    把log4j的日志转换为slf4j输出,用log4j-over-slf4j替换commons-logging的jar包。

    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>log4j-over-slf4j</artifactId>
      <version>1.7.30</version>
    </dependency>

    5.2、SLF4j绑定log4j

    slf4j使用log4j来输出日志;引入slf4j-log4j12的jar包即可。

    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
      <version>1.7.30</version>
    </dependency>

    注:log4j-over-slf4j和slf4j-log4j12不能同时使用,否则会导致日志事件在SLF4J和log4j之间死循环。

    6、实际使用

    6.1、配置文件log4j.properties

    log4j.rootLogger=info,stdout
    log4j.logger.com.inspur=file1,file2
    
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%d %p [%t] %C.%M [%F:%L] %x -> %m%n
    
    #每天会把日志文件重命名为带前一天日期后缀的文件,如今天为2019-12-30,则文件名为file1.log.2019-12-29,新的日志还输出到file1.log
    log4j.appender.file1=org.apache.log4j.DailyRollingFileAppender
    log4j.appender.file1.File=d:/temp/file1.log
    log4j.appender.file1.DatePattern=.yyyy-MM-dd
    log4j.appender.file1.layout=org.apache.log4j.PatternLayout
    log4j.appender.file1.layout.ConversionPattern=%d %p [%t] %C.%M [%F:%L] %x -> %m%n
    
    #日志文件超过1KB,则把日志文件重命名为file2.log.1、file2.log.2等等,新的日志还输出到file2.log
    log4j.appender.file2=org.apache.log4j.RollingFileAppender
    log4j.appender.file2.File=d:/temp/file2.log
    log4j.appender.file2.MaxFileSize=1KB
    log4j.appender.file2.MaxBackupIndex=10
    log4j.appender.file2.layout=org.apache.log4j.PatternLayout
    log4j.appender.file2.layout.ConversionPattern=%d %p [%t] %C.%M [%F:%L] %x -> %m%n

    rootLogger配置方式为:

    log4j.rootLogger=[level],appender1,appender2

    其他logger配置方式为:

    log4j.logger.loggerName=[level],appender1,appender2

    appender的配置方式为:

    log4j.appender.appenderName=类全名或开头的一部分
    log4j.appender.appenderName.option1=value1
    log4j.appender.appenderName.option2=value2

    6.2、代码例子

    package com.inspur.demo.log;
    
    import org.apache.log4j.Logger;
    import org.apache.log4j.PropertyConfigurator;
    
    /**
     * log4j使用示例
     */
    public class Log4jCase {
        private static Logger logger = Logger.getLogger(Log4jCase.class);
        
        public static void main(String[] args) throws InterruptedException {
            //加载配置文件
            PropertyConfigurator.configure(Log4jCase.class.getClassLoader().getResource("log4j.properties"));
            logger.debug("This is debug message.");  
            for (int i = 0; i < 1000; i++) {
                logger.info("This is info message:" + i);
            }
        }
    }

    配置文件配置好,使用还是很简单的。

    6.3、web应用spring整合log4j

    在web.xml中增加:

        <context-param>
            <param-name>log4jConfigLocation</param-name>
            <param-value>classpath:log4j.properties</param-value>
        </context-param>
  • 相关阅读:
    jvm client模式和server模式
    TOMCAT开启APR模式
    Spring MVC 关于controller的字符编码问题
    彻底解决Spring MVC 中文乱码 问题
    js中字符串拼接html
    分布式文件系统之MooseFS----介绍
    CopyFile函數詳解
    Delphi 接口使用中,对象生命周期管理,如何释放需要注意的问题
    年度调查 看看 2016 年 Go 语言调查结果
    Sleep(0)的作用
  • 原文地址:https://www.cnblogs.com/wuyongyin/p/12118969.html
Copyright © 2020-2023  润新知