Logback是由log4j创始人设计的又一个开源日志组件。logback当前分成三个模块:logback-core,logback- classic和logback-access。logback-core是其它两个模块的基础模块。logback-classic是log4j的一个 改良版本。此外logback-classic完整实现SLF4J API使你可以很方便地更换成其它日志系统如log4j或JDK14 Logging。logback-access访问模块与Servlet容器集成提供通过Http来访问日志的功能。
下面就举例介绍一下如何在项目中使用logback:
1. Send logs to Console
所有的日志都将会重定向到控制台.
logback.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <configuration>
-
- <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
- <layout class="ch.qos.logback.classic.PatternLayout">
- <Pattern>
- %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
- </Pattern>
- </layout>
- </appender>
-
- <logger name="com.mkyong.web" level="debug" additivity="false">
- <appender-ref ref="STDOUT" />
- </logger>
-
- <root level="error">
- <appender-ref ref="STDOUT" />
- </root>
-
- </configuration>
2、Send logs to File
所有的日志将会重定向到c:/logs/debug.log
文件中,而且这个日志文件将会每天归档或者当文件大小超过10MB的时候
logback.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <configuration>
-
- <property name="DEV_HOME" value="c:/logs" />
-
- <appender name="FILE-AUDIT" class="ch.qos.logback.core.rolling.RollingFileAppender">
- <file>${DEV_HOME}/debug.log</file>
- <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
- <Pattern>
- %d{yyyy-MM-dd HH:mm:ss} - %msg%n
- </Pattern>
- </encoder>
-
- <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
- <!-- rollover daily -->
- <fileNamePattern>${DEV_HOME}/archived/debug.%d{yyyy-MM-dd}.%i.log
- </fileNamePattern>
- <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
- <maxFileSize>10MB</maxFileSize>
- </timeBasedFileNamingAndTriggeringPolicy>
- </rollingPolicy>
-
- </appender>
-
- <logger name="com.mkyong.web" level="debug" additivity="false">
- <appender-ref ref="FILE-AUDIT" />
- </logger>
-
- <root level="error">
- <appender-ref ref="FILE-AUDIT" />
- </root>
-
- </configuration>
3. Send logs to Console and File
logback.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <configuration>
-
- <property name="DEV_HOME" value="c:/logs" />
-
- <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
- <layout class="ch.qos.logback.classic.PatternLayout">
- <Pattern>
- %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
- </Pattern>
- </layout>
- </appender>
-
- <appender name="FILE-AUDIT" class="ch.qos.logback.core.rolling.RollingFileAppender">
- <file>${DEV_HOME}/debug.log</file>
- <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
- <Pattern>
- %d{yyyy-MM-dd HH:mm:ss} - %msg%n
- </Pattern>
- </encoder>
-
- <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
- <!-- rollover daily -->
- <fileNamePattern>${DEV_HOME}/archived/debug.%d{yyyy-MM-dd}.%i.log
- </fileNamePattern>
- <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
- <maxFileSize>10MB</maxFileSize>
- </timeBasedFileNamingAndTriggeringPolicy>
- </rollingPolicy>
-
- </appender>
-
- <appender name="FILE-ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
- <file>${DEV_HOME}/error.log</file>
- <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
- <Pattern>
- %d{yyyy-MM-dd HH:mm:ss} - %msg%n
- </Pattern>
- </encoder>
-
- <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
- <!-- rollover daily -->
- <fileNamePattern>${DEV_HOME}/archived/error.%d{yyyy-MM-dd}.%i.log
- </fileNamePattern>
- <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
- <maxFileSize>10MB</maxFileSize>
- </timeBasedFileNamingAndTriggeringPolicy>
- </rollingPolicy>
-
- </appender>
-
- <!-- Send logs to both console and file audit -->
- <logger name="com.mkyong.web" level="debug" additivity="false">
- <appender-ref ref="FILE-AUDIT" />
- <appender-ref ref="STDOUT" />
- </logger>
-
- <root level="error">
- <appender-ref ref="FILE-ERROR" />
- </root>
-
- </configuration>
4、SiftingAppender example
把日志输出到分开的日志文件中,这个日志文件名称通过MDC在运行时定义.
logback.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <configuration>
-
- <property name="DEV_HOME" value="c:/logs" />
-
- <appender name="FILE-THREAD" class="ch.qos.logback.classic.sift.SiftingAppender">
-
- <discriminator>
- <key>logFileName</key>
- <defaultValue>head0</defaultValue>
- </discriminator>
-
- <sift>
-
- <appender name="FILE-${logFileName}" class="ch.qos.logback.core.rolling.RollingFileAppender">
- <file>${DEV_HOME}/${logFileName}.log</file>
-
- <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
- <Pattern>
- %d{yyyy-MM-dd HH:mm:ss} [%thread] %level %logger{35} - %msg%n
- </Pattern>
- </encoder>
-
- <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
- <FileNamePattern>${DEV_HOME}/${logFileName}.%i.log.zip
- </FileNamePattern>
- <MinIndex>1</MinIndex>
- <MaxIndex>10</MaxIndex>
- </rollingPolicy>
-
- <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
- <MaxFileSize>10MB</MaxFileSize>
- </triggeringPolicy>
-
- </appender>
-
- </sift>
- </appender>
-
- <logger name="com.mkyong.web" level="debug" additivity="false">
- <appender-ref ref="FILE-THREAD" />
- </logger>
-
- <root level="error">
- <appender-ref ref="FILE-THREAD" />
- </root>
-
- </configuration>
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import org.slf4j.MDC;
-
- //...
- public void run() {
-
- MDC.put('logFileName',"head1");
-
- logger.debug("hello");
-
- MDC.remove('logFileName');
-
- }
可以查看完全的例子: Logback SiftingAppender example.
5、Set log file name programmatically
以System.setProperty的方式以编程式的命名日志名称为${log.name}.
logback.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <configuration>
-
- <property name="USER_HOME" value="/home/mkyong/ant/logs" />
-
- <appender name="FILE-ENGINE-ERROR" class="ch.qos.logback.core.FileAppender">
- <file>${USER_HOME}/${log.name}.error</file>
- <encoder>
- <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
- </encoder>
- </appender>
-
- <appender name="FILE-ENGINE" class="ch.qos.logback.core.FileAppender">
- <file>${USER_HOME}/${log.name}.log</file>
- <encoder>
- <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{35} - %msg%n</pattern>
- </encoder>
- </appender>
-
- <logger name="com.mkyong.core" level="debug" additivity="false">
- <appender-ref ref="FILE-ENGINE" />
- </logger>
-
- <root level="error">
- <appender-ref ref="FILE-ENGINE-ERROR" />
- </root>
-
- </configuration>
TestRunApp.java
- package com.mkyong.core;
-
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
-
- public class TestRunApp {
-
- //No static,else log.name.IS_UNDEFINED.log
- private final Logger logger = LoggerFactory.getLogger(TestRunApp.class);
-
- public static void main(String[] args) {
-
- //Set this before the logger start.
- System.setProperty("log.name","abcdefg");
-
- TestRunApp obj = new TestRunApp();
- obj.start();
-
- }
-
- private void start() {
-
- logger.debug("------ Starting Ant------");
- //...
- }
-
- }
and Output:
- Debug log file path
- /home/mkyong/ant/logs/abcdefg.log
-
- Error log file path
- /home/mkyong/ant/logs/abcdefg.error
可以查看完全的例子: [Logback – Set log file name programmatically](Logback – Set log file name programmatically)
官方网站:http://logback.qos.ch/manual/introduction.html
推荐阅读:logback 配置详解