同步操作将从 Rey Wong/OpenLinkLog 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
-Drocketmq.client.log.loadconfig=false
-Dlinklog.env=sit
-Dlinklog.kafka.json=kafkaJson
-Dlinklog.kafka.servers=10.201.1.46:9092
-Dlinklog.kafka.topic=linklog_std_log
-Dlinklog.kafka.errortopic=linklog_common_error
注:使用ELK模式
<!--如果本地有logback就不用配置-->
<!--start logback 必须为1.2.2以上-->
<!-- <dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
l
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback.version}</version>
</dependency>
-->
<!--end logback-->
<!--start linklog-->
<dependency>
<groupId>io.gitee.reywong</groupId>
<artifactId>ry-linklog</artifactId>
<version>1.0.1-releases</version>
</dependency>
<!--end linklog-->
<!--logback-kafka插件-->
<dependency>
<groupId>com.github.danielwegener</groupId>
<artifactId>logback-kafka-appender</artifactId>
<version>0.2.0-RC2</version>
<exclusions>
<!--如果项目中已经存在kafka-clients 则排除-->
<!--<exclusion>-->
<!--<groupId>org.apache.kafka</groupId>-->
<!--<artifactId>kafka-clients</artifactId>-->
<!--</exclusion>-->
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--logback-json插件-->
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>6.6</version>
<exclusions>
<!--如果项目中已经存在jackson-databind则排除-->
<exclusion>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</exclusion>
</exclusions>
</dependency>
注:logback 和 kafka-client 的版本按系统目前使用的版本,不要重复引入
日志字段描述
<!--
date: 日志打印时间
ip : 主机ip java.rmi.server.hostname
env: 应用环境 test | sit | pre | pro
appname:应用名称
logtype: 日志类型 LinkLogTrace | LinkLogMonitor | LinkLogData
level: 日志等级
linkLog: 日志链路信息
thread: 线程名称
class: 输出Logger 的名字
method:方法名称
line: 行数
message: 内容
stack_trace "%exception{5}",
-->
错误日志单独打印,理论系统正常情况不应该出现error日志,error日志要及时解决,根据error日志判断系统质量
日志保存为json格式
日志统一入kafka,目前使用ELK体系(可以进行变更)
第三方SDK修成ERROR级别
关闭无效日志(logback),方便日志查询和问题跟踪
定时reload日志,减少日志打印量(稳定代码可以降低日志级别,如改成debug)
日志本地打印,每种类型日志10个文件并且每个文件保存100M,自动清理(防止kafka出问题)
日志同时直接打印到kafka
日志使用 ElasticSeacrh
日志监控 Grafana
如:将INFO改成DEBUG,10秒生效
可以通过 thread查询 按时间排序
通过 appname class method 进行查询汇总,也可以创建dashboard出报表(kibana报表)
通过 appname class method 查询message(json格式的message会被拆分)
将日志打印成json格式,然后该json会被自动分拆成字段,通过分拆的字段进行查询
1.手工调整代码,将info改成debug,或直接去掉
2.通过修改logback.xml动态生效
需求:完善日志的链路跟踪
答:日志打印会有全局ID,来贯穿整个日志链路,全局ID信息为: traceId (链路ID),spanId(当然日志所在链路ID), preIP(上级IP),preApp(上级应用名称),preHost(上级主机名)
需求:接口请求/响应参数打印可配置
答:logback目前已经支持动态刷新,可以通过修改logback.xml实现(运维配置),举例
// xxxx.java
//代码中获取logger对象
private static final Logger linkLog=LoggerFactory.getLogger("LinkLogMonitor");
// logback.xml 配置
<!--
name为 代码中logger的名称
level: off 为关闭日志
additivity:false 为root不再传递 LinkLogMonitor 的日志的配置
-->
<logger name="LinkLogMonitor" level="off" additivity="false">
<appender-ref ref="${kafkaJson}messageText_async_rollingFile"/>
<appender-ref ref="${kafkaJson}messageText_async_kafka"/>
</logger>
需求:日志级别可动态配置
答:修改logback配置文件即可,10s生效不需要重启应用(生产环境联系运维修改)
需求:日志打印不能影响应用的性能
答:1. 目前打印日志采用异步打印
2. 直接同时打印到kafka和本地文件
3. 写kafka不等kafka响应(无响应直接丢弃)
4. 本地文件单个类型保留10个文件每个文件100M,不启用fliebeat
5. error日志单独打印,性能不够可以只保留error
需求:接口日志支持重发
答:日志打成了json格式,可以通过 class 和 method 进行查询打印的数据,从es或本地文件提取进行重试
//相当于 LoggerFactory.getLogger("ry.linkLog.LinkLogMonitor");
private static final Logger logger= LoggerFactory.getLogger(TestLinkLog.class);
// 打印日志
public ResponseParam addUserInfoNew(RequestParam requestParam) {
logger.info(JSON.toJSONString(requestParam));
}
class RequestParam {
String userId;
String age;
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
//其中 userId,age 被分拆成字段
{
"ip": "127.0.0.1",
"type": "linklog_std",
"message": "{\"userId\":\"linkLog\",\"age\":1}",
"age": 1,
"appname": ".",
"logtype": "LinkLogTrace",
"stack_trace": "",
"span": "",
"userId": "linkLog",
"class": "cn.ry.LinkLogMonitor",
"parent": "",
"traceId": "",
"date": "2021-03-15T15:22:04.102+0800",
"method": "?",
"@version": "1",
"line": "?",
"@timestamp": "2021-03-15T07:22:07.222Z",
"level": "INFO ",
"env": ".",
"thread": "main"
}
如:将类型 com.ry.doradoLinkLog 日志级别修改成INFO ,以下两种方案选择一种即可
配置中心修改方案:添加 com.ymdd.doradoLinkLog =INFO
logback.xml修改方案: 添加 <logger name="com.ry.doradoLinkLog" level="INFO" additivity="true"/>
以下两种方案选择一种即可
配置中心修改方案:添加 java.sql = DEBUG
logback.xml修改方案:添加 <logger name="java.sql" level="DEBUG" additivity="true"/>
针对mybatis配置
配置中心修改方案:添加 mapper所在包名 = DEBUG
logback.xml修改方案:添加 <logger name="mapper所在包名" level="DEBUG" additivity="true"/>
如:想关闭三方日志,或排除日志干扰,可以关闭日志,以下两种方案选择一种即可
配置中心修改方案:添加 org.apache.curator = OFF
logback.xml修改方案:添加 <logger name="org.apache.curator" level="OFF"/>
文件修改实时生效,支持的级别 OFF>FATAL>ERROR>WARN>INFO>DEBUG>TRACE>ALL
##修改方式如下 key=logger名称(默认为类名/包名), value = 日志级别
com.ry=INFO
# true开启日志 false 关闭日志
linklog.accesslog=false
linkLog.traceId: 日志链路的id,贯穿全局
linkLog.spanId: 当前节点id,如0.1,具体规则见 备注中的命名规则
linkLog.preApp: 请求方应用名称
linkLog.preHost: 请求方主机名
linkLog.preIp : 请求方IP
class: 为linkLog,标识linkLog打印的日志
linkLogAccessType: client为请求方打印 server为接收方打印
requestURLStr: 请求地址
linkLogMethod: 请求方式 POST GET DUBBO EDS-RPC
filterName: 打印类,判断拦截器类型
content: 发送的内容
在jvm启动参数添加 -XX:-OmitStackTraceInFastThrow
由于 线程池 为复用的模式,ThreadLocal只会在初始化的时候进行传递,所以导致线程数打印的traceId重复
解决方案如下: ExecutorService executorPool = TtlExecutors.getTtlExecutorService(new ThreadPoolExecutor(2, 2, 0L,TimeUnit.MILLISECONDS,new LinkedBlockingQueue<>(), new ThreadFactoryBuilder().setNameFormat("executor-pool-%d").build(), new ThreadPoolExecutor.AbortPolicy()));
通过TtlExecutors.getTtlExecutorService()
对线程池进行包装
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。