日志组件
1. 日志是什么
- 日志是软件应用必备的组件,是程序debug,或是数据收集管理的重要依据,方便我们监测生产环境的变量值变化以及代码运行轨迹。本课程主要用来学习实际开发中常用的日志组件。
- 主要是为了方便我们监测生产环境的变量值变化以及代码运行轨迹等。
- 这些记录会被输出到我们指定的位置形成文件,帮助我们分析错误以及用户请求轨迹。
2. 常用日志组件
2.1 Log4j与log4j2.x
Log4j有8种不同的log级别,按照等级从低到高依次为:ALL>TRACE>DEBUG>INFO>WARN>ERROR>FATAL>OFF。如果配置为OFF级别,表示关闭log。
Log4j目前两个版本,log4j与log4j2。Log4j2的前身是log4j,它吸收了logback的设计,重新推出的一款新组件,且使用.xml/.json文件来替换了之前.properties来配置。Log4j2采用异步日志器,基于LMAX Disruptor库,相比较log4j高出10倍吞吐量。
Log4j支持两种格式的配置文件:properties和xml。包含三个主要的组件:Logger、appender、Layout。
2.2. 日志门面
2.2.1. Common-logging
Common-logging简称JCL,Common-logging是Apache提供的一个通用日志API,可以让应用程序不再依赖于具体的日志实现工具。该日志接口对其它一些日志工具,包括Log4J、Avalon LogKit、JUL等,进行了简单的包装,可以让应用程序在运行时,直接将日志适配到对应的日志实现工具中。
Common-logging通过动态查找的机制,在程序运行时自动找出真正使用的日志库。这一点与slf4j不同,slf4j是在编译时静态绑定真正的Log实现库。
2.2.2. Slf4j
SLF4J全称The Simple Logging Facade for Java,简单日志门面,这个不是具体的日志解决方案,而是通过门面模式提供一些Java Logging API,类似于JCL。
使用SLF4J日志门面时,如果需要使用某一种日志实现,则需要选择正确的SLF4J的jar包(称为日志桥接)。SLF4J提供了统一的记录日志的接口,只要按照其提供的方法记录即可,最终日志的格式、记录级别、输出方式等通过具体日志系统的配置来实现,因此可以在应用中灵活切换日志系统。
3. 使用
Log4j
1.导包
##log4j.properties
############ERROR WARM INFO DEBUG#####################
##rootLogger=全局日志级别定义,输出位置1,输出位置2
log4j.rootLogger=INFO,CONSOLE,logfile,errfile,MAIL
############### CONSOLE OutPut ###############
#ConsoleAppender FileAppender DailyRollingFileAppender RollingFileAppender WriterAppender
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
#HTMLLayout PatternLayout SimpleLayout TTCCLayout
##输出位置格式PatternLayout
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
##定义PatternLayout格式样式
log4j.appender.CONSOLE.layout.ConversionPattern=%d %p [%c] - %m%n
############### Default Log Output #################
log4j.logger.logfile=INFO,logfile
log4j.appender.logfile=org.apache.log4j.RollingFileAppender
log4j.appender.logfile.Append=true
log4j.appender.logfile.Threshold=INFO
log4j.appender.logfile.File=D:/log/myweb.log
log4j.appender.logfile.MaxFileSize=51200KB
log4j.appender.logfile.MaxBackupIndex=5
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n
############### Custom Err Output #################
log4j.logger.errfile=ERROR,errfile
log4j.appender.errfile=org.apache.log4j.RollingFileAppender
log4j.appender.errfile.Append=true
log4j.appender.errfile.Threshold=ERROR
log4j.appender.errfile.File=${ssm.root}/WEB-INF/log/error.log
log4j.appender.errfile.MaxFileSize=51200KB
log4j.appender.errfile.MaxBackupIndex=5
log4j.appender.errfile.layout=org.apache.log4j.PatternLayout
log4j.appender.errfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n
############### MAIL Output #################
#log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
#log4j.appender.MAIL.Threshold=ERROR
#log4j.appender.MAIL.BufferSize=1
##smtp server addr
#log4j.appender.MAIL.SMTPHost=smtp.exmail.qq.com
##email title
#log4j.appender.MAIL.Subject=InterfaceErrorMessage
##email user from
#log4j.appender.MAIL.From=f@f.com
##email user noticegroup a@a.com,b@b.com
#log4j.appender.MAIL.To=a@a.com,b@b.com
##username
#log4j.appender.MAIL.SMTPUsername=f@f.com
##password
#log4j.appender.MAIL.SMTPPassword=Password
#log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout
#log4j.appender.MAIL.layout.ConversionPattern=[InterfaceErrorMessage] [%p] [%d{yyyy-MM-dd HH:mm:ss}] [ Class = %C | Method = %M | Line = %L ] | %m%n
############### Log4j SQL Output #################
##对某个包下定义日志级别
log4j.logger.com.javasm=INFO
log4j.logger.org.springframework=INFO
#log4j.logger.com.ibatis = DEBUG,CONSOLE
#log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG
#log4j.logger.com.ibatis.common.jdbc.ScriptRunner=DEBUG
#log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG
#log4j.logger.java.sql=DEBUG,CONSOLE
#log4j.logger.java.sql.Connection=DEBUG
#log4j.logger.java.sql.Statement=DEBUG
#log4j.logger.java.sql.PreparedStatement=DEBUG
#log4j.logger.java.sql.ResultSet=DEBUG
#log4j.logger.org.apache.ibatis.logging.commons.JakartaCommonsLoggingImpl=DEBUG
private Logger l = LogManager.getLogger(SysuserHandler.class);
l.debug("---debug信息--");
l.info("---info信息--");
l.warn("---warn信息--");
l.error("---error信息--");
Log4j2
1.导包
2.xml配置
<!-- log4j2.xml 直接放resource文件夹里就可以 -->
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appenders>
<!-- 控制台输出 -->
<console name="Console" target="SYSTEM_OUT">
<PatternLayout
pattern="%d{HH:mm:ss.SSS} [%t] %-5level %class %L %M -- %msg%n" />
</console>
<!-- fileName:输出路径 filePattern:命名规则 -->
<RollingFile name="RollingFileDebug"
fileName="D:/logs/debug.log"
filePattern="D:/logs/$${date:yyyy-MM-dd}/debug-%d{yyyy-MM-dd}-%i.log">
<Filters>
<ThresholdFilter level="DEBUG" />
<ThresholdFilter level="INFO" onMatch="DENY"
onMismatch="NEUTRAL" />
</Filters>
<!-- 输出格式 -->
<PatternLayout
pattern="%d{HH:mm:ss.SSS} [%t] %-5level %class{36} %L %M - %msg%n" />
<Policies>
<!-- 单个日志文件的大小限制 -->
<SizeBasedTriggeringPolicy size="100 MB" />
</Policies>
<!-- 最多保留20个日志文件 -->
<DefaultRolloverStrategy max="20" />
</RollingFile>
<RollingFile name="RollingFileInfo"
fileName="D:/logs/info.log"
filePattern="D:/logs/$${date:yyyy-MM-dd}/info-%d{yyyy-MM-dd}-%i.log">
<Filters>
<ThresholdFilter level="INFO" />
<ThresholdFilter level="WARN" onMatch="DENY"
onMismatch="NEUTRAL" />
</Filters>
<!-- 输出格式 -->
<PatternLayout
pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n" />
<Policies>
<!-- SizeBasedTriggeringPolicy单个文件的大小限制 -->
<SizeBasedTriggeringPolicy size="100 MB" />
</Policies>
<!-- DefaultRolloverStrategy同一个文件下的最大文件数 -->
<DefaultRolloverStrategy max="20" />
</RollingFile>
<RollingFile name="RollingFileWarn"
fileName="D:/logs/warn.log"
filePattern="D:/logs/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">
<Filters>
<ThresholdFilter level="WARN" />
<ThresholdFilter level="ERROR" onMatch="DENY"
onMismatch="NEUTRAL" />
</Filters>
<PatternLayout
pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n" />
<Policies>
<!--<TimeBasedTriggeringPolicy modulate="true" interval="1"/> -->
<SizeBasedTriggeringPolicy size="100 MB" />
</Policies>
<!--最多保留20个日志文件 -->
<DefaultRolloverStrategy max="20" min="0" />
</RollingFile>
<RollingFile name="RollingFileError"
fileName="D:/logs/error.log"
filePattern="D:/logs/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log">
<Filters>
<ThresholdFilter level="ERROR" />
<ThresholdFilter level="FATAL" onMatch="DENY"
onMismatch="NEUTRAL" />
</Filters>
<PatternLayout
pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n" />
<Policies>
<!--<TimeBasedTriggeringPolicy modulate="true" interval="1"/> -->
<SizeBasedTriggeringPolicy size="100 MB" />
</Policies>
<!--最多保留20个日志文件 -->
<DefaultRolloverStrategy max="20" min="0" />
</RollingFile>
</appenders>
<loggers>
<!-- 程序员看的日志一般是异步日志,运营日志一般是同步日志 -->
<!-- 异步日志 -->
<!--过滤掉spring和mybatis的一些无用的debug信息 -->
<!--<AsyncLogger name="org.springframework" level="error" includeLocation="true">-->
<!--<AppenderRef ref="RollingFileError"></AppenderRef>-->
<!--</AsyncLogger>-->
<!--<AsyncLogger name="org.mybatis" level="error" includeLocation="true">-->
<!--<AppenderRef ref="RollingFileError"></AppenderRef>-->
<!--</AsyncLogger>-->
<!--<AsyncLogger name="com.alibaba.druid" level="error" includeLocation="true">-->
<!--<AppenderRef ref="RollingFileError"></AppenderRef>-->
<!--</AsyncLogger>-->
<!---->
<!--<AsyncLogger level="debug" includeLocation="true">-->
<!--<AppenderRef ref="RollingFileDebug"></AppenderRef>-->
<!--<appender-ref ref="RollingFileWarn"/>-->
<!--<appender-ref ref="RollingFileError"/>-->
<!--<appender-ref ref="RollingFileFatal"/>-->
<!--</AsyncLogger>-->
<!--<AsyncRoot level="info">-->
<!--<appender-ref ref="Console"/>-->
<!--<appender-ref ref="RollingFileInfo"/>-->
<!--</AsyncRoot>-->
<!-- 同步日志 -->
<!-- logger 局部日志控制 -->
<logger name="org.springframework" level="error"></logger>
<logger name="org.mybatis" level="error"></logger>
<logger name="org.apache" level="error"></logger>
<!-- root 全局日志控制 -->
<root level="all">
<appender-ref ref="Console"/>
<appender-ref ref="RollingFileDebug"/>
<appender-ref ref="RollingFileInfo"/>
<appender-ref ref="RollingFileWarn"/>
<appender-ref ref="RollingFileError"/>
</root>
</loggers>
</configuration>
3.使用
private Logger l = LogManager.getLogger(SysuserHandler.class);
l.debug("---debug信息--");
l.info("---info信息--");
l.warn("---warn信息--");
l.error("---error信息--");
Slf4j
1.导包(到时候换日志组件的时候 把所需换的jar包换掉就可以继续使用了)
2.使用
private Logger l = LoggerFactory.getLogger(SysuserHandler.class);
l.debug("---debug信息--");
l.info("---info信息--");
l.warn("---warn信息--");
l.error("---error信息--");