log4j输出指定功能的log配置方式区别

日志的配置文件有两种:

第一

### 设置### 1p:表示日志的输出级别,2p:定义了一个名称用来代表输出到控制台的,....3p:全局的日志类型
log4j.rootLogger = debug,cansole

### 输出信息到控制抬 ###
log4j.appender.cansole = org.apache.log4j.ConsoleAppender
log4j.appender.cansole.Target = System.out
log4j.appender.cansole.layout = org.apache.log4j.PatternLayout
log4j.appender.cansole.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n

### 自定义的日志类型:sceneTest1, SceneTest1:是索引的值
log4j.logger.SceneTest1= debug,sceneTest1
log4j.appender.sceneTest1=org.apache.log4j.FileAppender
log4j.appender.sceneTest1.File =F://logs/sceneTest1.log
log4j.appender.sceneTest1.layout = org.apache.log4j.PatternLayout
log4j.appender.sceneTest1.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

### 自定义的日志类型:sceneTest2, SceneTest2:是索引的值
log4j.logger.SceneTest2= debug,sceneTest2
log4j.appender.sceneTest2=org.apache.log4j.FileAppender
log4j.appender.sceneTest2.File =F://logs/sceneTest2.log
log4j.appender.sceneTest2.layout = org.apache.log4j.PatternLayout
log4j.appender.sceneTest2.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

 

不使用类,而是使用loggerName来创建日志:

#json是用java代码创建logger时用name,而不是jsonlog,注意,不需要在rootLogger中再配置,否则其它无关信息也将输出到jsonlog中
log4j.logger.json=DEBUG,jsonlog
log4j.additivity.json=false
log4j.appender.jsonlog=org.apache.log4j.DailyRollingFileAppender
log4j.appender.jsonlog.File = logs/jsonlog.log
log4j.appender.jsonlog.Append = true
log4j.appender.jsonlog.Threshold = INFO
log4j.appender.jsonlog.layout = org.apache.log4j.PatternLayout
log4j.appender.jsonlog.layout.ConversionPattern =%5p %d %C: %m%n

 

java创建日志的方法

 

1
Logger logger=Logger.getLoger("json");

 

第二中、xml的配置:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

    <!--
       * 1. 一个appender子元素定义一个日志输出目的地
       * 2. 一个logger子元素定义一个日志写出器
    -->
    <!-- catalina.out -->
    <appender name="consoleAppend" class="org.apache.log4j.ConsoleAppender" >
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-d{yyyy-MM-dd HH:mm:ss} [%5p][%t][%c{1}]-[%M] %m%n" />
        </layout>
    </appender>

    <!-- error log -->
    <appender name="errorAppend" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="File" value="${webapp.root}/logs/SceneTest1.log" />
        <param name="Append" value="true" />
        <param name="MaxBackupIndex" value="10" />
        <param name="MaxFileSize" value="4000000" />
        <param name="encoding" value="utf-8"/>
        <layout class="org.apache.log4j.PatternLayout" >
            <param name="PatternConverter" value="%-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n"/>
        </layout>
    </appender>

    <!--
        logger的作用:
        1.[name属性]:指定你定义Logger对象时候的name
        2. additivity : children-logger是否使用 rootLogger的配置,
           additivity在log4j默认为true。这解释了为什么有些时候,一个日志信息在屏幕上会有多次输出。
        3.还可以指定level(输出级别)、appender-ref(指定哪个append)
     -->
    <!-- loggers 定义的日志场景SceneTest1 -->
    <logger name="SceneTest1" additivity="true">
        <!-- 如果1个包想对应多个 Appender 就这样,对于每个Appender自定义的日志级别可以在Appender上加上filter -->
        <appender-ref ref="errorAppend" />
    </logger>


    <!--
        root的作用(相当于全局的意思):
        1.[priority ]:指定默认的全局输出级别
        2.[appender-ref ]:指定一些默认的append(没有指出特殊包或者类,即那些没有指定<logger>元素的append)的输出;
    -->
    <root>
        <priority value="INFO" />
        <!-- 将 logger 中 additivity=true 的日志或者没有指定<logger>的append输出到控制台 -->
        <appender-ref ref="consoleAppend" />
        <!-- 将全局的 error 日志输出到error文件中 -->
        <!--<appender-ref ref="errorAppend" />-->
    </root>

</log4j:configuration>

这两种方式大同小异。稍微做下对比就可以知道了。

除了配置文件的形式配置日志,还能通过代码动态的配置属性和文件

比如,1、动态的初始化配置代码

 /*
     * 动态获取配置信息
     */
    public static Properties getProperties(){
        Properties pp = new Properties();
        pp.put("log4j.rootLogger", "info");
        pp.put("log4j.logger.SceneTest2","debug,sceneTest2");
        pp.put("log4j.appender.sceneTest2", "org.apache.log4j.FileAppender");
        pp.put("log4j.appender.sceneTest2.File", "${webapp.root}/logs/SceneTest2.log");
        pp.put("log4j.appender.sceneTest2.layout", "org.apache.log4j.PatternLayout");
        pp.put("log4j.appender.sceneTest2.layout.ConversionPattern", "%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m -(:%L)%n");
        return pp;
    }
 

    PropertyConfigurator.configure(CoustomLogger.getProperties());

2、可以往这个logger里面添加Appender,应用于多个功能或者场景下输出到不同的日志文件等。

    public static Appender getAppender(){
        Layout layout = new PatternLayout("%d %p [%c] - %m%n");
        Appender appender = null;
        try {
            appender= new FileAppender(layout,"F://logs/sceneTest3.log");
        } catch (IOException e) {
            e.printStackTrace();
        }
        return  appender;
    }

3、最后添加这个控制台,和xml配置的<logger/>标签很类似。

        PropertyConfigurator.configure(CoustomLogger.getProperties());
        Logger logger = Logger.getLogger("SceneTest2");
        logger.addAppender(CoustomLogger.getAppender());
        logger.debug("debug logger out ");    

 

 总结,配置log4j可以通过动态和静态配置。可以实现不同的功能模块输出logger到不同的控制器


 

 如果采用静态配置文件的形式配置的话,启动方式有:

1、如果是xml配置文件,可通过web.xml的相关配置来初始化配置

,也可以在在spring bean容器中配置:

  <bean id="log4jInitialization"
          class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
        <property name="targetClass"
                  value="org.springframework.util.Log4jConfigurer" />
        <property name="targetMethod" value="initLogging" />
        <property name="arguments">
            <list>
                <value>classpath:log4j.xml</value>
            </list>
        </property>
    </bean>

 

2、如果是properties文件,则在web.xml中配置初始化

 

posted @ 2017-06-02 10:38  掏富小牛  阅读(2717)  评论(0编辑  收藏  举报