第一步:引入依赖
spring-4.3.28.RELEASE slf4j-1.7.30
<!-- slf4j-api --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.30</version> </dependency> <!-- jcl-over-slf4j --> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>1.7.30</version> </dependency> <!-- log4j-over-slf4j --> <dependency> <groupId>org.slf4j</groupId> <artifactId>log4j-over-slf4j</artifactId> <version>1.7.30</version> </dependency> <!-- jul-to-slf4j --> <dependency> <groupId>org.slf4j</groupId> <artifactId>jul-to-slf4j</artifactId> <version>1.7.30</version> </dependency> <!-- logback-ext-spring --> <dependency> <groupId>org.logback-extensions</groupId> <artifactId>logback-ext-spring</artifactId> <version>0.1.5</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>1.2.3</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-access</artifactId> <version>1.2.3</version> </dependency>
依赖引入注意事项:适配包与桥接器包不可以同时出现,否则会造成死循环,导致栈溢出错误!
第二步:web.xml配置
<context-param> <param-name>logbackConfigLocation</param-name> <param-value>classpath:/config/logback-prod.xml</param-value> </context-param> <!-- 当使用自定义Logback初始化时,此侦听器应在 ContextLoaderListener 之前注册到 web.xml文件 --> <listener> <listener-class>ch.qos.logback.ext.spring.web.LogbackConfigListener</listener-class> </listener> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
第三步:配置logback的xml文件
<?xml version="1.0" encoding="UTF-8"?> <configuration scan="true" scanPeriod="60 seconds" debug="false"> <!-- scan: 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true. scanPeriod: 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒.当scan为true时,此属性生效。默认的时间间隔为1分钟. debug: 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 --> <!-- 在Eclipse中运行,请到Eclipse的安装目录中找log文件,Tomcat下,请到Tomcat目录下找 ./logs <property name="LOG_PATH" value="${catalina.base}/logs"/> <property name="LOG_PATH" value="./logs" /> windows系统日志保存路径:<property name="LOG_PATH" value="E:/all-logs/wave-task-system" /> linux系统环境下保存路径:<property name="LOG_PATH" value="${catalina.base}/logs" />
--> <property name="LOG_PATH" value="${catalina.base}/logs" /> <timestamp key="byDay" datePattern="yyyy-MM-dd" /> <!-- 项目名称 --> <property name="PROJECT_NAME" value="xxx"/> <contextName>task</contextName> <!-- 日志输出格式: %-5level - 日志级别 %d{yyyy-MM-dd HH:mm:ss.SSS} - 日期 %c - 类的完整全路径名称 %M - 方法method %L - 或者 %line,行号 %thread - 线程名称 %m - 或者:%msg,为日志记录的信息 %n - 换行 格式化输出(配色):%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符: <pattern>%yellow(%d{yyyy-MM-dd HH:mm:ss}) %red([%thread]) %highlight(%-5level) %cyan(%logger{50}) - %magenta(%msg) %n</pattern> <pattern>%yellow(%d{yyyy-MM-dd HH:mm:ss}) %red([%thread]) %highlight(%-5level) %cyan(%logger{50}) - %magenta(%msg) %n</pattern> http://logback.qos.ch/manual/filters.html#thresholdFilter --> <property name="console-pattern" value="%yellow(%d{yyyy-MM-dd HH:mm:ss.SSS}) %highlight(%-5level) %red([%thread]) %cyan(%logger{50}) - %magenta(%msg) %n"/> <property name="file-pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %c %M %L [%thread] %msg%n" /> <pattern>%d{yyyy-MM-dd'T'HH:mm:ss.SSS} %level [%thread] [%logger{50}:%line] %msg%n</pattern> <!-- console : 控制台日志 --> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--格式化输出(配色):%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> <pattern>${console-pattern}</pattern> <!-- 日志编码一定要加上class,否则会出现中文乱码 --> <charset class="java.nio.charset.Charset">UTF-8</charset> </encoder> </appender> <!-- 配置TRACE, DEBUG, INFO, WARN, ERROR,ALL 日志的Appender --> <!-- info 日志 --> <appender name="INFO-FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 文件保存路径 --> <file>${LOG_PATH}/log-info-${byDay}.log</file> <!-- 日志消息输出格式配置 --> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>${file-pattern}</pattern> <charset class="java.nio.charset.Charset">UTF-8</charset> </encoder> <!-- 追加方式记录日志:默认:true --> <append>true</append> <!-- 指定拆分规则 --> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <!-- 按照时间和压缩格式声明拆分的文件名 %i 可以按照序号输出日志文件名 --> <fileNamePattern>${LOG_PATH}/log-info-%d{yyyy-MM-dd}-%i.log.gz</fileNamePattern> <!-- 按照文件大小拆分: 文件超过maxFileSize就开始压缩存档到:*.log.gz文件中 --> <maxFileSize>20MB</maxFileSize> <!-- 日志文件保留天数 --> <maxHistory>30</maxHistory> <!-- 存档文件的总大小最多为1GB : Total size of all archived files is at most 1GB --> <!--<totalSizeCap>1GB</totalSizeCap>--> </rollingPolicy> <triggeringPolicy> </triggeringPolicy> <!-- 日志级别过滤规则 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <!-- 日志过滤规则 --> <level>INFO</level> <!-- 超过 INFO 级别的日志进行记录,小于 INFO 级别的日志就拒绝记录到该文件中 --> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- error 日志 --> <appender name="ERROR-FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 文件保存路径 --> <file>${LOG_PATH}/log-error-${byDay}.log</file> <!-- 日志消息输出格式配置 --> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>${file-pattern}</pattern> <charset class="java.nio.charset.Charset">UTF-8</charset> </encoder> <!-- 追加方式记录日志:默认:true --> <append>true</append> <!-- 指定拆分规则 --> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <!-- 按照时间和压缩格式声明拆分的文件名 如果文件在一天内超过maxFileSize,则文件将以索引"%i"从0开始存档 --> <fileNamePattern>${LOG_PATH}/log-error-%d{yyyy-MM-dd}-%i.log.gz</fileNamePattern> <!-- 按照文件大小拆分: 文件超过maxFileSize就开始压缩存档 --> <maxFileSize>20MB</maxFileSize> <!-- 日志文件保留天数 --> <maxHistory>30</maxHistory> <!-- 存档文件的总大小最多为1GB : Total size of all archived files is at most 1GB --> <!--<totalSizeCap>1GB</totalSizeCap>--> </rollingPolicy> <!-- 日志级别过滤规则 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <!-- 日志过滤规则 --> <level>ERROR</level> <!-- 超过 error 级别的日志进行记录,小于 error 级别的日志就拒绝记录到该文件中 --> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- warn 日志 --> <appender name="WARN-FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 文件保存路径 --> <file>${LOG_PATH}/log-warn-${byDay}.log</file> <!-- 日志消息输出格式配置 --> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>${file-pattern}</pattern> <charset class="java.nio.charset.Charset">UTF-8</charset> </encoder> <!-- 追加方式记录日志:默认:true --> <append>true</append> <!-- 指定拆分归档规则 --> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <!-- 按照时间和压缩格式声明拆分的文件名 %i 可以按照序号输出日志文件名 如果文件在一天内超过maxFileSize,则文件将以索引"%i"从0开始存档 --> <fileNamePattern>${LOG_PATH}/log-warn-%d{yyyy-MM-dd HH:mm:ss}-%i.log.gz</fileNamePattern> <!-- 按照文件大小拆分 --> <maxFileSize>20MB</maxFileSize> <!-- 日志文件保留天数 --> <maxHistory>30</maxHistory> <!-- Total size of all archived files is at most 5GB --> <!--<totalSizeCap>1GB</totalSizeCap>--> </rollingPolicy> <!-- 日志级别过滤规则 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <!-- 日志过滤规则 --> <level>WARN</level> <!-- 超过 WARN 级别的日志进行记录,小于 WARN 级别的日志就拒绝记录到该文件中 --> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- debug 日志:开发需要的话可以配置输出到文件,生产不需要 --> <appender name="DEBUG-FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 文件保存路径 --> <file>${LOG_PATH}/log-debug-${byDay}.log</file> <!-- 日志消息输出格式配置 --> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>${file-pattern}</pattern> <charset class="java.nio.charset.Charset">UTF-8</charset> </encoder> <!-- 追加方式记录日志:默认:true --> <append>true</append> <!-- 指定拆分归档规则 --> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <!-- 按照时间和压缩格式声明拆分的文件名 %i 可以按照序号输出日志文件名 如果文件在一天内超过maxFileSize,则文件将以索引"%i"从0开始存档 --> <fileNamePattern>${LOG_PATH}/log-debug-%d{yyyy-MM-dd HH:mm:ss}-%i.log.gz</fileNamePattern> <!-- 按照文件大小拆分 --> <maxFileSize>10MB</maxFileSize> <!-- 日志文件保留天数 --> <maxHistory>30</maxHistory> <!-- Total size of all archived files is at most 5GB --> <!--<totalSizeCap>1GB</totalSizeCap>--> </rollingPolicy> <!-- 日志级别过滤规则: 日志文件只记录debug级别,不记录大于debug级别的日志 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>DEBUG</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- 高性能异步日志:不会自己定义执行,而是指定引用摸一个具体的 appender 执行日志收集输出 --> <!-- <appender name="async-info" class="ch.qos.logback.classic.AsyncAppender"> <!– 引用指定某个具体的 appender –> <appender-ref ref="INFO-FILE" /> </appender> <appender name="async-warn" class="ch.qos.logback.classic.AsyncAppender"> <appender-ref ref="WARN-FILE" /> </appender> <appender name="async-error" class="ch.qos.logback.classic.AsyncAppender"> <appender-ref ref="ERROR-FILE" /> </appender> --> <!-- 自定义模块日志打印: additivity - 设置为"true"才会继承并执行 root 中的日志记录器 name - 需要修改为自己项目中的合适的package --> <logger name="com.wave" level="INFO" additivity="true"> <!-- 生产环境请将STDOUT去掉!!! --> <appender-ref ref="CONSOLE" /> </logger> <logger name="org.apache.ibatis" level="DEBUG" additivity="true"> <!-- 生产环境请将STDOUT去掉!!! --> <appender-ref ref="CONSOLE" /> </logger> <logger name="org.mybatis" level="DEBUG" additivity="true"> <!-- 生产环境请将STDOUT去掉!!! --> <appender-ref ref="CONSOLE" /> </logger> <!--spring log configure--> <logger name="org.springframework" level="info"/> <!--myibatis log configure--> <logger name="java.sql" level="DEBUG"/> <logger name="java.sql.Connection" level="DEBUG" /> <logger name="java.sql.Statement" level="DEBUG" /> <logger name="java.sql.PreparedStatement" level="DEBUG" /> <logger name="org.apache.ibatis" level="DEBUG"/> <logger name="com.mysql.jdbc" level="DEBUG"/> <logger name="com.wave.dao" level="DEBUG"/> <!-- root logger : 如果需要关注性能,这里可以ref引入 异步日志的 appender,如:async-info --> <root level="INFO"> <appender-ref ref="CONSOLE" /> <appender-ref ref="INFO-FILE" /> <appender-ref ref="WARN-FILE" /> <appender-ref ref="ERROR-FILE" /> </root> </configuration>