日志实践:门面日志&日志系统 SLF4J&LOG4J

日志实践:门面日志框架&日志系统

    • 相关概念和介绍
    • 日志实践案例
    • 日志使用规范
    • 注意事项

相关概念和介绍

  1. 系统日志 ,记录系统中硬件、软件和系统问题的信息,同时还可以监视系统中发生的事件。用户可以通过它来检查错误发生 的原因,或者寻找受到攻击时攻击者留下的痕迹。系统日志包括系统日志、应用程序日志和安全日志。 图片:日志实践:门面日志&日志系统 SLF4J&LOG4J_第1张图片
  2. 日志系统 ,日志的具体实现,如:Log4J、LogBack、Loggin等日志系统 。
    多种日志系统的存在,出现了日志系统的兼容问题,为了解决这个问题,日志框架应运而生。
  3. 常用日志框架:
    Common-logging是apache提供的一个通用日志接口,只是规定了日志的接口规范,主流的日志系统都实现了commons-logging定义的接口;
    SLF4J即:java简单日志门面。slf4j不是具体的日志解决方案,它只服务于各种各样的日志系统。SLF4J是一个用于日志系统的简单Facade,允许最终用户在部署其应用时使用其所希望的日志系统
  4. 日志系统和日志框架经典搭配举例:
    Log4j + commons-logging
    logback + slf4j
    log4j + slf4j

日志实践案例

应用是多个包project关联引用的,如今加入一个新的功能包,search project。
应用原日志情况:应用包 已经使用了日志系统Log4J;新的功能作为一个新加的包project缺少日志记录功能
日志改造目的:给新加的search project加上日志记录的功能,而且不影响原本旧的应用其他包的日志功能。
技术选型及原因:考虑到不同项目project甚至第三方包存在不同的日志系统,存在兼容性问题,因此,选用日志框架SLF4J 和 日志系统Log4J的组合。
应用新日志情况

  1. search project 引入相关的jar包【slf4j和log4j用到的jar包】
  2. 添加日志配置文件log4j.xml【具体实现是log4j,所以日志配置等都是log4j的使用】
  3. 代码关键位置、需要记录日志的位置 添加 日志记录代码 【代码引入使用引入的类要用slf4j的类】
  4. search project自身测试是否能够记录日志。如成功
  5. 日志配置文件内容复制到应用的log4j.xml,删除搜索引擎的log4j.xml
  6. 应用测试日志记录。
    SLF4J : 不是具体的日志解决方案,它只服务于各种各样的日志系统;
    Log4J 才是日志的真正实现。Log4J的三个组件:记录器logger、追加器appender、布局layout

    log4j.xml添加的日志配置:

	
		
		
		
		
		
		
			
		
	
	
	
		
		
		
	

常用的几种appender有:

org.apache.log4j.ConsoleAppender(控制台)
org.apache.log4j.FileAppender(文件)
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)

使用指定的Layout来展示(格式化)日志,常见的Layout有:

org.apache.log4j.HTMLLayout(以HTML表格形式布局)
org.apache.log4j.PatternLayout(可以灵活地指定布局模式)
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

ConversionPattern参数的格式含义:

格式名  		     含义   
%c        		 输出日志信息所属的类的全名   
%f         		 输出日志信息所属的类的类名      
%m        	     输出代码中指定的信息,如log(message)中的message   
%n         		 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”   
%p         		 输出优先级,即TRACE,DEBUG,INFO,WARN,ERROR,FATAL。

日志代码使用静态变量还是实例变量?推荐 静态变量

项目 优点 代码案例
静态变量 共用一个变量;CPU开销更少:日志记录程序只在托管类初始化时检索和分配一次;内存开销更少:logger声明将每个类使用一个引用。不支持注入 public static final Logger LOGGER = LoggerFactory.getLogger(“hy.search”);
实例变量 即使对于应用程序之间共享的库,也可以利用存储库选择器。但是,存储库选择器仅在底层日志记录系统是logback-classic时才有效。存储库选择器不适用于SLF4J + log4j组合。[对象变量Logger支持注入,对于一个JVM中运行的多个引用了同一个类库的应用程序,可以在不同的应用程序中对同个类的Logger进行不同的配置] Logger crawlerLogger = LogManager.getLogger(“hy.crawler”);

