`
xionghui_coder
  • 浏览: 475 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

日志扩展包eslf4j介绍

阅读更多
eslf4j的maven项目托管在https://github.com/xionghuiCoder/eslf4j

1、eslf4j介绍

eslf4j(expand slf4j)主要用于解决线上日志的bug定位问题。 对于大并发的网站,为了保证性能,往往设置日志级别为error,但是在这种情况下,如果线上出现了bug,往往只有一条错误日志,这对于定位问题几乎没有任何帮助,因为导致这个error往往是由于上下文的一个或几个错误数据或操作导致的,而上下文的info或debug日志并没有输出。

eslf4j可以缓存上下文日志,比如上面那种情况,一旦出现error,会打印出该error前的debug或info级别的日志。然而如果不出现error,则不会打印任何日志。这样既方便定位问题,也能防止输出大量日志而影响性能。

2、配置eslf4j

count=100
buffersize=10m
minthreshold=debug
filter=com.jd.o2o.filter.Null1Filter
filter=com.jd.o2o.filter.Null2Filter
memorymanager=com.jd.o2o.memory.NullMemoryManager

  • count为缓存的日志数量,必须配置(否则可能会造成内存泄露,这跟线程连接池和ThreadLocal的实现有关,就不详解了);比如这里配置为100,表示一旦打印一条日志,会同时打印出该条日志前的100条日志。

  • buffersize为eslf4j缓存的日志所占用的空间,必须配置,当缓存达到配置的大小时就会使用memorymanager来释放内存;这里配置的buffersize为10m,表示缓存最多会占用10m内存,另外支持单位b(bit),k(kb),g(gb)。

  • minthreshold为日志级别的最低闸值,必须配置,支持all,trace,debug,info,warn,error,fatal和off;比如这里配置为debug,只有级别大于或等于debug的日志才会被缓存并打印出来。

  • filter是日志过滤器,可以配置也可以不配置,当然也可以配置多个;filter需要实现com.jd.o2o.core.filter.Filter接口,而且需要一个无参构造器;filter会在日志被缓存前调用,可以自处理日志。

  • memorymanager用于管理内存,可以配置也可以不配置,memorymanager需要实现com.jd.o2o.core.memory.IMemoryManager接口,而且需要一个无参构造器,如果不配置会默认使用com.jd.o2o.core.memory.impl.DefaultMemoryManagerImpl来管理内存,memorymanager会在日志缓存达到buffersize时调用来释放内存。


3、扩展点

  • filter是一个扩展点,需要实现com.jd.o2o.core.filter.Filter接口,Filter接口用于处理com.jd.o2o.core.bean.MessageBean,MessageBean包含日志message和throwable,filter可以修改日志或者修改异常,比如想要过滤掉带有"debug"字符串的message可以定义以下filter:

private static final String DEBUG_SIGN = "debug";

@Override
public boolean doFilter(MessageBean messageBean) {
  String message = messageBean.getMessage();
  if (message == null) {
    throw new Eslf4jException("message should not be null");
  }
  if (message.contains(DEBUG_SIGN)) {
    // 返回false则不会缓存,也不会打印
    return false;
  }
  return true;
}

  • memorymanager是另外一个扩展点,默认会使用com.jd.o2o.core.memory.impl.DefaultMemoryManagerImpl来管理内存,当缓存的日志达到buffersize时,DefaultMemoryManagerImpl会清空部分线程的日志缓存,这样保证了空间的可用性,但是可能会丢失部分线程缓存的上下文日志,所以如果使用默认的DefaultMemoryManagerImpl最好配置好count和buffersize,可以通过以下公式来计算出合适的buffersize(单位为m):

buffersize = count*活动的线程数*平均每条日志的长度*2/1024

当然也可以自定义memorymanager,需要实现IMemoryManager接口,比如想要在清空缓存前输出上下文日志,可以定义以下memorymanager:
  @Override
  public void manager(FixedQueue queue) {
    while (queue.size() > 0) {
      MessageBean bean = queue.remove();
      // LOGGER为slf4j logger
      LOGGER.error(bean.getMessage(), bean.getThrowable());
    }
  }


4、其它

eslf4j是基于slf4j的扩展,选择slf4j是因为它很方便切换日志,比如切换log4j到logback只需修改架包和配置文件,完全不用修改代码。另外,使用eslf4j的api和slf4j十分相似,可以参考以下demo:
private static final Logger LOGGER = Eslf4jLoggerFactory.getLogger(clazz);
...
LOGGER.info(msg);
...
分享到:
评论

相关推荐

    基于EasyX的贪吃蛇小游戏 - C语言

    基于EasyX的贪吃蛇小游戏 - C语言

    Energy Core ECP5705-V01.pdf

    Energy Core ECP5705-V01.pdf

    matlabGUI学生成绩管理系统pdf

    建立基于图形用户界面GUI的学生成绩管理系统,该系统能够实现学生成绩信息的增加、删除、查询(查询某门课所有学生的成绩并显示排名,查询某个学生的各科成绩并显示排名)、课程成绩统计最高分、最低分、平均分、方差、并显示相应的排名;绘制柱状图、条形图、饼状图、正太分布曲线等功能。 通过本实验使学生掌握图形用户界面GUI的操作和设计流程,并通过编写回调函数巩固前期的知识。

    高职教育品牌专业申报汇总表.doc

    高职教育品牌专业申报汇总表.doc

    游戏运营数据后台需求表.docx

    游戏运营数据后台需求表.docx

    国家开放大学数据库应用技术第三次形考作业3

    使用TOP和CASE的查询。写出实现如下查询的SQL语句。  (18) 列出“数据库基础”课程考试成绩前三名的学生的学号、姓名、所在系和考试成绩。  (19) 查询Java考试成绩最低的学生的姓名、所在系和Java成绩。  (20) 查询选修了Java的学生学号、姓名、所在系和成绩,并对所在系进行如下处理:   当所在系为“计算机系”时,显示“CS”;   当所在系为“信息管理系”时,显示“IS”;   当所在系为“通信工程系”时,显示“CO”;   对其他系,均显示“OTHER”。

    stable diffusion提示词-人物系列

    stable diffusion提示词人物系列,包含提示词和预览图,把提示词复制到stable diffusion里,即可使用。

    mobile-armeabi-v7a-release.apk

    mobile-armeabi-v7a-release.apk

    《计算机网络实验》资料(3).rar

    《计算机网络实验》资料(3).rar

    2024-2030中国HiPOT电气安全测试仪市场现状研究分析与发展前景预测报告 Sample.pdf

    QYResearch是全球知名的大型咨询公司,行业涵盖各高科技行业产业链细分市场,横跨如半导体产业链(半导体设备及零部件、半导体材料、集成电路、制造、封测、分立器件、传感器、光电器件)、光伏产业链(设备、硅料/硅片、电池片、组件、辅料支架、逆变器、电站终端)、新能源汽车产业链(动力电池及材料、电驱电控、汽车半导体/电子、整车、充电桩)、通信产业链(通信系统设备、终端设备、电子元器件、射频前端、光模块、4G/5G/6G、宽带、IoT、数字经济、AI)、先进材料产业链(金属材料、高分子材料、陶瓷材料、纳米材料等)、机械制造产业链(数控机床、工程机械、电气机械、3C自动化、工业机器人、激光、工控、无人机)、食品药品、医疗器械、农业等。 邮箱:market@qyresearch.com

    python 验证码 高精准 OCR模型 源代码

    OCR模型 源代码,解决网站验证码识别问题,内容包含项目工程源代码,python技术开发,源代码供大家共享

    基于stm32的毕业设计

    基于stm32的毕业设计

    jsp+sql操作系统教学网站设计(lw+程序).zip

    通过操作系统教学网站的建设,完成了对于操作系统课程的远程化授课。可以使学生不受时间空间的限制,通过网络对于这门课程进行学习。建立起了基于B/C的网络化教学系统。本网站采用当前最流行的JSP网络编程技术,可以实现数据的高效、动态、交互访问,具有强大的Server/Client交互能力。本文中所做的主要工作:介绍Win2000 +JSP(J2DK+TOMCAT)系统并且嵌入 JAVABEAN的一般原理;阐述整个操作系统教学网站的概要设计,系统结构及工作原理;分析了系统实现中的特殊性、难点和重点;详细设计实现学院介绍、教学资源、课程表、课堂教学、在线答疑、其他课程、课件下载、留言反馈、站内搜索、公告专栏、友情链接、校园风景、新闻中心、栏目导航等程序模块; 各个模块的具体实现,且分析并解决实现中的若干技术问题;建立完整的实验网站,进行测试并分析结果。 关键字 : JAVABEAN JSP 网络教学 JAVASCRIPT JDBC

    NX二次开发uf5341 函数介绍

    NX二次开发uf5341 函数介绍,Ufun提供了一系列丰富的 API 函数,可以帮助用户实现自动化、定制化和扩展 NX 软件的功能。无论您是从事机械设计、制造、模具设计、逆向工程、CAE 分析等领域的专业人士,还是希望提高工作效率的普通用户,NX 二次开发 Ufun 都可以帮助您实现更高效的工作流程。函数覆盖了 NX 软件的各个方面,包括但不限于建模、装配、制图、编程、仿真等。这些 API 函数可以帮助用户轻松地实现自动化、定制化和扩展 NX 软件的功能。例如,用户可以通过 Ufun 编写脚本,自动化完成重复性的设计任务,提高设计效率;或者开发定制化的功能,满足特定的业务需求。语法简单易懂,易于学习和使用。用户可以快速上手并开发出符合自己需求的 NX 功能。本资源内容 提供了丰富的中英文帮助文档,可以帮助用户快速了解和使用 Ufun 的功能。用户可以通过资源中的提示,学习如何使用 Ufun 的 API 函数,以及如何实现特定的功能。

    医保信息平台定点医药机构国家标准接口技术文档V5.2

    医保信息平台定点医药机构国家标准接口技术文档V5.2 医保平台接口文档,开发必备,全语言接口

    VB医疗纠纷检索系统设计(源代码+系统)【VB】.zip

    VB医疗纠纷检索系统设计(源代码+系统)【VB】

    Threejs插件墙体挖洞ThreeBSP.js

    Threejs插件墙体挖洞ThreeBSP.js

    服务器python通过JDBC连接到位于Linux远程服务器上的Oracle数据库

    【服务器】python通过JDBC连接到位于Linux远程服务器上的Oracle数据库 参考:https://blog.csdn.net/WTYuong/article/details/138167739

    软件工程期末考试试卷-5套

    软件工程课程期末考试试卷,内含5套试题与答案。 题型:选择题、填空题、简答题、应用题等等,拯救【期末考试】,用作平时练手也是不错选择呢~ 内容:软件工程概述、软件过程、可行性研究与项目开发计划、结构化分析、面向对象分析、UML建模、以及软件测试等章节内容。

    jsp+sql宠物诊所系统设计(lw+系统).zip

    “爱心”宠物诊所的职员在工作中需要查阅和管理如下信息:诊所的兽医、客户以及客户的宠物。

Global site tag (gtag.js) - Google Analytics