- slf4j+log4j组合使用的pom依赖
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.21</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.21</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
- 主要元素
log4j.rootLogger or log4j.rootCategory
log4j.logger.${appenderName}
org.apache.log4j.ConsoleAppender
org.apache.log4j.FileAppender
org.apache.log4j.DailyRollingFileAppender
org.apache.log4j.RollingFileAppender
log4j.appender.${appenderName}.layout
org.apache.log4j.SimpleLayout
org.apache.log4j.HTMLLayout
org.apache.log4j.xml.XMLLayout
org.apache.log4j.TTCCLayout
org.apache.log4j.PatternLayout(常用)
log4j.debug log的log日志输出
log4j.appender.${appenderName}.Threshold
log4j.appender.${appenderName}.layout.ConversionPattern
#%m——输出代码中指定的消息
#%p——输出优先级,即DEBUG、INFO、WARN、ERROR、FATAL
#%r——输出自应用启动到输出该log信息耗费的毫秒数
#%c——输出所属的类目,通常就是所在类的全名
#%t——输出产生该日志事件的线程名
#%n——输出一个回车换行符,Windows平台为"\r\n",Unix平台为"\n"
#%d——输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式
#比如:%d{yyy MMM dd HH:mm:ss},输出类似:
#2015年7月21日 12:12:12,921
#%l——输出日志事件的发生位置,包括类目名、发生的线程、以及在代码中的行数
#%X{ip}: MDC。
#%%: 输出一个"%"字符
#%F: 输出日志消息产生时所在的文件名称
#%L: 输出代码中的行号(%l已包含了行号)
#此配置是PatternLayout对应的 其他的layout配置 会出现警告日志
● log4j.additivity.${appenderName} 设置父类输出
- logger的继承
og4j.additivity 只是appender时过滤并不影响log4j的继承
log4j配置动态修改配置文件 PropertyConfigurator configure/configureAndWatch
log4j的MDC NDC,我们日志中心的上下文实现
slf4j的format
- 应用程序中获取日志的初始化流程
- 日志LogManager的加载
- 日志属性的处理
- 打印日志输出逻辑, 以debug为例
- 核心类/接口
○ Logger对记录日志动作的抽象,它提供了记录不同级别日志的接口
○ RootLogger在Log4J中,所有Logger实例组成一个单根的树状结构,没有父节点,其Level字段必须设值以防止其他Logger实例都没有设置Level值的情况
○ LoggerRepository、Logger实例的容器 其实现类 Hierarchy
○ Level 日志级别抽象
○ LoggingEvent 日志信息
○ Appender 输出
○ Layout 输出的格式
○ LogManager 将Configurator和LoggerRepository整合在一起
- 核心类图
- 扩展
自定义appender ,通过继承AppenderSkeleton
自定义layout,自定义Layout
- 源码中使用的设计模式
1、适配器模式 logger的封装 Log4jLoggerAdapter
2、单例模式 StaticLoggerBinder
3、工厂模式 ILoggerFactory
4、外观模式 Logger
5、解释器模式 PatternLayout
6、空对象模式 NullAppender 很多时候对象为null也是正常的,但是这个null会导致使用过程中的空指针异常,因此需要使用的地方,在每次使用前都要判断下是否为null,然后再使用,使用空对象可以免去繁琐的判断