Log4J

作者: 天涯笑笑生 | 来源:发表于2018-03-19 16:50 被阅读0次

一、简介

  • Apache 的开源项目,可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。
    官网链接
  • 包括三部分:日志记录器(Loggers),输出端(Appenders)和日志格式化器(Layout)
    Loggers:控制日志记录语句以及级别(DEBUG、INFO、WARN、ERROR、FATAL)
    A:off 最高等级,用于关闭所有日志记录。
    B:fatal 指出每个严重的错误事件将会导致应用程序的退出。
    C:error 指出虽然发生错误事件,但仍然不影响系统的继续运行。
    D:warn 表明会出现潜在的错误情形。
    E:info 一般和在粗粒度级别上,强调应用程序的运行全程。
    F:debug 一般用于细粒度级别上,对调试应用程序非常有帮助。
    G:all 最低等级,用于打开所有日志记录。
    注:一般error、warn、Info、debug
    Appenders:控制日志输出地点
    Layout:控制日志显示格式

二、应用

2.1 Library

<!--<log4j.version>1.2.17</log4j.version>-->
<!--log4j-->
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>${log4j.version}</version>
    </dependency>

注:此版本目前是最高版本

2.2 configuration

Log4j 支持支持properties 和XML两种配置文件

### 设置###
log4j.rootLogger = debug,stdout,D,E

#设置spring 的级别
log4j.logger.org.springframework = ERROR

之贴个properties 的,该文件建在Resources 文件夹下
### 输出信息到控制抬 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n

### 输出DEBUG 级别以上的日志到=/Users/jony/Desktop/debug.log ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = /Users/jony/Desktop/debug.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG 
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [%l] - [ %p ] %n %m%n

### 输出ERROR 级别以上的日志到=/Users/jony/Desktop/error.log ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =/Users/jony/Desktop/error.log 
log4j.appender.E.Append = true

log4j.appender.E.Threshold = ERROR 
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [[%l]] - [ %p ] %n %m%n
  • web.xml file
    直接使用,是不需要配置XML的,如果需要初始化或者和spring等关联,就需要配置

注:在不配置或初始化的情况下,spring 框架中的logging 同样会读取该配置

2.3 代码中使用

import org.junit.Test;

import org.apache.log4j.Logger;


/**
 * Created by jony on 3/19/18.
 */
public class Log4jTest {

    static Logger logger = Logger.getLogger(String.valueOf(Log4jTest.class));

    @Test
    public void outputTest(){
        logger.info("logTest .......");
        logger.debug("log4j  debug");
        logger.error("log4j error");
    }
}

注:Logger类是org.apache.log4j.Logger中的,一般都会添加Junit包,所以常会搞成java.util.logging.Logger包中的Logger类

关于日志输出路径问题

找到一篇算可以的,直接贴过来
原文1
原文2

问题描述:

一个web项目想在一个tomcat下运行多个实例(通过修改war包名称的实现),然后每个实例都将日志输出到tomcat的logs目录下实例名命名的文件夹下进行区分查看每个实例日志,要求通过尽可能少的改动配置文件,最好修改实例名后可以不修改log4j的配置文件。

实现分析:

一般实现上面需求,需要在修改完war包名称之外要再做下面配置:

  • 1、修改每个实例名下web.xml中参数webAppRootKey为不同值。同一个tomcat下运行多个web应用时,该值相同的话,运行时会抛异常。
<context-param>
  <param-name>webAppRootKey</param-name>
  <param-value>webApp.root</param-value>
</context-param>
  • 2、log4j配置文件日志输出路径修改
    log4j配置文件中路径配置一般有三种方法:
    (1)绝对路径法:直接配置为系统绝对路径;
    (2)相对路径法
          //将日志记录到tomcat下的logs文件夹;
          log4j.appender.logfile.File=../logs/app.log

        //将日志记录到tomcat的bin目录下的logs文件夹;
        log4j.appender.logfile.File=logs/app.log

(3)使用环境变量相对路径法:程序会优先找jvm环境变量,然后再找系统环境变量,来查找配置文件中的变量。

//使用tomcat容器时${user.dir}对应tomcat的bin目录;
  log4j.appender.logfile.File=${user.dir}/logs/app.log

//${user.home}对应操作系统当前用户目录;
   log4j.appender.logfile.File=${user.home}/logs/app.log

//${webApp.root}对应当前应用根目录;
  log4j.appender.logfile.File=${webApp.root}/logs/app.log

