51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 2139|回复: 0
打印 上一主题 下一主题

java日志管理

[复制链接]
  • TA的每日心情
    无聊
    昨天 09:06
  • 签到天数: 530 天

    连续签到: 2 天

    [LV.9]测试副司令

    跳转到指定楼层
    1#
    发表于 2018-12-12 14:35:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    java常用日志框架简介

    log4j和logback都是java项目中经常使用的日志框架,通常会结合slf4j一起使用。
    log4j和logback都是具体的日志实现框架,slf4j是一个接口层框架,slf4j-log4j,slf4j-logback则是针对log4j和logback的桥接框架。使用slf4j,就可以随意切换日志框架,而不用修改代码。

    高并发系统日志记录

    多线程环境会由于多个线程同时会向一个日志文件记录日志,所以会导致日志混乱,查找某个线程的日志变的不方便。比如跟踪某个订单号、某个用户的相关日志。
    我们可以使用slf4j的MDC来解决这个问题。
    MDC ( Mapped Diagnostic Contexts ),顾名思义,其目的是为了便于我们诊断线上问题而出现的方法工具类。虽然,Slf4j 是用来适配其他的日志具体实现包的,但是针对 MDC功能,目前只有logback以及log4j支持。
    MDC对外提供的接口:
    1. public class MDC {
    2.   //Put a context value as identified by key
    3.   //into the current thread's context map.
    4.   public static void put(String key, String val);
    5.   //Get the context identified by the key parameter.
    6.   public static String get(String key);
    7.   //Remove the context identified by the key parameter.
    8.   public static void remove(String key);
    9.   //Clear all entries in the MDC.
    10.   public static void clear();
    11. }
    复制代码
    接口定义非常简单,此外,其使用也非常简单。

    一般,我们在代码中,只需要将指定的值put到线程上下文的Map中,然后,在对应的地方使用 get方法获取对应的值。此外,对于一些线程池使用的应用场景,可能我们在最后使用结束时,需要调用clear方法来清洗将要丢弃的数据。

    看看一个MDC使用的简单示例

    1. MDC.put("traceNo","jd.com");
    2. logger.info("method testFindByName in UserServiceTest");
    3. User user = userService.findByName("test");
    4. logger.info("user:{}",user);
    5. Assert.assertNotNull(user);
    6. MDC.clear();
    复制代码
    logback.xml配置:
    1. <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
    2.     <!-- 对日志进行格式化。 -->
    3.     <encoder>
    4.         <pattern>
    5.             %d{yyyy-MM-dd HH:mm:ss} %level %logger.%M\(%F:%L\)] [%X{traceNo}] %msg%n
    6.         </pattern>
    7.     </encoder>
    8. </appender>
    复制代码

    如上,在logback.xml中的pattern中我们加入了[%X{traceNo}],在MDC中放入traceNo的值,就可以记录日志了。

    在WEB系统中,则可以新建一个自定义的请求过滤器,对业务请求进行过滤,在过滤器内处理请求前加入traceNo,请求处理完毕后,从MDC删除traceNo。

    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-22 02:24 , Processed in 0.064704 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表