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中配置初始化

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM