logback 配置

来源:互联网 发布:sql创建临时表 编辑:程序博客网 时间:2024/05/20 14:43

logback依據以下初始化步驟來配置自己:


1,logback试图在classpath中找到一个名为logback.groovy的文件。


2,如果没有找到这样的文件,logback试图在classpath中找到一个名为的logback-的test.xml的文件。


3,如果没有找到这样的文件,它会检查在classpath中的logback.xml文件..


4,如果没有这样的文件被发现,且执行的JVM具有的ServiceLoader(JDK 6以上),ServiceLoader将用于解决對com.qos.logback.classic.spi.Configurator的实现。找到的第一个实现将被使用。有关详细信息,请参阅 ServiceLoader documentation for more details。


5,如果上面的没有成功,logback会自动使用BasicConfigurator來配置自己,这将导致日志定向输出到控制台。


自動配置

假设logback的配置文件logback-test.xml或logback.xml不存在,logback将默认调用BasicConfigurator,設置最精簡配置。这个最小的配置包括一个ConsoleAppender設置在root logger下。 使用PatternLayoutEncoder進行輸出格式化,格式爲 %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n。此外,在默认情况下根记录器被指定爲debug级别。

package manual.configuration;import org.slf4j.Logger;import org.slf4j.LoggerFactory;public class MyApp1 {  final static Logger logger = LoggerFactory.getLogger(MyApp1.class);  public static void main(String[] args) {    logger.info("Entering application.");    Foo foo = new Foo();    foo.doIt();    logger.info("Exiting application.");  }}
package chapters.configuration;  import org.slf4j.Logger;import org.slf4j.LoggerFactory;   public class Foo {  static final Logger logger = LoggerFactory.getLogger(Foo.class);    public void doIt() {    logger.debug("Did it again!");  }}


輸出:
16:06:09.031 [main] INFO  chapters.configuration.MyApp1 - Entering application.
16:06:09.046 [main] DEBUG chapters.configuration.Foo - Did it again!
16:06:09.046 [main] INFO  chapters.configuration.MyApp1 - Exiting application.


使用logback-test.xml 或 logback.xml配置

<configuration>  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">    <!-- encoders are assigned the type         ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->    <encoder>      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>    </encoder>  </appender>  <root level="debug">    <appender-ref ref="STDOUT" />  </root></configuration>

這種配置的效果等同於前面提到的自動配置

<configuration debug="true">   <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">     <!-- encoders are  by default assigned the type         ch.qos.logback.classic.encoder.PatternLayoutEncoder -->    <encoder>      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>    </encoder>  </appender>  <root level="debug">    <appender-ref ref="STDOUT" />  </root></configuration>
在<configuration>中设置调试属性元素,将输出status信息
<configuration scan="true" scanPeriod="30 seconds" >   ...</configuration> 

logback配置文件更改時,可以自動扫描發現,并自动重新配置。(默認爲間隔60秒掃描)


logback將其内部状态数据收集在一个StatusManager对象中,可经由LoggerContext访问。

在WEB-INF/web.xml文件增加以下內容,從而添加相關servlet到web application中,可通過http://host/yourWebapp/lbClassicStatus訪問。

  <servlet>    <servlet-name>ViewStatusMessages</servlet-name>    <servlet-class>ch.qos.logback.classic.ViewStatusMessagesServlet</servlet-class>  </servlet>  <servlet-mapping>    <servlet-name>ViewStatusMessages</servlet-name>    <url-pattern>/lbClassicStatus</url-pattern>  </servlet-mapping>

配置語法

例子程序

package chapters.configuration;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import ch.qos.logback.classic.LoggerContext;import ch.qos.logback.classic.joran.JoranConfigurator;import ch.qos.logback.core.joran.spi.JoranException;import ch.qos.logback.core.util.StatusPrinter;public class MyApp3 {  final static Logger logger = LoggerFactory.getLogger(MyApp3.class);  public static void main(String[] args) {    // assume SLF4J is bound to logback in the current environment    LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();        try {      JoranConfigurator configurator = new JoranConfigurator();      configurator.setContext(context);      // Call context.reset() to clear any previous configuration, e.g. default       // configuration. For multi-step configuration, omit calling context.reset().      context.reset();       configurator.doConfigure(args[0]);    } catch (JoranException je) {      // StatusPrinter will handle this    }    StatusPrinter.printInCaseOfErrorsOrWarnings(context);    logger.info("Entering application.");    Foo foo = new Foo();    foo.doIt();    logger.info("Exiting application.");  }}
package chapters.configuration;  import org.slf4j.Logger;import org.slf4j.LoggerFactory;   public class Foo {  static final Logger logger = LoggerFactory.getLogger(Foo.class);    public void doIt() {    logger.debug("Did it again!");  }}



对于一个给定的标签名,如果不能确定,遵守按照驼峰约定几乎总是正确的习惯。


Logger配置

<configuration>  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">    <!-- encoders are assigned the type         ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->    <encoder>      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>    </encoder>  </appender>  <logger name="chapters.configuration" level="INFO"/>  <!-- Strictly speaking, the level attribute is not necessary since -->  <!-- the level of the root level is set to DEBUG by default.       -->  <root level="DEBUG">              <appender-ref ref="STDOUT" />  </root>    </configuration>
進行如上配置,輸出:
17:34:07.578 [main] INFO  chapters.configuration.MyApp3 - Entering application.
17:34:07.578 [main] INFO  chapters.configuration.MyApp3 - Exiting application.


<configuration>  <appender name="STDOUT"    class="ch.qos.logback.core.ConsoleAppender">    <encoder>      <pattern>        %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n     </pattern>    </encoder>  </appender>  <logger name="chapters.configuration" level="INFO" />  <logger name="chapters.configuration.Foo" level="DEBUG" />  <root level="DEBUG">    <appender-ref ref="STDOUT" />  </root></configuration>
輸出

17:39:27.593 [main] INFO  chapters.configuration.MyApp3 - Entering application.
17:39:27.593 [main] DEBUG chapters.configuration.Foo - Did it again!
17:39:27.593 [main] INFO  chapters.configuration.MyApp3 - Exiting application.

此時logger的級別情況:

Logger nameAssigned LevelEffective LevelrootDEBUGDEBUGchapters.configurationINFOINFOchapters.configuration.MyApp3nullINFOchapters.configuration.FooDEBUGDEBUG

<configuration>  <appender name="STDOUT"   class="ch.qos.logback.core.ConsoleAppender">   <encoder>     <pattern>        %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n      </pattern>    </encoder>  </appender>  <logger name="chapters.configuration" level="INFO" />  <!-- turn OFF all logging (children can override) -->  <root level="OFF">    <appender-ref ref="STDOUT" />  </root></configuration>


此時logger的級別情況:

Logger nameAssigned LevelEffective LevelrootOFFOFFchapters.configurationINFOINFOchapters.configuration.MyApp3nullINFOchapters.configuration.FoonullINFO

輸出

17:52:23.609 [main] INFO chapters.configuration.MyApp3 - Entering application.
17:52:23.609 [main] INFO chapters.configuration.MyApp3 - Exiting application.


Appender配置


<configuration>  <appender name="FILE" class="ch.qos.logback.core.FileAppender">    <file>myApp.log</file>    <encoder>      <pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n</pattern>    </encoder>  </appender>  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">    <encoder>      <pattern>%msg%n</pattern>    </encoder>  </appender>  <root level="debug">    <appender-ref ref="FILE" />    <appender-ref ref="STDOUT" />  </root></configuration>

<configuration>  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">    <encoder>      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>    </encoder>  </appender>  <logger name="chapters.configuration">    <appender-ref ref="STDOUT" />  </logger>  <root level="debug">    <appender-ref ref="STDOUT" />  </root></configuration>
默認下,appender是繼承並累積的。

輸出

14:25:36.343 [main] INFO  chapters.configuration.MyApp3 - Entering application.
14:25:36.343 [main] INFO  chapters.configuration.MyApp3 - Entering application.
14:25:36.359 [main] DEBUG chapters.configuration.Foo - Did it again!
14:25:36.359 [main] DEBUG chapters.configuration.Foo - Did it again!
14:25:36.359 [main] INFO  chapters.configuration.MyApp3 - Exiting application.
14:25:36.359 [main] INFO  chapters.configuration.MyApp3 - Exiting application.


<configuration>  <appender name="FILE" class="ch.qos.logback.core.FileAppender">    <file>myApp.log</file>    <encoder>      <pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n</pattern>    </encoder>  </appender>  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">    <encoder>      <pattern>%msg%n</pattern>    </encoder>  </appender>  <logger name="chapters.configuration">    <appender-ref ref="FILE" />  </logger>  <root level="debug">    <appender-ref ref="STDOUT" />  </root></configuration>


<configuration>  <appender name="FILE" class="ch.qos.logback.core.FileAppender">    <file>foo.log</file>    <encoder>      <pattern>%date %level [%thread] %logger{10} [%file : %line] %msg%n</pattern>    </encoder>  </appender>  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">    <encoder>      <pattern>%msg%n</pattern>    </encoder>  </appender>  <logger name="chapters.configuration.Foo" additivity="false">    <appender-ref ref="FILE" />  </logger>  <root level="debug">    <appender-ref ref="STDOUT" />  </root></configuration>

本例中,logger  chapters.configuration.Foo將其相加标志设置为false,將不會繼承父類的appenders。


設置loggercontext名字

<configuration>  <contextName>myAppName</contextName>  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">    <encoder>      <pattern>%d %contextName [%t] %level %logger{36} - %msg%n</pattern>    </encoder>  </appender>  <root level="debug">    <appender-ref ref="STDOUT" />  </root></configuration>

變量替換

<configuration>  <property name="USER_HOME" value="/home/sebastien" />  <appender name="FILE" class="ch.qos.logback.core.FileAppender">    <file>${USER_HOME}/myApp.log</file>    <encoder>      <pattern>%msg%n</pattern>    </encoder>  </appender>  <root level="debug">    <appender-ref ref="FILE" />  </root></configuration>

<configuration>  <property file="src/main/java/chapters/configuration/variables1.properties" />  <appender name="FILE" class="ch.qos.logback.core.FileAppender">     <file>${USER_HOME}/myApp.log</file>     <encoder>       <pattern>%msg%n</pattern>     </encoder>   </appender>   <root level="debug">     <appender-ref ref="FILE" />   </root></configuration>
您也可以引用在类路径下的资源而不是一个文件。
<configuration>  <property resource="resource1.properties" />  <appender name="FILE" class="ch.qos.logback.core.FileAppender">     <file>${USER_HOME}/myApp.log</file>     <encoder>       <pattern>%msg%n</pattern>     </encoder>   </appender>   <root level="debug">     <appender-ref ref="FILE" />   </root></configuration>

變量作用域

 3種,local ,context ,system ,默認爲local。

<configuration>  <property scope="context" name="nodeId" value="firstNode" />  <appender name="FILE" class="ch.qos.logback.core.FileAppender">    <file>/opt/${nodeId}/myApp.log</file>    <encoder>      <pattern>%msg%n</pattern>    </encoder>  </appender>  <root level="debug">    <appender-ref ref="FILE" />  </root></configuration>


0 0
原创粉丝点击