[新增功能](master): 日志架构相关的操作

日志架构相关的操作
master
土豆兄弟 3 years ago
parent 1433798fda
commit bb1f6b672a

@ -40,6 +40,8 @@
# 外部代理地址 # 外部代理地址
advertised.listeners=PLAINTEXT://121.201.64.12:9092 advertised.listeners=PLAINTEXT://121.201.64.12:9092
https://blog.csdn.net/pbrlovejava/article/details/103451302 https://blog.csdn.net/pbrlovejava/article/details/103451302
国内下载镜像加速
https://www.newbe.pro/
### 1.3 海量日志收集架构设计(dev-protocol-log) ### 1.3 海量日志收集架构设计(dev-protocol-log)
@ -59,12 +61,18 @@
- 全域日志收集架构落地图 - 全域日志收集架构落地图
![avatar](dev-protocol-log/pic/全域日志收集架构落地图.png) ![avatar](dev-protocol-log/pic/全域日志收集架构落地图.png)
### 1.4 日志输出设计
- 1. 使用 Log4j2 的相关技术进行日志定义
![avatar](dev-protocol-log/pic/日志输出功能详情.png)
- 2. 使用 filebeat 进行日志的收集
![avatar](dev-protocol-log/pic/FIleBeat日志收集.png)
启动前先进行检查 ./filebeat -c 配置文件.yml -configtest
启动顺序 kafka -> 自己的应用程序 -> filebeat
- 3.

@ -0,0 +1,46 @@
### Example user template template
### Example user template
# IntelliJ project files
.idea
*.iml
out
gen
### Maven template
target/
pom.xml.tag
pom.xml.releaseBackup
pom.xml.versionsBackup
pom.xml.next
release.properties
dependency-reduced-pom.xml
buildNumber.properties
.mvn/timing.properties
# https://github.com/takari/maven-wrapper#usage-without-binary-jar
.mvn/wrapper/maven-wrapper.jar
### Java template
# Compiled class file
*.class
# Log file
*.log
# BlueJ files
*.ctxt
# Mobile Tools for Java (J2ME)
.mtj.tmp/
# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*

@ -0,0 +1,11 @@
## IDEA 好用的插件推荐
Vuesion Theme 主题
Atom Material ICons 图标插件 解决在拖动滚动条或是鼠标中键滚屏时有点卡顿问题
File Expander 它能在Idea里直接打开Jar包并且反编译代码查看。甚至于能打开tar.gzzip等压缩格式。
GitToolBox 他能在项目上提示你还有多少文件没提交,远程还有多少文件没更新下来。还能在每一行代码上提示上次提交的时间。查版本提交问题的时候尤其方便。
Maven Helper 排查Jar包依赖等问题用这个简直是神器。这个插件也提供了一些其他的快捷命令右键直接唤起maven命令颇为方便。
Translation 实时进行精准快速的翻译,自动识别语言。
arthas idea Arthas是阿里开源的一款强大的java在线诊断工具使用起来非常方便进入代码片段选择你要诊断的类或者方法上面右击打开Arthas命令选择一项即可自动生成命令省去你敲打命令的时间。
Search In Repository 直接把中央仓库的查找集成到了Idea里面。你只需要打开这款插件输入jar包的名字或者gav关键字就能查到到这个jar包所有的版本然后可以直接复制gav坐标。
VisualGC Idea堆栈的可视化工具和Idea深度集成。直接显示所有进程双击即可打开JVM的堆栈可视化界面。堆栈和垃圾收集情况一目了然
Zoolytic idea里面直接可以看zookeeper的节点信息

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>dev-protocol</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>dev-protocol-common</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
</project>

Binary file not shown.

After

Width:  |  Height:  |  Size: 151 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 KiB

