日志
发布日期:2022-07-08 02:55:49 浏览次数:38 分类:技术文章

本文共 2223 字,大约阅读时间需要 7 分钟。

1.日志的起源

日志最先出现在航海领域,是记录航行情况的主要文件,之后日志也被应用在航空领域,黑匣子就是一个日志文件载体,空难发生后可以通过黑匣子,并解析其中的日志还原灾难真相。

2.日志在解释

注:笔者在理解日志之后试图用自己的言语组织出来

Jiacheng开发一个后台应用,为了方便调试在程序中加入了许多输出语句,将关键的信息在控制台中打印出来,但是后来发现这样的输出语句太多,但是如果去掉又不能及时的反应项目的运行状况,并且还打算将信息写入文件中,因此Jiacheng就开发了一个日志框架,但是随着时间的推移更多好的功能出现了,例如异步模式,自动归档,这时Jiacheng就意识到随着时代的进步会有更多的好的功能出现,如果这样直接更换整个日志框架会变的可维护性不高,因此就写了一个统一的接口层(面向接口编程),之后编码时都只是面向接口层编程,具体的实现由实现层的框架导入

3.日志门面,日志库,日志适配器

3.1日志门面

既为日志的抽象层。门面设计模式是面向对象设计模式中的一种,类似JDBC的设置模式,只提供一套接口规范,自身不具备输出日志的功能(因此只导入门面无法实现日志记录),好处就是对于使用者来说不需要关注底层的细节,而对于开发者来说好处就是整个日志系统变的可维护性更强。

3.2日志库

既为日志的实现

在这里插入图片描述
JCL是apache开发的,最近一次更新是2014年
jboss-logging只有特定的场景采用
SLF4J,log4j,logback为同一个人开发
jul是为了防止log4j抢占市场而开发出来的
log4j2是apache在log4j上做的升级版,由于新还有许多框架没有适配
最终用slf4j和logback(一般的后台开发如此,其他场景需因地制宜)

3.3日志适配器

日志门面适配器:因为log4j出现的很早,没考虑到slf4j接口,日志门面适配器,其原理就是实现了门面的方法真正调用的时候又调用log4j。

日志库适配器:老工程中为了开发方便直接调用了日志库来完成日志打印,但是又想改为现在标准的门面模式,为了方便直接提供一个从就旧日志库到日志门面的路由,这样就实现了在不改变代码的前提下使用门面来管理日志,而后续自由的替换日志库也不成问题。

4.遗留问题的解决

Jiacheng开发一个后台应用,决定采用slf4j+logback的形式,但是依赖了spring(commons-logging),hibernate(jboss-logging)…,最终要实现所有框架统一实现slf4j+logback

在这里插入图片描述

  1. 将原有的框架的日志依赖排除(排除之后框架无法运行,因为底层进行日志记录的所需要的类已经不再)
  2. 引入中间包(中间包就是和被排除的依赖包具有相同的包结构和类,只不过类又去调用slf4j)
    spring boot的转换包
    spring boot的转换包(spring boot采用slf4j+logback,但是底层的spring采用commons-logging,解决办法就是如上,spring的commons-logging依赖已经被排除,又导入了转换包,但是如果自己引入其他框架一定要将默认的日志依赖排除否则会报错,因为spring boot底层有所有的日志转换包,日志转换包就是和被转换的日志依赖一样的包结构和类名,不排除的话会报错,对于spring boot来说底层采用slf4j+logback,能自动的适配所有的日志,但是要将手动引入的框架的手动依赖排除)

5.开发中日志的使用

  1. 记录操作轨迹,例如可以记录用户的登陆时间,跳转链接等进而数据的分析用户偏好
  2. 监控系统运行情况,空指针等异常的监控,或者当cpu使用率过大的时候应该提醒工程师及时处理
  3. 故障回溯,当发生内存溢出的时候,如果日志记录了问题发生时的堆信息,就可以知道是什么对象在大量的产生并且没有释放内存

6.开发中使用的建议

  1. 推荐日志文件至少保存15天(某些异常会以周为频此出现),并且在生产环境中,严禁输出debug级别的日志,有选择的输出info日志,还要避免重复打印,在配置文件中配置additivity=“false”
  2. 对于debug,info级别预先判断日志级别,或者使用占位符形式输出 ,例如一个应用如果指定了级别为warn,针对debug的日志,logger.debug(“XXXX”+某实例);会执行字符串拼串操作,还会执行tostring方法,但是该日志不会打印
//使用条件if(logger.isDebugEnable){
logger.debug(XXXXXXXXXXXXXXX);}//使用占位符logger.debug("id {} and xx {}",id,xx);
  1. 对于某些业务异常例如输入不正确的参数可以采用warn级别,ERROR级别的错误一般表示需要人为介入,error一般是系统逻辑错误,异常,或者违反重要的业务规则,其他错误都可以归为warn
  2. 记录时要保证上下文信息和堆栈信息一起记录,并且如果直接打印对象确保重写equals方法例如
logger.error("XXX"+e.getMessage(),e);

6.logger应该被定义为static变量,因为使其与当前类绑定,避免每一次都new一个新对象,造成资源浪费

private final static Logger logger = XXXXXXXXXXXXX;

转载地址:https://blog.csdn.net/Naruto_c/article/details/88072250 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:日志
下一篇:日志

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2024年03月10日 02时13分22秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章