Comments (20)
ok,等你整理出来,我看看给整合到这儿来,这个issue,后期整完了再关,再次感谢
from spring-boot-demo.
https://tech.meituan.com/2017/02/17/change-log-level.html
美团有实现一部分,但不完整
from spring-boot-demo.
大佬,有兴趣整整试试。
有兴趣的话,联系下我qq 69671710 ,我自己偶尔弄弄玩,可以简单跑起来了,但很多不完善。
弄了半年,都拖着没个下文。。。
from spring-boot-demo.
动态修改日志级别的话,我记得 spring-boot-starter-admin 配合 actuator 就可以做到。不过针对 userId 的还没遇到过,我已经加到新功能列表了,当然更加期待您的PR~~ 十分感谢 @lxk696
from spring-boot-demo.
spring-boot-starter-admin 我有看过点,感觉没 美团 描述的功能那么深入实用。 可能是我了解不深。
我这周 把 动态日志 相关的单独整理出成一个demo 项目,到时发你。
共同学习,有很多问题 还要请教你,感谢你才是
from spring-boot-demo.
不好意思,最近几天忙忘记了。。
from spring-boot-demo.
https://gitee.com/huayu696/logmm.git
码云的地址。 页面还没整理完。
测试案例使用 postman测试
test/resources/log_test.postman_collection.json
待解决问题
1:
把当前需跟踪的用户 id 配置进 日志上下文中,配合log4j2.xml 的
DynamicThresholdFilter 和 Routing 可以用ctx 取出上下文,且可以 以用户id为维度,
动态控制用户日志,及打印的日志文件名 。
如跟踪用户的userId=33 ,则把跟踪日志单独写入 trace/33.log 下。没找到解决方案。
2:
支持同时跟踪多个用户。
因为现在 log4j2 的 DynamicThresholdFilter 使用动态 KeyValuePair 键值会报错,没找到解决方案。
3:
aop 代理 ,线程,线程池 对动态日志的支持
线程池需使用阿里巴巴的线程池,待测试
4:
多项目支持
初始化redis缓存,缓存中放入各项目Logger列表;
查询:后台管理(admin)项目从缓存中获取各项目Logger列表;
修改:后台管理(admin)项目发布日志级别调整信息,像各项目推送日志级别(或用户跟踪)调整信息。收到信息后,调整日志级别,更新项目Logger列表。
使用共享redis可支持,待测试
log/log.jsp 页面操作暂未完成
from spring-boot-demo.
希望大佬解决这些难点把 。
我现在只做了 log4j2的。
参考的比较多的是 阿里巴巴的,和log4j2官网的。
from spring-boot-demo.
@lxk696 十分感谢,我会抽时间整理,后续整理完会在这个issue下回复
from spring-boot-demo.
感谢大佬!ヾ( ̄▽ ̄)
from spring-boot-demo.
大佬,你最近是太忙了吗?还是忘了这回事了啊。。ヘ(_ _ヘ)
from spring-boot-demo.
忘记啦。。。。十分抱歉哈! 😰
from spring-boot-demo.
没事,大佬你太忙了,watch 你,邮箱看到你那天天消息。。。
麻烦有时间帮忙看看咯 ヽ(°◇° )ノ
from spring-boot-demo.
hello, @lxk696 十分抱歉,拖更了这么久
我找了一周末资料,感觉这个比较靠谱,http://oct.im/how-to-create-logback-loggers-dynamicallypragmatically.html
主要的方案就是动态地去添加 appender
提供一些思路:
-
AOP
在@Around
的joinPoint.proceed()
之前根据user-id
等信息构造appender
,然后调用appender.start()
启用,在joinPoint.proceed()
之后调用appender.stop()
关闭 -
Interceptor
preHandle
的时候构造并启用 appender,afterCompletion
的时候关闭 appender
下面是我测试的代码,没有用上面的思路,直接controller暴露接口修改的。
- 支持动态更换目录
- 动态设置日志级别
@GetMapping("set")
@SuppressWarnings("unchecked")
public String changeLogLevel(String packageName, String level, boolean close) {
Logger logger = (Logger) TestController.log;
LoggerContext loggerContext = logger.getLoggerContext();
Logger packageLogger = loggerContext.getLogger(packageName);
packageLogger.setLevel(Level.toLevel(level));
if (!close) {
FileAppender fileAppender = new FileAppender();
fileAppender.setContext(loggerContext);
fileAppender.setName("package");
String userId = "user-237497819";
fileAppender.setFile("logs/" + packageName + "/" + userId + ".log");
PatternLayoutEncoder encoder = new PatternLayoutEncoder();
encoder.setContext(loggerContext);
encoder.setPattern("%r %thread %level - %msg%n");
encoder.start();
fileAppender.setEncoder(encoder);
fileAppender.start();
packageLogger.addAppender(fileAppender);
} else {
packageLogger.getAppender("package").stop();
}
// 可以省略
StatusPrinter.print(loggerContext);
return "success";
}
from spring-boot-demo.
多谢了,感谢大佬帮忙了。
不过,我原来有考虑过用代码实现,感觉有些不好。
主要是如果用log.xml配置就可以的话更方便,
我写的案例里,可以根据log.xml里的配置来实现一部分,感觉是我 配置文件不会写。。。
from spring-boot-demo.
大佬,你感觉这个 应用到生产环境的价值吗? 我自己感觉还蛮有意思的。。。 就是太水了,弄不来
from spring-boot-demo.
为了支持这些功能,阿里云都写了不少 jar .感觉应该有生产价值的吧, 大佬 可以再完善下的
from spring-boot-demo.
我还想再里面再加个功能。
比如 有时项目里出现异常,
如一个请求来了 从方法A 开始, A-B-C-D-E-F-G-H-返回结果。
此时调用链中比较深的 G方法出异常了。
想解决这个问题,只能靠猜,或者用模拟数据调试大部分流程,这样很麻烦。
我再想能不能,当出异常的时候,在全局异常处理器中,根据堆栈日志,找到每个方法调用链(能实现),找到每个方法的入参名(能实现),找到每个方法的入参值(不能实现),再在全局异常处理器中打印出来。
这样我看到 G方法出异常了,我只要看全局异常日志中 G方法入参是什么, 就大概知道原因了。
这样就省事很多,不用在每个方法里手动打印入参,只在异常时自动打印。
问了些大佬,说用aop,但感觉aop 会需要把所有所有方法包一层,影响性能。
大佬,你有什么思路吗?
from spring-boot-demo.
这个暂时没有想到思路诶,感觉这个调用链好像有点 Sleuth + Zipkin 的意思 - -||
等你找到解决方案的时候,记得在这儿更新下哈~
from spring-boot-demo.
好的,不过现在公司转型,要学scala spark,很久没看java了,不然一直想把动态日志做完,得抽时间看下log4j2怎么实现的,覆写他源码,我上面说的功能应该很简单就能实现了
from spring-boot-demo.
Related Issues (20)
- 集成JOOQ HOT 1
- 生产环境不能修改host怎么办呢? HOT 2
- [BUG] demo-orm-jdbctemplate 中,日志打印问题 HOT 3
- [BUG] 使用HashMap for DATASOURCE_CACHE in DatasourceHolder.java
- [README错误]demo-template-beetl模块README文件后缀错误
- [demo-orm-jdbctemplate]BaseDao.getField()方法未正确过滤主键
- 集成Sa token
- [BUG] HOT 3
- 希望添加的demo
- suggest new_adding HOT 1
- minio
- 可以出一个 Camunda 的实例吗
- [FEATURE] 可以来一个JPA版本的 spring-boot-demo-dynamic-datasource 吗
- md里图片问题 HOT 1
- [BUG] demo-orm-mybatis-plus 模块启动报错 HOT 1
- [BUG] 请问demo-rbac-shiro是否未完成?
- [BUG] demo-websocket 系统架构显示都是AMD64 HOT 1
- 希望增加graphql的集成demo
- [FEATURE]我可以贡献一个多数据源查询的springboot项目 HOT 1
- 注入不进去是怎么回事 始终为null HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from spring-boot-demo.