为什么要记录日志?
在实际生活中记录日志主要为了日后复查,
比如某个大学老师每天记录自己讲的什么内容,后面有学生某科成绩优异获奖了,校长想要奖励对应的老师,但由于每个老师教的班级都很多,并不一定记得是谁教的,这时候就可以查看教学日志来获取需要的信息了
再比如,工厂的生产日志,如果某个产品除了因为某个零件出现了故障,通过生成日志,可以找到与这个产品同批次的其他产品,进行返工,或是通过日志找到该零件的供应商,进行沟通解决!
程序中的日志
我们的程序开发完成后会被不同系统环境的用户下载使用,期间可能就会出现问题,直接把错误信息展示给用户看是没有任何意义的,用户看不懂也不会解决,那这时候就可以将用户执行的所有操作,以及代码运行的过程,记录到日志中,程序员通过分析日志内容,可以快速的定位问题
综上: 日志就是用来记录发生的事件的
日志并不会立即产生作用,而是当程序出现了问题时在去分析日志文件提取有用信息
java下的日志框架[](https://img2018.cnblogs.com/blog/1440878/202002/1440878-20200220190638284-1676327067.png
门面门面是Facade(外观模式)的实现,也称为门面模式,
是对内部多个子系统的封装,并对外提供一套统一的使用接口,从而屏蔽各个子系统在使用上的不同,大大降低了系统的使用难度,同时提高了系统的可维护性和扩展性;
实际上真正干活的还是是内部的子系统;就像给对这写子系统家里一层装饰,Facede也得名于此;
图示:
因其性能优越性,实际开发中log4j是使用最多一个日志框架,也是我们需要掌握的目标;
官方性能对比:
log4j日志级别:
日志级别其实指的就是日志信息应用场景,我们的程序会在不同的环境中运行,某些日志只有用在某些特殊场景中,例如:在开发阶段,我们为了检查错误,会输出一些调试信息,但是这写信息在生产环境下是不需要的,当然.我们可以在发布前删除这写调试代码,但这就显得非常low了,通过对日志信息区别对待,我们可以很方便的控制哪些日志在哪些场景下正常输出;
log4j日志级别:
log4j定义了8个级别,优先级从高到低依次为:
OFF>FATAL> ERROR> WARN> INFO> DEBUG> TRACE> ALL
ALL 最低等级的 用于打开所有日志记录
TRACE 很低的日志级别 一般不会使用
DEBUG 指出细粒度信息事件对调试应用程序是非常有帮助的 主要用于开发过程中打印 一些运行信 息
INFO 消息在粗粒度级别上突出强调应用程序的运行过程。打印一些你感兴趣的或者重要的信- 息 这 个可以用于生产环境中输出程序运行的一些重要信息但是不能滥用 避免打印过多的日志
WARN 表明会出现潜在错误的情形 有些信息不是错误信息 但是也要给程序员的一些提示
ERROR 指出虽然发生错误事件 但仍然不影响系统的继续运行。打印错误和异常信息 如果不想输出 太多的日志 可以使用这个级别
FATAL 指出每个严重的错误事件将会导致应用程序的退出。这个级别比较高了 重大错误 这种级别 你可以直接停止程序了
OFF 最高等级的,用于关闭所有日志记录
依赖包: <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.5</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.5</version> </dependency> 配置文件:2.x往后的版本不在支持properties作为配置文件,因其无法表达较为复杂的语法结构
log4j2会在classpath下查找配置文件,如果找不到则使用基础配置(输出到控制台),log4j支持 xml,json,jsn三种格式的配置文件,并可为测试环境和生产环境编写不同的配置文件;若有多个配置文件log4j将按照以下顺序读取:
classpath下的名为log4j2-test.json 或者log4j2-test.jsn的文件.
classpath下的名为log4j2-test.xml的文件.
classpath下名为log4j2.json 或者log4j2.jsn的文件.
classpath下名为log4j2.xml的文件.
示例log4j2.xml:
<?xml version="1.0" encoding="UTF-8"?> <!-- status="WARN" 用于设置log4j框架本身的日志级别--> <Configuration status="WARN"> <Appenders> <Console target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Console> </Appenders> <Loggers> <Root level="all"> <AppenderRef ref="Console"/> </Root> </Loggers> </Configuration>测试代码:
@Test public void test1(){ Logger myLogger = LogManager.getLogger("myLogger"); myLogger.debug("debug msg"); } Appenders节点:该节点配置日志信息的输出目的地,可以是控制台,文件,邮件或数据库,控制台和文件是表常用的两个目的地;
上述案例既将日志信息输出到控制台,其子节点PatternLayout用于设置日志输出的字符传格式;