Logback教程:创建maven工程,打印到控制台,输出到文件中 作者:马育民 • 2021-01-24 15:55 • 阅读:10119 # 创建普通maven工程 略 # 修改pom.xml 添加下面依赖: ``` <dependencies> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency> </dependencies> ``` # logback.xml 配置文件 在 `resources` 文件夹下创建 `logback.xml` 文件,内容如下: ``` <?xml version="1.0" encoding="UTF-8"?> <!-- scan="true"开启对配置信息的自动扫描(默认时间为60秒扫描一次) 注:当此文件的配置信息发生变化时,此设置的作用就体现出来了,不需要重启服务 --> <configuration scan="true"> <!-- 通过property标签,来存放key-value数据,便于后面的动态获取,提高程序的灵活性 --> <property name="log-dir" value="log" /> <property name="log-name" value="logFile" /> <!-- 配置appender(对日志的处理方法,可以配置多个) --> <!-- name:自定义, class:加载指定类(ch.qos.logback.core.ConsoleAppender类将日志输出到控制台), pattern:指定输出的日志格式 --> <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36}:%L- %msg%n</pattern> <!-- 日志编码 --> <charset class="java.nio.charset.Charset">UTF-8</charset> </encoder> </appender> <!-- name:自定义, class:加载指定类(ch.qos.logback.core.rolling.RollingFileAppender类会将日志输出到指定的文件中), FileNamePattern:文件的全路径名模板 (注:如果最后结尾是gz或者zip等的话,那么会自动打成相应压缩包) --> <appender name="fileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 把日志文件输出到:项目启动的目录下的log文件夹(无则自动创建)下 --> <!-- 把日志文件输出到:name为log-dir的property标签指定的位置下 --> <file>${log-dir}/${log-name}.log</file> <!-- rollingPolicy:滚动策略,都会将该天的日志存为指定的格式的文件 --> <!-- TimeBasedRollingPolicy策略,每天结束时,会将过时的日志,另存到指定的文件中(无该文件则创建) --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 把过时日志改名,改成 fileNamePattern 格式的名字 --> <!-- 设置过时时间(单位:<fileNamePattern>标签中%d里最小的时间单位) --> <fileNamePattern>${log-dir}/${log-name}.%d{yyyy-MM-dd}.%i.log</fileNamePattern> <!-- 保留7天的日志,之前的日志会删除掉 --> <MaxHistory> 7 </MaxHistory> <!-- 滚动策略可以嵌套; 这里嵌套了一个SizeAndTimeBasedFNATP策略, 主要目的是: 在每天都会拆分日志的前提下, 当该天的日志大于规定大小时, 也进行拆分并以【%i】进行区分,i从0开始 --> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>5MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <encoder> <!-- 日志输出格式 --> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36}:%L- %msg%n</pattern> <!-- 日志编码,windows默认为GBK,要改成 UTF-8 --> <charset class="java.nio.charset.Charset">UTF-8</charset> </encoder> </appender> <!-- >>>>>>>>>>>>>>>>>>>>>>>>>配置logger(可以配置多个)>>>>>>>>>>>>>>>>>>>>>>>>> --> <!-- 指定[哪个包]下使用[哪个appender],并设置 记录到日志文件中的日志的最下 级别(低于次级别的日志信息不回输出记录到日志文件中) 注:日志级别有: trace|debug|info|warn|error|fatal 注:当有多处指定了要记录的日志的最下日志级别时,走优先级最高的,优先级: logback-spring.xml中 > 启动jar包时 > xxx.properties/xxx.yml中 --> <logger name="top.malaoshi.mapper" level="debug" /> <!-- root:logger的根节点,appender-ref:确定使用哪个appender level:对整体设置级别,该级别不会影响<logger level=""/> 中的级别 注:如果不指定配置此项,logback不生效 --> <root level="info"> <appender-ref ref="consoleAppender" /> <appender-ref ref="fileAppender" /> </root> </configuration> ``` **重点:** - `<root level="info">` 定义的日志级别是 `info`,大于等于该级别的打印日志,才会执行 - `<logger name="top.malaoshi.mapper" level="debug" />` 包下的日志级别是 `debug` ,不受`<root level="info">` 的控制 配置详见: https://www.cnblogs.com/ryelqy/p/10314147.html # 测试类 ### Mapper ``` package top.malaoshi.mapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class Mapper { static final Logger log= LoggerFactory.getLogger(Mapper.class); public static void test(){ String content="测试:abc 123 中文"; log.trace("trace级别:: {}-{}",content); log.debug("debug级别:: {}-{}",content); log.info("info级别:: {}-{}",content); log.warn("warn级别:: {}-{}",content); log.error("error级别:: {}-{}",content); } } ``` ### 主启动类 ``` package top.malaoshi; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import top.malaoshi.mapper.Mapper; public class Main { static final Logger log= LoggerFactory.getLogger(Main.class); public static void main(String[] args) { String content="hello world!--测试中文"; log.trace("trace级别:: {}-{}",content); log.debug("debug级别:: {}-{}",content); log.info("info级别:: {}-{}",content); log.warn("warn级别:: {}-{}",content); log.error("error级别:: {}-{}",content); Mapper.test(); } } ``` 显示结果: ``` 16:25:28.281 [main] INFO top.malaoshi.Main:14- info级别:: hello world! 16:25:28.284 [main] WARN top.malaoshi.Main:15- warn级别:: hello world! 16:25:28.284 [main] ERROR top.malaoshi.Main:16- error级别:: hello world! 16:25:05.565 [main] DEBUG top.malaoshi.mapper.Mapper:13- debug级别:: abc123 16:25:05.566 [main] INFO top.malaoshi.mapper.Mapper:14- info级别:: abc123 16:25:05.566 [main] WARN top.malaoshi.mapper.Mapper:15- warn级别:: abc123 16:25:05.566 [main] ERROR top.malaoshi.mapper.Mapper:16- error级别:: abc123 ``` ### 为什么显示下面3行? ``` 16:25:28.281 [main] INFO top.malaoshi.Main:14- info级别:: hello world! 16:25:28.284 [main] WARN top.malaoshi.Main:15- warn级别:: hello world! 16:25:28.284 [main] ERROR top.malaoshi.Main:16- error级别:: hello world! ``` 原因:由于在配置文件中设置了: ``` <root level="info"> <appender-ref ref="consoleAppender" /> <appender-ref ref="fileAppender" /> </root> ``` 所以,只有 `日志打印级别 >= info`,才会显示到控制台,写入到文件中 ### 为什么显示下面4行? 下面显示了 `debug` 级别的日志,不符合 `日志打印级别 >= info` ``` 16:25:05.565 [main] DEBUG top.malaoshi.mapper.Mapper:13- debug级别:: abc123 16:25:05.566 [main] INFO top.malaoshi.mapper.Mapper:14- info级别:: abc123 16:25:05.566 [main] WARN top.malaoshi.mapper.Mapper:15- warn级别:: abc123 16:25:05.566 [main] ERROR top.malaoshi.mapper.Mapper:16- error级别:: abc123 ``` 原因:由于在配置文件中设置了: ``` <logger name="top.malaoshi.mapper" level="debug" /> ``` 所以,`top.malaoshi.mapper` 包及其子包的有效级别是`debug`,也就是说 `日志打印级别 >= debug`,就会显示到控制台,写入到文件中 **即:不受下面配置的控制:** ``` <root level="info"> <appender-ref ref="consoleAppender" /> <appender-ref ref="fileAppender" /> </root> ``` 原文出处:/show_1IXStZM0rZW.html