springboot logback
springboot的默认日志配置
1. springboot-logback的日志介绍
1.1 默认日志的结构
- 时间日期:精确到毫秒
- 日志级别:ERROR, WARN, INFO, DEBUG or TRACE
- 进程ID
- 分隔符:--- 标识实际日志的开始
- 线程名:方括号括起来(可能会截断控制台输出)
- Logger名:通常使用源代码的类名
- 日志内容
1.2 特点
默认情况下,日志文件的大小达到10MB时会切分一次,产生新的日志文件
2. 集成方法
2.1 配置pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
2.2 日志输出
控制台输出日志的方法
- 通过启动命令设置日志的输出级别:java -jar xxx.jar --debug
- 通过配置文件设置日志的输出级别:在application.properties中增加debug=true
文件输出日志
在application.properties中设置logging.file或logging.path属性
#设置log输出的路径
logging.path=${user.dir}/logs
#设置log输出的位置
logging.file=${logging.path}/demo.log
#设置log的整体等级
logging.level.root=info
#分别设置不同模块的日志等级
logging.level.com.mateng = debug
3. 自定义日志的输出
必须要编写一个自定义日志输出的配置文件(XML),用来定义日志文件的输出位置,格式,大小等。
3.1 特点
命名规范
配置文件推荐使用*-spring.xml的文件名(如:logback-spring.xml),遵循这个命名的日志配置文件,spring boot可以为它添加一些变量。
自定义命名
如果你不想遵循这些命名规范,可以通过application.properties中的logging.config属性指定自定义的名字:
logging.config=classpath:logging-config.xml
存放位置规范
将日志的配置文件放在src/main/resources下面
3.2 如何配置
logback-spring.xml配置内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!--日志输出的位置-->
<property name="log.name" value="${user.dir}/logs/demo" />
<!--日志输出的全路径-->
<property name="log.full.name" value="${log.name}.log" />
<!--输出到控制台-->
<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} %-5level [%thread] %logger{50} : %msg%n</pattern>
</encoder>
</appender>
<!--输出到文件-->
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.full.name}</file>
<!-- 追加方式记录日志 -->
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${log.name}.%d{yyyy-MM-dd}.log</FileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度,%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{50} : %msg%n</pattern>
</encoder>
<!--日志文件最大的大小,若超过配置的10M,日志文件会以索引0开始,
命名日志文件,例如logname-2013-12-21.0.log-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
</appender>
<root level="info">
<appender-ref ref="console" />
<appender-ref ref="file" />
</root>
<!--日志输出的级别-->
<logger name="pers.mateng" level="debug"/>
</configuration>
3.2 配置属性解释
configuration属性
- scan:配置文件如果发生改变,将会被重新加载,默认值为true。
- scanPeriod:监测配置文件是否有修改的时间间隔,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。
- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
<property>配置变量
该标签主要用来声明变量,例如:
<property name="log.name" value="${user.dir}/logs/aaa" />
appender
appender用来格式化日志输出节点,有俩个属性name和class,class用来指定哪种输出策(控制台,文件、kafka,数据库等)
encoder
- %d{HH: mm:ss.SSS}——日志输出时间及格式
- %thread——输出日志的线程名字
- %-5level——日志级别,并且使用5个字符靠左对齐
- %logger{36}——class的路径名
- %msg——日志消息
- %n——换行符
RollingFileAppender
RollingFileAppender是将日志输出到文件,随着应用的运行时间越来越长,日志也会切分多个文件日志
- fileNamePattern:定义了日志的切分方式——把每一天的日志归档到一个文件中
- maxHistory:表示只保留最近30天的日志,以防止日志填满整个磁盘空间
- totalSizeCap:用来指定日志文件的上限大小,例如设置为1GB的话,那么到了这个值,就会删除旧的日志
root
root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性。可以包含零个或多个appender,添加到这个logger
logger
用来设置某一个包或者具体的某一个类的日志打印级别、以及指定
- name:用来指定受此logger约束的某一个包或者具体的某一个类。
- level:用来设置打印级别
- 常見的配置如下
<!--第一种:logger的简单配置-->
<!--继承root的级别和appender-->
<logger name="pers.mateng.controller"/>
<!--第二种:logger的复杂配置,指定级别,指定appender-->
<!--使用自定义的级别和appender-->
<logger name="pers.mateng.controller.XxxxController" level="WARN" additivity="false">
<appender-ref ref="console"/>
</logger>
4. 多环境日志输出
据不同环境(prod:生产环境,test:测试环境,dev:开发环境)来定义不同的日志输出,在 logback-spring.xml中使用 springProfile 节点来定义,方法如下
<!-- 测试环境+开发环境. 多个使用逗号隔开. -->
<springProfile name="test,dev">
<logger name="pers.mateng" level="debug" />
</springProfile>
<!-- 生产环境. -->
<springProfile name="prod">
<logger name="pers.mateng" level="error" />
</springProfile>
启动的时候加载profile
java -jar xxx.jar –spring.profiles.active=prod
5. 日志输出到DB
5.1 appender 配置
增加一个数据类型的 appender 内容如下:
<!--日志异步到数据库 -->
<appender name="db" class="ch.qos.logback.classic.db.DBAppender">
<connectionSource class="ch.qos.logback.core.db.DataSourceConnectionSource">
<!-- 也可以使用别的数据源,例如:dbcp,c3p0 -->
<dataSource class="org.apache.tomcat.jdbc.pool.DataSource">
<url>jdbc:mysql://localhost:3306/spring-boot-demo?characterEncoding=UTF-8</url>
<username>root</username>
<password>root</password>
</dataSource>
</connectionSource>
</appender>
引入appender
<root level="info">
<appender-ref ref="db" />
</root>
注意:需要在pom中引入mysql的jdbc驱动包
5.2 初始化数据库
在数据库中创建三个表
- logging_event:普通日志
- logging_event_exception:异常日志
- logging_event_property
DROP TABLE IF EXISTS `logging_event`;
CREATE TABLE `logging_event` (
`timestmp` bigint(20) NOT NULL,
`formatted_message` text NOT NULL,
`logger_name` varchar(254) NOT NULL,
`level_string` varchar(254) NOT NULL,
`thread_name` varchar(254) DEFAULT NULL,
`reference_flag` smallint(6) DEFAULT NULL,
`arg0` varchar(1000) DEFAULT NULL,
`arg1` varchar(1000) DEFAULT NULL,
`arg2` varchar(1000) DEFAULT NULL,
`arg3` varchar(1000) DEFAULT NULL,
`caller_filename` varchar(254) NOT NULL,
`caller_class` varchar(254) NOT NULL,
`caller_method` varchar(254) NOT NULL,
`caller_line` char(4) NOT NULL,
`event_id` bigint(20) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`event_id`)
) ENGINE=InnoDB AUTO_INCREMENT=4874 DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `logging_event_exception`;
CREATE TABLE `logging_event_exception` (
`event_id` bigint(20) NOT NULL,
`i` smallint(6) NOT NULL,
`trace_line` varchar(254) COLLATE utf8_bin NOT NULL,
PRIMARY KEY (`event_id`,`i`),
CONSTRAINT `logging_event_exception_ibfk_1` FOREIGN KEY (`event_id`) REFERENCES `logging_event` (`event_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
DROP TABLE IF EXISTS `logging_event_property`;
CREATE TABLE `logging_event_property` (
`event_id` bigint(20) NOT NULL,
`mapped_key` varchar(254) COLLATE utf8_bin NOT NULL,
`mapped_value` text COLLATE utf8_bin,
PRIMARY KEY (`event_id`,`mapped_key`),
CONSTRAINT `logging_event_property_ibfk_1` FOREIGN KEY (`event_id`) REFERENCES `logging_event` (`event_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
6. 日志输出到syslog
在网络设备领域,允许设备记录自己的事件、内核的问题、登录日志、定时计划等系统中的任何事件。收集这些日志并记录的进程为syslogd/rsyslog。
但是这些设备的存储是有限制的,不能无限制的存储日志,为此产生了syslog协议,用于将本地的日志传递到日志接收者(日志服务器)而长期保存并分析。syslog协议使用的是UDP,报文由PRI(包含:模块Facility和严重性Severity,PRI=Facility * 8 + Severity)、HEAD、MSG三部分组成。
此处讲解如何以syslog协议将日志发送到日志服务器,后期结合ELK使用。
6.1 增加appender
增加一个数据类型的 appender 内容如下:
<appender name="syslog" class="ch.qos.logback.classic.net.SyslogAppender">
<syslogHost>192.168.137.101</syslogHost>
<port>514</port>
<!-- facility 为事件模块,枚举类型:KERN、MAIL、AUTH、LOCAL0 -->
<facility>LOCAL0</facility>
<suffixPattern>[%thread] %logger %msg</suffixPattern>
</appender>
引入appender
<root level="info">
<appender-ref ref="syslog" />
</root>
6.2 测试
1、在192.168.137.101机器上启动一个syslog的接收服务,查看接收到的日志
2、在192.168.137.101上抓包,tcpdump -i 网卡名 udp port 514
7. 日志输出到JMS
7.1 增加appender
增加JMS类型的 appender,一下是队列和主题两种方式的appender,内容如下:
<!-- 输出到jms队列 -->
<appender name="jms-queue" class="ch.qos.logback.classic.net.JMSQueueAppender">
<initialContextFactoryName>org.apache.activemq.jndi.ActiveMQInitialContextFactory</initialContextFactoryName>
<providerURL>tcp://192.168.137.101:61616</providerURL>
<QueueConnectionFactoryBindingName>ConnectionFactory</QueueConnectionFactoryBindingName>
<!-- 这里是activemq jndi的队列名称,不是真正的队列名称 -->
<queueBindingName>logback-queue-jndi</queueBindingName>
</appender>
<!-- 输出到jms主题 -->
<appender name="jms-topic" class="ch.qos.logback.classic.net.JMSTopicAppender">
<initialContextFactoryName>org.apache.activemq.jndi.ActiveMQInitialContextFactory</initialContextFactoryName>
<providerURL>tcp://192.168.137.101:61616</providerURL>
<TopicConnectionFactoryBindingName>ConnectionFactory</TopicConnectionFactoryBindingName>
<!-- 这里是activemq jndi的主题名称,不是真正的主题名称 -->
<topicBindingName>logback-topic-jndi</topicBindingName>
</appender>
引入appender
<root level="info">
<appender-ref ref="db" />
</root>
7.2 activemq 配置
在pom中引入activemq-client.jar
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-client</artifactId>
</dependency>
增加jndi.properties
注意:logback-spring.xml中中配置的queueBindingName/topicBindingName 对应的是jndi.properties中的属性名称
queue.logback-queue-jndi = example.logback.queue
topic.logback-topic-jndi = example.logback.topic
8. 日志输出到redis
参考资料:https://github.com/kmtong/logback-redis-appender
8.1 增加appender
增加一个数据类型的 appender 内容如下:
<!-- 输出到redis -->
<appender name="redis" class="com.cwbase.logback.RedisAppender">
<!-- 项目节点名称(一个项目可能会启动多个节点),即微服务的事例 -->
<source>node1</source>
<!-- 类型,可以用项目名称 -->
<type>springboot-demo</type>
<!-- 标记(dev/test/prod) -->
<tags>dev</tags>
<host>192.168.137.101</host>
<port>6379</port>
<!-- 以key为redis的键存储每一条日志记录 -->
<key>logback</key>
</appender>
引入appender
<root level="info">
<appender-ref ref="redis" />
</root>
8.2 redis 配置
在pom中引入logback-redis包
<dependency>
<groupId>com.cwbase</groupId>
<artifactId>logback-redis-appender</artifactId>
<version>1.1.5</version>
</dependency>
9. 日志输出到logstash
参考资料:https://github.com/logstash/logstash-logback-encoder
9.1 增加appender
增加一个数据类型的 appender 内容如下:
<!-- 输出到logstash -->
<appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<param name="Encoding" value="UTF-8" />
<!-- logstash的地址,可以有多行 -->
<destination>192.168.137.101:5044</destination>
<encoder class="net.logstash.logback.encoder.LogstashEncoder">
<!-- 日志上增加的额外字段 -->
<customFields>{"appname":"springboot-demo"}</customFields>
</encoder>
</appender>
引入appender
<root level="info">
<appender-ref ref="logstash" />
</root>
9.2 pom 配置
在pom中引入logstash-logback包
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>4.11</version>
</dependency>
9.3 logstash 主要配置
input {
tcp {
port => "5044"
type => "tcp"
}
}
output {
elasticsearch {
hosts => ["elasticsearch:9200"]
index => "logstash-%{type}-%{+YYYY.MM.dd}"
}
stdout { codec => rubydebug}
}
10. 异步输出日志
在使用redis、jms、db等日志的输出形式,为了不影响正常业务,所以日志记录采用异步记录。
<appender name="async" class="ch.qos.logback.classic.AsyncAppender">
<!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
<discardingThreshold>0</discardingThreshold>
<!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
<queueSize>512</queueSize>
<appender-ref ref="redis" />
</appender>
网友评论