暂时没找到不修改log4j配置而实现上面需求的方法。在log4j配置文件中可以获取环境变量来配置,但变量里没有当前应用的名称(不能直接通过webApp.root,因为它在不同的实例名称不一样),尝试在web.xml中增加listener,获取应用名称,然后调用System.setProperty("contextPath", sce.getServletContext().getContextPath());将上下文设置到系统变量中在log4j应用,但多实例运行时每个实例都会改变该属性值。
结论,该问题的解决方法:
1、手动修改配置,修改war名称后手动修改web.xml和log4j配置文件,实现上述需求。
2、通过其它程序来进行批量修改,若bat或maven等在修改war包名称时,自动修改掉web.xml和log4j中相关配置。

其他方式代码实现

${project}在web.xml里面配置

log4j.properties

    log4j.rootLogger=INFO, stdout,logfile  
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender  
    log4j.appender.stdout.Target=System.out  
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout  
    log4j.appender.stdout.layout.ConversionPattern=%d %p - %m%n  
    log4j.appender.logfile=org.apache.log4j.RollingFileAppender  
    log4j.appender.logfile.File=${project}/WEB-INF/logs/tjsjbzlog.log
    log4j.appender.logfile.Append=true  
    log4j.appender.logfile.MaxFileSize=1000KB  
    log4j.appender.logfile.MaxBackupIndex=1  
    log4j.appender.logfile.layout=org.apache.log4j.PatternLayout  
    log4j.appender.logfile.layout.ConversionPattern=%d %p - %m%n  

web.xml

    <?xml version="1.0" encoding="UTF-8"?>  
    <web-app version="2.5"   
        xmlns="http://java.sun.com/xml/ns/javaee"   
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
        http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
      <display-name></display-name>   
        <!-- 配置log4j -->  
    <span style="color:#ff0000;">   <context-param>  
            <param-name>webAppRootKey</param-name>  
            <param-value>project</param-value><!-- log4j的配置文件里可以用${project}来表示刚刚设进去的系统变量 -->  
        </context-param>  
        <context-param>  
            <param-name>log4jConfigLocation</param-name>  
            <param-value>/WEB-INF/classes/log4j.properties</param-value><!-- 配置文件路径 -->  
        </context-param>  
        <context-param>  
            <param-name>log4jRefreshInterval</param-name><!-- 默认重新加载配置文件时间 -->  
            <param-value>3000</param-value>  
        </context-param></span>  
        <!-- 加载spring配置文件 -->  
        <!--ContextLoader 加载 contextConfigLocation 用以初始化WebApplicationContext -->  
        <context-param>  
            <param-name>contextConfigLocation</param-name>  
            <param-value>/WEB-INF/classes/applicationContext.xml</param-value>  
        </context-param>  
        <listener>  
            <listener-class>com.hhkj.tjsjbz.listener.ManagerContentListener</listener-class>  
        </listener>  
        <!-- log4j监听器 -->  
    <span style="color:#ff0000;">   <listener>      
            <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>      
        </listener></span>  
        <!-- 加载spring监听器 -->  
        <listener>  
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
        </listener>  
        <!-- 加载spring的Filter代理,指向BeanID为securityFilter的Filter -->  
    <!--         <filter>  
            <filter-name>securityFilter</filter-name>  
            <filter-class>com.hhkj.tjsjbz.filter.SecurityFilter</filter-class>  
        </filter>  
        Filter Mapping(对Action的过滤须放在Struts的配置之前,不然不生效)  
        <filter-mapping>  
            <filter-name>securityFilter</filter-name>  
            <url-pattern>*.jsp</url-pattern>  
        </filter-mapping>  
            <filter-mapping>  
            <filter-name>securityFilter</filter-name>  
            <url-pattern>*.action</url-pattern>  
        </filter-mapping> -->  
        <!-- session超时定义,单位为分钟 -->  
        <session-config>  
            <session-timeout>60</session-timeout>  
        </session-config>  
      
      <filter>  
        <filter-name>struts2</filter-name>  
        <filter-class>  
            org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter  
        </filter-class>  
        <init-param>  
            <param-name>actionPackages</param-name>  
            <param-value>com.hhkj.tjsjbz.action</param-value>  
        </init-param>  
      </filter>  
      <filter-mapping>  
        <filter-name>struts2</filter-name>  
        <url-pattern>/*</url-pattern>  
      </filter-mapping>  
        
      <welcome-file-list>  
        <welcome-file>login.action</welcome-file>  
      </welcome-file-list>  
    </web-app>  

相关文章

网友评论

      本文标题:Log4J

      本文链接:https://www.haomeiwen.com/subject/qckpqftx.html