@ -16,12 +16,32 @@
<maven.compiler.target>8</maven.compiler.target> <maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<!--maven方式跳过maven test, 等同$ mvn package -D maven.test.skip=true-->
<maven.test.skip>true</maven.test.skip>
</properties> </properties>
<dependencies> <dependencies>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId> <artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<!-- 排除默认的log依赖 -->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- log4j2 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>3.4.4</version>
</dependency> </dependency>
<dependency> <dependency>
@ -39,6 +59,42 @@
<groupId>org.springframework.kafka</groupId> <groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId> <artifactId>spring-kafka</artifactId>
</dependency> </dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.16</version>
</dependency>
</dependencies> </dependencies>
<build>
<!-- 配置应用打包的主清单属性 -->
<finalName>dev-protocol-log</finalName>
<!-- 打包时包含 properties xml -->
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
<include>**/*.yml</include>
</includes>
<!-- 是否替换资源中的属性 -->
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>com.baiye.DevProtocolLogApplication</mainClass>
</configuration>
</plugin>
</plugins>
</build>
</project> </project>

@ -0,0 +1,47 @@
package com.baiye.collector.util;
import cn.hutool.system.SystemUtil;
import org.slf4j.MDC;
import org.springframework.context.EnvironmentAware;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
/**
* mdc util
*
* @author q
* @date 2021/11/20
*/
@Component
public class InputMDCUtil implements EnvironmentAware {
private static Environment environment;
/*
*
*/
/**
*
*
* @param environment
*/
@Override
public void setEnvironment(Environment environment) {
InputMDCUtil.environment = environment;
}
/**
*
*/
public static void putMDC(){
MDC.put("hostName", SystemUtil.getHostInfo().getName());
MDC.put("ip", SystemUtil.getHostInfo().getAddress());
MDC.put("applicationName", environment.getProperty("spring.application.name"));
}
}

@ -0,0 +1,49 @@
package com.baiye.collector.web;
import com.baiye.collector.util.InputMDCUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
*
*
* @author q
* @date 2021/11/19
*/
@Slf4j
@RestController
public class IndexController {
@RequestMapping(value = "/index")
public String index(){
// 调用MDC,填充配置文件中的%X 指定的内容
// MDC : ThreadLocal + Map
InputMDCUtil.putMDC();
log.info("我是info日志");
log.error("我是error日志");
log.warn("我是warn日志");
return "index";
}
@RequestMapping(value = "/err")
public String err() {
InputMDCUtil.putMDC();
try {
int a = 1 / 0;
}catch (Exception e){
log.error("算法异常", e);
}
return "err";
}
}

@ -42,7 +42,12 @@ spring:
ack-mode: manual ack-mode: manual
# 并行度 # 并行度
concurrency: 5 concurrency: 5
application:
name: collector
jackson:
date-format: java.text.SimpleDateFormat
time-zone: GMT+8
default-property-inclusion: non_null

