springboot-logback日志
logback-spring.xml
模板1
<?xml version="1.0" encoding="UTF-8"?> <configuration> <!---日志信息格式中几个符号所代表的含义 %p: 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL, %d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921 %r: 输出自应用启动到输出该log信息耗费的毫秒数 %c: 输出日志信息所属的类目,通常就是所在类的全名 %t: 输出产生该日志事件的线程名 %l: 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main (TestLog4.java:10) %x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。 %%: 输出一个”%”字符 %F: 输出日志消息产生时所在的文件名称 %L: 输出代码中的行号 %m: 输出代码中指定的消息,产生的日志具体信息 %n: 输出一个回车换行符,Windows平台为”\r\n”,Unix平台为”\n”输出日志信息换行--> <!-- %m输出的信息,%p日志级别,%t线程名,%d日期,%c类的全名,%i索引【从数字0开始递增】,,, --> <!-- 应用名称 --> <property name="APP_NAME" value="barrier-api" /> <!--日志文件的保存路径,首先查找系统属性-Dlog.dir,如果存在就使用其;否则,在当前目录下创建名为logs目录做日志存放的目录 --> <property name="LOG_HOME" value="${log.dir:-logs}/${APP_NAME}" /> <!-- 日志输出格式 1: %d %p (%file:%line\)- %m%n 2: %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{80} - %msg%n --> <property name="ENCODER_PATTERN" value="%d %p [%t-%c-%line] - %msg%n" /> <!-- appender是configuration的子节点,是负责写日志的组件。 --> <!-- ConsoleAppender:把日志输出到控制台 --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <!-- 日志级别过滤INFO以下 --> <!--<filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>INFO</level> </filter>--> <encoder> <pattern>${ENCODER_PATTERN}</pattern> <!-- 控制台也要使用UTF-8,不要使用GBK,否则会中文乱码 --> <charset>UTF-8</charset> </encoder> </appender> <!-- RollingFileAppender:滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 --> <!-- 以下的大概意思是:1.先按日期存日志,日期变了,将前一天的日志文件名重命名为XXX%日期%索引,新的日志仍然是sys.log --> <!-- 2.如果日期没有发生变化,但是当前日志的文件大小超过1KB时,对当前日志进行分割 重命名--> <appender name="${APP_NAME}" class="ch.qos.logback.core.rolling.RollingFileAppender"> <File>${LOG_HOME}.log</File> <!-- rollingPolicy:当发生滚动时,决定 RollingFileAppender 的行为,涉及文件移动和重命名。 --> <!-- TimeBasedRollingPolicy: 最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 活动文件的名字会根据fileNamePattern的值,每隔一段时间改变一次 --> <!-- 文件名:logs/sys.2017-12-05.0.log logs/api.%d.%i.log--> <fileNamePattern>${LOG_HOME}.%d.%i.log</fileNamePattern> <!-- 每产生一个日志文件,该日志文件的保存期限为30天 --> <maxHistory>30</maxHistory> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <!-- maxFileSize:这是活动文件的大小,默认值是10MB,本篇设置为1KB,只是为了演示 --> <maxFileSize>100MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <encoder> <!-- pattern节点,用来设置日志的输入格式 --> <pattern> ${ENCODER_PATTERN} </pattern> <!-- 记录日志的编码 --> <charset>UTF-8</charset> <!-- 此处设置字符集 --> </encoder> </appender> <!-- 控制台输出日志级别 --> <root level="info"> <appender-ref ref="STDOUT" /> </root> <!-- 测试环境+开发环境. 多个使用逗号隔开. --> <springProfile name="test,dev"> <logger name="org.springframework.web" level="DEBUG"> <appender-ref ref="${APP_NAME}" /> </logger> <!-- 指定项目中某个包,当有日志操作行为时的日志记录级别 --> <!-- org.iot为根包,也就是只要是发生在这个根包下面的所有日志操作行为的权限都是DEBUG 可以记录sql--> <!-- 级别依次为【从高到低】:FATAL > ERROR > WARN > INFO > DEBUG > TRACE --> <logger name="org.iot" level="DEBUG"> <appender-ref ref="${APP_NAME}" /> </logger> </springProfile> <!-- 生产环境. --> <springProfile name="prod"> <logger name="org.springframework.web" level="INFO"/> <logger name="org.iot" level="INFO"/> </springProfile> </configuration>
模板2
<?xml version="1.0" encoding="UTF-8"?> <configuration debug="false" scan="false"> <springProperty scop="context" name="spring.application.name" source="spring.application.name" defaultValue="logs"/> <property name="log.path" value="logs/${spring.application.name}"/> <!-- Console log output --> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{50}) - %highlight(%msg) %n</pattern> </encoder> </appender> <!-- Log file debug output --> <appender name="debug" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${log.path}/debug.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>${log.path}/%d{yyyy-MM}/debug.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern> <maxFileSize>50MB</maxFileSize> <maxHistory>30</maxHistory> </rollingPolicy> <encoder> <pattern>%date [%thread] %-5level [%logger{50}] %file:%line - %msg%n</pattern> </encoder> </appender> <!-- Log ferrorsrror output --> <appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${log.path}/error.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>${log.path}/%d{yyyy-MM}/error.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern> <maxFileSize>50MB</maxFileSize> <maxHistory>30</maxHistory> </rollingPolicy> <encoder> <pattern>%date [%thread] %-5level [%logger{50}] %file:%line - %msg%n</pattern> </encoder> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>ERROR</level> </filter> </appender> <!--开发环境:打印控制台--> <springProfile name="dev"> <logger name="com.cd" 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="com.alibaba.nacos.client.naming" level="off" /> </springProfile> <!--测试环境:打印控制台--> <springProfile name="test"> <logger name="com.cd" 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="com.alibaba.nacos.client.naming" level="off" /> </springProfile> <!-- Level: FATAL 0 ERROR 3 WARN 4 INFO 6 DEBUG 7 --> <root level="info"> <appender-ref ref="console"/> <appender-ref ref="debug"/> <appender-ref ref="error"/> </root> </configuration>
模板3(推荐)
<configuration> <!-- 测试商用环境使用 --> <property name="log_home" value="${user.dir}" /> <property name="separator" value="‖"></property> <springProperty scope="context" name="serverName" source="spring.application.name" defaultValue="shiro"/> <!-- 负责写日志,控制台日志 --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <Pattern>${serverName}${separator}${PID}${separator}${HOSTNAME}${separator}%d{yyyy-MM-dd HH:mm:ss.SSS}${separator}%-5level${separator}%X{index}${separator}%msg%n </Pattern> <Charset>UTF-8</Charset> </encoder> <!-- <target>System.err</target> 字符串 System.out 或者 System.err ,默认 System.out --> </appender> <!-- 不同級別的文件記錄在不同的日誌文件中 --> <appender name="FILEINFO" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--日志文件生成路径 --> <FileNamePattern>${log_home}/logs/log-info.%d{yyyy-MM-dd}.log</FileNamePattern> </rollingPolicy> <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"> <layout class="ch.qos.logback.classic.PatternLayout"> <Pattern>${serverName}${separator}${PID}${separator}${HOSTNAME}${separator}%d{yyyy-MM-dd HH:mm:ss.SSS}${separator}%-5level${separator}%X{index}${separator}%msg%n </Pattern> </layout> <Charset>UTF-8</Charset> </encoder> </appender> <appender name="FILEERROR" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--在工程目录下自动生成../log文件夹 --> <FileNamePattern>${log_home}/logs/log-error.%d{yyyy-MM-dd}.log</FileNamePattern> </rollingPolicy> <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"> <layout class="ch.qos.logback.classic.PatternLayout"> <Pattern>${serverName}${separator}${PID}${separator}${HOSTNAME}${separator}%d{yyyy-MM-dd HH:mm:ss.SSS}${separator}%-5level${separator}%X{index}${separator}%msg%n </Pattern> </layout> <Charset>UTF-8</Charset> </encoder> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <root> <level value="INFO" /> <appender-ref ref="STDOUT" /> <appender-ref ref="FILEINFO" /> <appender-ref ref="FILEERROR" /> </root> </configuration>
application.yml
# Tomcat server: tomcat: uri-encoding: UTF-8 max-threads: 1000 min-spare-threads: 30 #核心代码,设置tomcat的basedir 详细见MultipartConfig basedir: ${user.home}/tomcat/tmp port: 8081 servlet: context-path: /barrier-api # mysql spring: # 环境 dev|test|prod profiles: active: dev # jackson时间格式化 jackson: time-zone: GMT+8 date-format: yyyy-MM-dd HH:mm:ss servlet: multipart: max-file-size: 100MB max-request-size: 100MB enabled: true redis: database: 0 host: localhost port: 6379 password: # 密码(默认为空) timeout: 6000ms # 连接超时时长(毫秒) jedis: pool: max-active: 1000 # 连接池最大连接数(使用负值表示没有限制) max-wait: -1ms # 连接池最大阻塞等待时间(使用负值表示没有限制) max-idle: 10 # 连接池中的最大空闲连接 min-idle: 5 # 连接池中的最小空闲连接 mvc: throw-exception-if-no-handler-found: true static-path-pattern: /static/** resources: add-mappings: false #mybatis mybatis-plus: mapper-locations: classpath*:mapper/**/*.xml #实体扫描,多个package用逗号或者分号分隔 typeAliasesPackage: org.iot.entity global-config: #主键类型 0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID"; id-type: 0 #字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断" field-strategy: 2 #驼峰下划线转换 db-column-underline: true #刷新mapper 调试神器 refresh-mapper: true #数据库大写下划线转换 #capital-mode: true #序列接口实现类配置 #key-generator: com.baomidou.springboot.xxx #逻辑删除配置 logic-delete-value: -1 logic-not-delete-value: 0 #自定义填充策略接口实现 #meta-object-handler: com.baomidou.springboot.xxx #自定义SQL注入器 sql-injector: com.baomidou.mybatisplus.mapper.LogicSqlInjector configuration: map-underscore-to-camel-case: true cache-enabled: false call-setters-on-nulls: true iot: redis: open: false # 是否开启redis缓存 true开启 false关闭 # APP模块,是通过jwt认证的,如果要使用APP模块,则需要修改【加密秘钥】 jwt: # 加密秘钥 secret: 354c18a039ccf02680719b18b0514c6f[barrier-api] # token有效时长,2小时,单位秒 expire: 7200 header: API_TOKEN # 日志 logging: config: classpath:logback-spring.xml
在多环境的情况下,logback的日志路径需要进行针对性配置,也就是需要通过application.yml文件中进行配置。
logback自身支持以下方式配置:
<property name="log.path" value="/mnt/logs" />
但是怎样才能灵活的配置“/mnt/logs”参数呢,如果不同的环境此参数值不同,那么就需要通过application.yml文件的配置项进行指定。
logback-spring.xml 动态获取application.xml 的配置项
但是logback-spring.xml加载早于application.yml,如果直接通过${参数key}的形式获取是无法获取到对应参数值的。
因此只能使用spring提供的标签来对此参数进行配置:
<springProperty scope="context" name="LOG_HOME" source="logging.file.path"/>
对照上面的配置,其中property替换成了springProperty标签。两个配置属性name效果是一样的,只不过后者的source指向了application.yml文件中的key。注意此处不需要${}形式获取。
最怕一生碌碌无为 , 还说平凡难能可贵.