美文网首页
A.5 springboot logback

A.5 springboot logback

作者: 成长的键盘手 | 来源:发表于2018-02-11 16:18 被阅读0次

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 日志输出

控制台输出日志的方法

  1. 通过启动命令设置日志的输出级别:java -jar xxx.jar --debug
  2. 通过配置文件设置日志的输出级别:在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>

11. 源码

springboot-demo-4

相关文章

网友评论

      本文标题:A.5 springboot logback

      本文链接:https://www.haomeiwen.com/subject/adtltftx.html