@ -0,0 +1,125 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- 通用的 log4j2 依赖配置 -->
<!-- 详情见 https://www.jianshu.com/p/bfc182ee33db -->
<!-- Configuration-->
<!-- status这个用于设置log4j2自身内部的信息输出可以不设置当设置成trace时你会看到log4j2内部各种详细输出&ndash;&gt; OFF为关闭-->
<!-- monitorInterval为一个非零值来让 Log4j 每隔指定的秒数来重新读取配置文件,可以用来动态应用 Log4j 配置 -->
<configuration status="OFF" monitorInterval="5" >
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--变量配置-->
<Properties>
<!-- 格式化输出:%date表示日期%thread表示线程名%-5level级别从左显示5个字符宽度 %msg日志消息%n是换行符-->
<!-- %logger{36} 表示 Logger 名字最长36个字符 -->
<!--
%d{yyyy-MM-dd HH:mm:ss, SSS} : 日志生产时间,输出到毫秒的时间
%-5level : 输出日志级别,-5表示左对齐并且固定输出5个字符如果不足在右边补0
%c : logger的名称(%logger)
%t : 输出当前线程名称
%p : 日志输出格式
%m : 日志内容,即 logger.info("message")
%n : 换行符
%C : Java类名(%F)
%L : 行号
%M : 方法名
%l : 输出语句所在的行数, 包括类名、方法名、文件名、行数
hostName : 本地机器名
hostAddress : 本地ip地址
-->
<!-- 日志的输出格式 -->
<property name="LOG_PATTERN" value="[%d{yyyy-MM-dd HH:mm:ss, SSS}] [%-5level] [%thread-%tid] [%logger{36}] [%X{hostName}] [%X{ip}] [%X{applicationName}] [%F,%L,%C,%M]- [%m] ## '%ex'%n" />
<!-- 定义日志存储的路径 -->
<property name="FILE_PATH" value="./log/"/>
<!-- 定义日志输出的文件名 -->
<property name="FILE_NAME" value="dev-protocol-log"/>
</Properties>
<appenders>
<!-- 输出到控制台 -->
<console name="Console" target="SYSTEM_OUT">
<!--输出日志的格式-->
<PatternLayout pattern="${LOG_PATTERN}"/>
<!--控制台只输出level及其以上级别的信息onMatch其他的直接拒绝onMismatch-->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
</console>
<!--文件会打印出所有信息这个log每次运行程序会自动清空由append属性决定适合临时测试用-->
<File name="Filelog" fileName="${FILE_PATH}/test.log" append="false">
<PatternLayout pattern="${LOG_PATTERN}"/>
</File>
<!-- 这个会打印出所有的info及以下级别的信息每次大小超过size则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
<RollingFile name="RollingFileInfo" fileName="${FILE_PATH}/info.log"
filePattern="${FILE_PATH}/${FILE_NAME}-INFO-%d{yyyy-MM-dd}_%i.log.gz">
<!--控制台只输出level及以上级别的信息onMatch其他的直接拒绝onMismatch-->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${LOG_PATTERN}"/>
<Policies>
<!--interval属性用来指定多久滚动一次默认是1 hour-->
<TimeBasedTriggeringPolicy interval="1"/>
<SizeBasedTriggeringPolicy size="10MB"/>
</Policies>
<!-- DefaultRolloverStrategy属性如不设置则默认为最多同一文件夹下7个文件开始覆盖-->
<DefaultRolloverStrategy max="15"/>
</RollingFile>
<!-- 这个会打印出所有的warn及以下级别的信息每次大小超过size则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
<RollingFile name="RollingFileWarn" fileName="${FILE_PATH}/warn.log"
filePattern="${FILE_PATH}/${FILE_NAME}-WARN-%d{yyyy-MM-dd}_%i.log.gz">
<!--控制台只输出level及以上级别的信息onMatch其他的直接拒绝onMismatch-->
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${LOG_PATTERN}"/>
<Policies>
<!--interval属性用来指定多久滚动一次默认是1 hour-->
<TimeBasedTriggeringPolicy interval="1"/>
<SizeBasedTriggeringPolicy size="10MB"/>
</Policies>
<!-- DefaultRolloverStrategy属性如不设置则默认为最多同一文件夹下7个文件开始覆盖-->
<DefaultRolloverStrategy max="15"/>
</RollingFile>
<!-- 这个会打印出所有的error及以下级别的信息每次大小超过size则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
<RollingFile name="RollingFileError" fileName="${FILE_PATH}/error.log"
filePattern="${FILE_PATH}/${FILE_NAME}-ERROR-%d{yyyy-MM-dd}_%i.log.gz">
<!--控制台只输出level及以上级别的信息onMatch其他的直接拒绝onMismatch-->
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${LOG_PATTERN}"/>
<Policies>
<!--interval属性用来指定多久滚动一次默认是1 hour-->
<TimeBasedTriggeringPolicy interval="1"/>
<SizeBasedTriggeringPolicy size="10MB"/>
</Policies>
<!-- DefaultRolloverStrategy属性如不设置则默认为最多同一文件夹下7个文件开始覆盖-->
<DefaultRolloverStrategy max="15"/>
</RollingFile>
</appenders>
<!--Logger节点用来单独指定日志的形式比如要为指定包下的class指定不同的日志级别等。-->
<!--然后定义loggers只有定义了logger并引入的appenderappender才会生效-->
<loggers>
<!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
<logger name="org.mybatis" level="info" additivity="false">
<AppenderRef ref="Console"/>
</logger>
<!--监控系统信息-->
<!--若是additivity设为false则 子Logger 只会在自己的appender里输出而不会在 父Logger 的appender里输出。-->
<Logger name="org.springframework" level="info" additivity="false">
<AppenderRef ref="Console"/>
</Logger>
<!-- todo 补充异步的日志输出 AsyncLogger -->
<root level="info">
<appender-ref ref="Console"/>
<!-- <appender-ref ref="Filelog"/>-->
<!-- <appender-ref ref="RollingFileInfo"/>-->
<!-- <appender-ref ref="RollingFileWarn"/>-->
<!-- <appender-ref ref="RollingFileError"/>-->
</root>
</loggers>
</configuration>

@ -11,6 +11,7 @@
<modules> <modules>
<module>dev-protocol-test</module> <module>dev-protocol-test</module>
<module>dev-protocol-log</module> <module>dev-protocol-log</module>
<module>dev-protocol-common</module>
</modules> </modules>
<properties> <properties>
@ -34,4 +35,17 @@
</dependencies> </dependencies>
</dependencyManagement> </dependencyManagement>
<build>
<pluginManagement>
<plugins>
<!-- 打包插件管理 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring.boot.version}</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project> </project>
Loading…
Cancel
Save