日志扩展包eslf4j介绍

eslf4j的maven项目托管在https://github.com/xionghuiCoder/eslf4j,同时也可以在http://www.oschina.net/p/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、扩展点

    1) 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;
      }

    2) 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);
...
时间: 2024-10-24 19:08:48

日志扩展包eslf4j介绍的相关文章

模块和包的介绍和用法

一.模块 1.模块的定义 一个模块就是一个包含了python定义和声明的文件(文件名就是模块名字加上.py的后缀),模块可以被导入使用. 2.import加载的模块分为四个通用类别: (1)使用python编写的.py文件 (2)已被编译为共享库或DLL的C或C++扩展 (3)把一系列模块组织到一起的文件夹(注:文件夹下有一个__init__.py文件,该文件夹称之为包) (4)使用C编写并链接到python解释器的内置模块 3.模块的使用 (1)模块可以包含可执行的语句和函数的定义,这些语句的

如何正确使用 Composer 安装 Laravel 扩展包

我们经常要往现有的项目中添加扩展包,有时候因为文档的错误引导,如下图来自 这个文档 的: composer update 这个命令在我们现在的逻辑中,可能会对项目造成巨大伤害. 因为 composer update 的逻辑是按照 composer.json 指定的扩展包版本规则,把所有扩展包更新到最新版本,注意,是 所有扩展包,举个例子,你在项目一开始的时候使用了 monolog,当时的配置信息是 "monolog/monolog": "1.*", 安装的是 mon

Spring 相关jar包详细介绍

文章转自:http://blog.csdn.net/farawayhome/article/details/6623946 aspectj目录下是在Spring框架下使用aspectj的源代码和测试程序文件. Aspectj是java最早的提供AOP的应用框架. dist 目录下是Spring 的发布包,关于发布包下面会详细进行说明. docs 目录下是相关的文档,包括有Spring api 的javadoc.reference 参考指南.Spring的标签库使用文件及Spring MVC 的M

深入理解php内核 编写扩展 I:介绍PHP和Zend

内容: 编写扩展I -  PHP和Zend起步 原文:http://devzone.zend.com/public/view/tag/Extension Part I: Introduction to PHP and Zend http://devzone.zend.com/article/1021-Extension-Writing-Part-I-Introduction-to-PHP-and-Zend 编写扩展_II - 参数.数组和ZVALs 编写扩展_II - 参数.数组和ZVALs[继

【转】正确的 Composer 扩展包安装方法

简单解释 composer install - 如有 composer.lock 文件,直接安装,否则从 composer.json 安装最新扩展包和依赖: composer update - 从 composer.json 安装最新扩展包和依赖: composer update vendor/package - 从 composer.json 或者对应包的配置,并更新到最新: composer require new/package - 添加安装 new/package, 可以指定版本,如:

Laravel大型项目系列教程(七)之7 扩展包和Artisan开发

本节教程将讲解扩展包开发和Artisan扩展开发,并浏览不同分辨率下的自适应效果.本节结束后整个教程就结束了,文章最后有完整版程序代码的下载. 1.扩展包开发 在前面开发中,我们经常要用到通知,如修改用户信息时视图要写 @if (Session::has('message')) <div class="am-alert am-alert-{{ Session::get('message')['type'] }}" data-am-alert> <p>{{ Ses

Android5.0 v7扩展包之RecyclerView

Android5.0 v7扩展包之RecyclerView Android开发文章 androidRecyclerView 近日Google发布了Android5.0 SDK,随之android L的部分预览功能也发布了正式版本.本文将介绍RecyclerView. RecylerView简介 The RecyclerView widget is a more advanced and flexible version of ListView. This widget is aContainer

Spring各个jar包的介绍

spring4中各个jar包的介绍: Spring AOP:Spring的面向切面编程,提供AOP(面向切面编程)的实现Spring Aspects:Spring提供的对AspectJ框架的整合 Spring Beans:Spring IOC的基础实现,包含访问配置文件.创建和管理bean等. Spring Context:在基础IOC功能上提供扩展服务,此外还提供许多企业级服务的支持,有邮件服务.任务调度.JNDI定位,EJB集成.远程访问.缓存以及多种视图层框架的支持. Spring Con

Ubuntu 16.04 安装opencv的各种方法(含opencv contrib扩展包安装方法)

Ubuntu 16.04 安装opencv的各种方法(含opencv contrib扩展包安装方法) https://blog.csdn.net/ksws0292756/article/details/79511170 本文主要介绍安装opencv C++接口和python接口的几种方法. 首先介绍C++接口的,然后介绍Python接口的 C++接口安装 采用源码编译的安装方式,基本也就是这种方法了,首先在官网下载你想安装的版本的opencv压缩包,下载连接如下: https://github.