共计 4809 个字符,预计需要花费 13 分钟才能阅读完成。
上文中,我们实现了将 LogBack 的日志信息实时的推送到日志服务器的功能。但实时进行推送,必然会增加日志服务器的压力。本文将阐述另一种定时推送的方法,以减轻日志服务器的压力。
目标:每 10 秒钟统一推送这期间产生的日志
示例代码地址
https://github.com/mengyunzhi/springBootSampleCode/tree/master/log-back 开发环境: java1.8 + spring-boot:2.1.2
定义 application.properties
为了与官方文档更加统一,在此,我们如下定义 application.properties
# URL
logback.loggly.endpointUrl=http://localhost:8081/log
配置 logback-spring.xml
<?xml version=”1.0″ encoding=”UTF-8″?>
<!– 启用 debug 模式后,将在 `spring-boot 大 LOG` 上方打印中 logBack 的配置信息 –>
<configuration debug=”true” scan=”false” scanPeriod=”30 seconds”>
<!– 引入 application 配置信息 –>
<springProperty scope=”context” name=”logback.loggly.endpointUrl” source=”logback.loggly.endpointUrl”
defaultValue=”localhost”/>
<!– 包含配置文件 org/springframework/boot/logging/logback/defaults.xml–>
<include resource=”org/springframework/boot/logging/logback/defaults.xml”/>
<!– 定义变量 LOG_FILE,值为 ${LO…}–>
<property name=”LOG_FILE” value=”${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/spring.log}”/>
<!– 包含配置文件,该配置文件中,定义了 控制台日志是按什么规则,什么形式输出的 –>
<include resource=”org/springframework/boot/logging/logback/console-appender.xml”/>
<!– 包含配置文件,该配置文件中,定义了 文件日志是按什么规则,什么形式输出的 –>
<include resource=”org/springframework/boot/logging/logback/file-appender.xml”/>
<!– 引入第三方 appender, 起名为 http–>
<appender name=”HTTP” class=”ch.qos.logback.ext.loggly.LogglyAppender”>
<!– 请求的地址 –>
<endpointUrl>${logback.loggly.endpointUrl}</endpointUrl>
<!– 定义过滤器 –>
<filter class=”com.mengyunzhi.sample.logback.Filter”/>
<!– 定义输出格式 JSON–>
<layout class=”ch.qos.logback.contrib.json.classic.JsonLayout”>
<jsonFormatter
class=”ch.qos.logback.contrib.jackson.JacksonJsonFormatter”>
<prettyPrint>true</prettyPrint>
</jsonFormatter>
<timestampFormat>yyyy-MM-dd’ ‘HH:mm:ss.SSS</timestampFormat>
</layout>
</appender>
<!– 引用第三方 appender, 起名为 batchHttp–>
<appender name=”batchHttp” class=”ch.qos.logback.ext.loggly.LogglyBatchAppender”>
<endpointUrl>${logback.loggly.endpointUrl}</endpointUrl>
<flushIntervalInSeconds>10</flushIntervalInSeconds>
<!– 定义输出格式 JSON–>
<layout class=”ch.qos.logback.contrib.json.classic.JsonLayout”>
<jsonFormatter
class=”ch.qos.logback.contrib.jackson.JacksonJsonFormatter”>
<prettyPrint>true</prettyPrint>
</jsonFormatter>
</layout>
</appender>
<!– 定义日志等级 –>
<root level=”INFO”>
<!– 启用第一个 appender 为 CONSOLE, 该名称定义于 org/springframework/boot/logging/logback/console-appender.xml 中 –>
<appender-ref ref=”CONSOLE”/>
<!– 启用第二个 appender 为 FILE, 该名称定义于 org/springframework/boot/logging/logback/file-appender.xml 中 –>
<appender-ref ref=”FILE”/>
<!– 启用第三个 appender 为 HTTP–>
<!–<appender-ref ref=”HTTP”/>–>
<!– 启用第 4 个 appender 为 batchHttp–>
<appender-ref ref=”batchHttp”/>
</root>
</configuration>
主要变更信息如下:
为了更好的和官方同步,将变量名称由 logUrl 变更为:logback.loggly.endpointUrl
引用了新的变量信息: logback.loggly.endpointUrl
加了新的 appender -> batchHttp
启动测试
启动 service 子模块,启动本项目。打开浏览器,并访问:http://localhost:8080/send
发送方日志:
2019-03-25 15:29:02.093 INFO 28934 — [nio-8080-exec-6] c.m.sample.logback.LogBackApplication : info
2019-03-25 15:29:02.093 WARN 28934 — [nio-8080-exec-6] c.m.sample.logback.LogBackApplication : warn
2019-03-25 15:29:02.093 ERROR 28934 — [nio-8080-exec-6] c.m.sample.logback.LogBackApplication : error
2019-03-25 15:29:11.564 INFO 28934 — [nio-8080-exec-8] c.m.sample.logback.LogBackApplication : info
2019-03-25 15:29:11.565 WARN 28934 — [nio-8080-exec-8] c.m.sample.logback.LogBackApplication : warn
2019-03-25 15:29:11.565 ERROR 28934 — [nio-8080-exec-8] c.m.sample.logback.LogBackApplication : error
挡收方日志
2019-03-25 15:29:08.286 INFO 28428 — [nio-8081-exec-9] c.m.s.l.service.ServiceApplication : {“timestamp” : “1553498942093”, “level” : “INFO”, “thread” : “http-nio-8080-exec-6”, “logger” : “com.mengyunzhi.sample.logback.LogBackApplication”, “message” : “info”, “context” : “default”}{“timestamp” : “1553498942093”, “level” : “WARN”, “thread” : “http-nio-8080-exec-6”, “logger” : “com.mengyunzhi.sample.logback.LogBackApplication”, “message” : “warn”, “context” : “default”}{“timestamp” : “1553498942093”, “level” : “ERROR”, “thread” : “http-nio-8080-exec-6”, “logger” : “com.mengyunzhi.sample.logback.LogBackApplication”, “message” : “error”, “context” : “default”}
2019-03-25 15:29:18.289 INFO 28428 — [nio-8081-exec-1] c.m.s.l.service.ServiceApplication : {“timestamp” : “1553498951564”, “level” : “INFO”, “thread” : “http-nio-8080-exec-8”, “logger” : “com.mengyunzhi.sample.logback.LogBackApplication”, “message” : “info”, “context” : “default”}{“timestamp” : “1553498951565”, “level” : “WARN”, “thread” : “http-nio-8080-exec-8”, “logger” : “com.mengyunzhi.sample.logback.LogBackApplication”, “message” : “warn”, “context” : “default”}{“timestamp” : “1553498951565”, “level” : “ERROR”, “thread” : “http-nio-8080-exec-8”, “logger” : “com.mengyunzhi.sample.logback.LogBackApplication”, “message” : “error”, “context” : “default”}
我们发现:发送方于 29 分 02 秒时,生成了 3 条日志;接收方于 29 分 08 秒接收到了 1 条日志,该日志包括了上面 3 条日志信息。发送方于 29 分 11 秒时,生成了 3 条日志;接收方于 29 分 18 秒(距离上次接收的间隔为 10 秒)接收到了第 2 条日志,该日志包括了 29 分 11 秒时生成的 3 条日志信息。
总结
对于小白级别的我们而言,我们想到的,别人其它早就实现了。所以大多数的我们,最终比接是 DEBUG 的能力、看文档的能力、对软件工程理解的能力、对业务的掌控能力。而编码能力,则是基本功,没有它不行,只有它也不行。
参考文档:https://github.com/qos-ch/logback-extensions/wiki/Loggly