打印日志语句举例:

~Util.LOGGER.debug(“创建新的连接{}”, bean.getHost());
~Util .LOGGER.info(“添加成功!”);

日志使用规范

参考阿里巴巴Java开发规范,如:

  1. 应用中不可以直接使用日志系统的api,而应该依赖日志框架SLF4j的api.
    Public static final Logger LOGGER=LoggerFactory.getLogger(“hy.search”);
  2. 对trace/debug/info级别的日志输出,必须使用条件输出形式或者使用占位符的形式.
    ServerUtil.LOGGER.debug(“JDBCUtil getConnection {}”, conn);

其他的日志使用建议:

  1. 保证记录日志本身不能出错.比如:logger.info()语句本身出现空指针异常
  2. 避免敏感信息,比如:用户密码、用户个人信息等,在日志里应该只记录用户的唯一标识
  3. 记录“不可能发生的事情”,在正常逻辑下,某些情况永远不可能发生的,但是还是要给这些情况打印一些日志。比如:条件语句里的else;switch里的default.[防御式编程]

注意事项

记录日志的时机:

  1. 编程语言提示异常:如今各类主流的编程语言都包括异常机制,业务相关的流行框架有完整的异常模块。根据实际结合业务的情况使用warn或者error级别。
  2. 业务流程预期不符:如外部参数不正确等问题,取决于开发人员的经验。结合实际业务,使用WARN和ERROR级别日志。
  3. 系统核心角色,组件关键动作:如用户从登陆到交易完成的整个流程,各个服务节点间交互的位置,核心组件运行过程等。建议记录INFO级别日志。
  4. 系统及各模块初始化:各个服务组件的启动参数,状态信息。建议INFO级别日志记录

日志应该记录什么:

  1. when时间:日志记录的事件的发生时间;一个或一组事件的持续时间
  2. where地点:事件产生的地点,可以是模块、文件、函数等,至少包含模块信息。
  3. how怎么样(重要性):要有日志等级,代表日志的重要性、紧急程度
  4. what什么:日志主体内容,描述发生的事情,如:用户登录失败!
  5. who谁:事件产生的唯一标志,区分同样的时间。如:用户张三登录失败!
  6. context内容:专指高度依赖于具体的日志内容的信息,用于定位问题的具体原因。如:用户张三由于密码错误登录失败!

日志等级的使用:
FATAL:强制关闭服务或应用程序 以防止数据丢失的任何错误[这个一般会是最后一条日志消息][服务挂了]
ERROR:[严重错误]任何对操作致命的错误[无法打开所需文件、缺少数据等等]。影响用户的正常访问,强制用户[管理员或直接用户]进行干预。通常是程序中保留不正确的连接符、缺少服务等。[服务活着但无法通提供正常服务]
WARN:[一般警告]任何可能导致应用程序错误的东西。[从主服务器切换到备份服务器,重试操作,丢失辅助数据…][不用马上处理但是要及时处理]
INFO: [一般要显示的信息]通常用于记录有用的信息[服务启动/停止,配置…] 始终可用但是通常在正常情况下不关心。开箱即用的配置级别。
DEBUG:[程序的调试信息]任何有助于跟踪系统流程并隔离问题的信息,特别是在开发和质量测试阶段
TRACE:通常不使用,非常详细的信息。找到函数的一部分。

其他:
应用是多个项目project引用关联是,注意jar版本一致;
如果是使用weblogic,它是自带日志的,要在weblogic.xml中声明,才能使用到其他日志系统;

参考链接:包括不限于以下…
[1]: http://ju.outofmemory.cn/entry/370706
[2]: https://www.cnblogs.com/xybaby/p/7954610.html?=330443877
[3]: https://www.cnblogs.com/huahua035/p/8022010.html

你可能感兴趣的:(Java)