一:目录
1.jul的使用
2.log4j的使用
3.logback的使用
4.log4j2的使用
二:jul使用
jul是JDK自带的日志技术,不需要导入其他依赖,默认的级别为info
1.关键组件:
(1).Logger:记录器
(2).Handler:处理器
(3).Formatter:布局
2.代码中配置jul:
@Test
public void julLogger() throws Exception {
Logger logger=Logger.getLogger("com.wxy.example");
logger.info("日志技术");
logger.log(Level.INFO,"info级别");
System.out.println("-------------------");
//关闭系统默认配置
logger.setUseParentHandlers(false);
//自定义配置日志级别
//创建ConsoleHandler
ConsoleHandler consoleHandler=new ConsoleHandler();
//创建简单格式转换对象
SimpleFormatter simpleFormatter=new SimpleFormatter();
//进行关联
consoleHandler.setFormatter(simpleFormatter);
consoleHandler.setLevel(Level.ALL);
logger.addHandler(consoleHandler);
//配置日志具体级别
logger.setLevel(Level.ALL);
logger.severe("错误信息");
logger.warning("警告信息");
logger.info("日志输出");
logger.fine("fine");
logger.finer("finer");
logger.finest("finest");
}
3.在配置文件中配置:
handlers= java.util.logging.ConsoleHandler
.level= ALL
java.util.logging.ConsoleHandler.level= ALL
java.util.logging.ConsoleHandler.formatter= java.util.logging.SimpleFormatter
java.util.logging.ConsoleHandler.encoding= UTF-8
java.util.logging.FileHandler.pattern= D:/\u4EE3\u7801/Logs/ssm-jul-java%u.log
java.util.logging.FileHandler.limit= 50000
java.util.logging.FileHandler.count= 1
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
java.util.logging.FileHandler.append = true
文件名为logging.properties,配置了两种Handler,一种输出在控制台,一种输出在文件中。
@Test
public void julLogger() throws Exception {
InputStream
inputStream=example.class.getClassLoader().
getResourceAsStream("logging.properties");
LogManager logManager=LogManager.getLogManager();
logManager.readConfiguration(inputStream);
Logger logger=Logger.getLogger("com.wxy");
logger.severe("错误信息");
logger.warning("警告信息");
logger.info("日志输出");
logger.fine("fine");
logger.finer("finer");
logger.finest("finest");
}
需要用到LogManager对象来读取配置文件。
4.slf4j与jul结合使用:
依赖:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.36</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jdk14</artifactId>
<version>1.7.26</version>
</dependency>
注意添加依赖的版本不同问题。
public class test {
private static final Logger LOGGER=LoggerFactory.getLogger(test.class);
public static void main(String[] args) {
//PropertyConfigurator.configure("src/main/resources/log4j.properties");
LOGGER.error("错误信息");
LOGGER.warn("警告信息");
LOGGER.info("普通信息");
LOGGER.debug("调试信息");
LOGGER.trace("trace信息");
String username="张三";
String password="13579";
LOGGER.info(username+password);
LOGGER.info("zhuijia ");
}
}
使用slf4j门面技术,需要通过LoggerFactory.getLogger()方法获取Logger实例对象,使用的是slf4j 提供的自动配置,也可以添加logging.properties配置文件进行配置,slf4j可以自动识别并读取配置文件。
三:log4j的使用:
1.关键组件:
(1).loggers:日志记录器,遵循父继子承的关系。
(2).appender:输出控制器
ConsoleAppender:输出位置为控制台;
FileAppender:输出位置为文件;
DailyRollingFileAppender:根据日期更新拆分日志文件;
RollingFileAppender:根据大小拆分日志文件;
JDBCAppender:输出位置为数据库。
(3).layout:输出格式
HTMLLayout:输出HTML格式的数据;
SimpleLayout:输出默认格式的数据;
PatternLayout:自定义输出格式。
log4j的PatternLayout的常用占位符:
c 用于输出日志事件的类别。例如,对于类别名称"a.b.c",模式%c{2}将输出"b.c"。
C 用于输出发出日志记录请求的调用方的全限定类名。例如,对于类名"org.apache.xyz.SomeClass",模式%C{1}将输出"SomeClass"。
d 用于输出记录事件的日期。例如,%d{HH:mm:ss,SSS}或%d{dd MMM yyyy HH:mm:ss,SSS}。
F 用于输出发出日志请求的文件名。
l 用于输出生成日志事件的呼叫者的位置信息。
L 用于输出发出记录请求的行号。
m 用于输出与日志记录事件关联的应用程序提供的消息。
M 用于输出发出记录请求的方法名称。
n 输出平台相关的行分隔符或多个字符。
p 用于输出日志事件的优先级。
r 用于输出从布局的构造到创建日志记录事件所经过的毫秒数。
t 用于输出生成日志事件的线程的名称。
x 用于输出与生成日志事件的线程关联的NDC(嵌套诊断上下文)。
X X转换字符后跟MDC的密钥。例如,X{clientIP}将根据密钥clientIP打印MDC中存储的信息。
2.使用默认配置:
@Test
public void Log4jLogger() {
BasicConfigurator.configure();
Logger logger=Logger.getLogger("com.wxy.example");
logger.fatal("fatal信息,危险信息!!!");
logger.error("错误信息!!!");
logger.warn("warn警告信息");
logger.info("info普通信息");
logger.debug("debug调试信息");
logger.trace("trace信息");
String nameString="zhangsan";
logger.info("info信息"+nameString);
}
使用默认配置时一定要加上BasicConfigurator.configure();
3.自定义配置:
log4j.rootLogger=INFO,console,dailyRollingFileAppender
#log4j.logger.com.wxy=INFO,console,logFile
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%-10p] [%t] [%d{yyyy-MM-dd HH:mm:ss:SSS}] [%l] %m%n
log4j.appender.logFile=org.apache.log4j.FileAppender
log4j.appender.logFile.layout=org.apache.log4j.PatternLayout
log4j.appender.logFile.layout.ConversionPattern=[%-10p] [%t] [%d{yyyy-MM-dd HH:mm:ss:SSS}] [%l] %m%n
log4j.appender.logFile.File=D:/\u4EE3\u7801/Logs/ssm-log4j-java.log
log4j.appender.logFile.Encoding=UTF-8
log4j.appender.rollingFile=org.apache.log4j.RollingFileAppender
log4j.appender.rollingFile.layout=org.apache.log4j.PatternLayout
log4j.appender.rollingFile.layout.conversionPattern=[%-10p] [%t] [%d{yyyy-MM-dd HH:mm:ss:SSS}] [%l] %m%n
log4j.appender.rollingFile.File=D:/\u4EE3\u7801/Logs/ssm-log4j-java.log
log4j.appender.rollingFile.Encording=UTF-8
log4j.appender.rollingFile.maxFileSize=10KB
log4j.appender.rollingFile.maxBackupIndex=5
log4j.appender.dailyRollingFileAppender=org.apache.log4j.DailyRollingFileAppender
log4j.appender.dailyRollingFileAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.dailyRollingFileAppender.layout.conversionPattern=[%-10p] [%t] [%d{yyyy-MM-dd HH:mm:ss:SSS}] [%l] %m%n
log4j.appender.dailyRollingFileAppender.File=D:/\u4EE3\u7801/Logs/log4j.log
log4j.appender.dailyRollingFileAppender.Encoding=UTF-8
log4j.appender.dailyRollingFileAppender.DatePattern='.'yyyy-MM-dd
@Test
public void Log4jLogger() {
Logger logger=Logger.getLogger("com.wxy.example");
logger.fatal("fatal信息,危险信息!!!");
logger.error("错误信息!!!");
logger.warn("warn警告信息");
logger.info("info普通信息");
logger.debug("debug调试信息");
logger.trace("trace信息");
String nameString="zhangsan";
logger.info("info信息"+nameString);
}
log4j会自动识别并读取配置文件,不需要手动添加。
4.slf4j与log4j的结合使用:
依赖:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.36</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.36</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
注意版本问题。
public class test {
private static final Logger LOGGER=LoggerFactory.getLogger(test.class);
public static void main(String[] args) {
PropertyConfigurator.configure("src/main/resources/log4j.properties");
LOGGER.error("错误信息");
LOGGER.warn("警告信息");
LOGGER.info("普通信息");
LOGGER.debug("调试信息");
LOGGER.trace("trace信息");
String username="张三";
String password="13579";
LOGGER.info(username+password);
LOGGER.info("zhuijia ");
}
}
log4j.properties文件需要手动添加。
四:logback的使用:
logback通常与slf4j一块使用,默认级别为debug,可以使用异步日志。
1.依赖:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.36</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.11</version>
</dependency>
添加slf4j-api和logback-classic依赖,添加了logback-classic会自动添加logback-core。
2.配置文件:
<configuration>
<property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSSS} %c %M %L [%thread] %m%n"/>
<property name="log_dir" value="D:/代码/Logs"/>
<!-- 输出地址为控制台 -->
<appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
<!-- 控制输出流对象,默认System.out改为System.err,输出语句会变成红色的 -->
<target>System.err</target>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!-- 控制输出的格式 -->
<pattern>${pattern}</pattern>
</encoder>
</appender>
<!-- 输出地址为文件 -->
<appender name="fileAppender" class="ch.qos.logback.core.FileAppender">
<file>${log_dir}/logback.log</file>
<append>true</append>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!-- 控制输出的格式 -->
<pattern>${pattern}</pattern>
</encoder>
</appender>
<!-- 以HTML格式输出文件中 -->
<appender name="fileHTMLAppender" class="ch.qos.logback.core.FileAppender">
<file>${log_dir}/logback.html</file>
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="ch.qos.logback.classic.html.HTMLLayout">
<pattern>${pattern}</pattern>
</layout>
</encoder>
</appender>
<!-- 按照每天生成日志文件 -->
<appender name="APP_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名 -->
<FileNamePattern>${log_dir}/error-%d{yyyy-MM-dd}.log</FileNamePattern>
<!--日志文件保留天数 -->
<MaxHistory>5</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
<charset>UTF-8</charset>
</encoder>
<!-- 此日志文件只记录error级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>error</level>
<!-- 超过放行 -->
<onMatch>ACCEPT</onMatch>
<!-- 否则拦截 -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 异步日志 -->
<appender name="ASYNC_FILE" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="consoleAppender" />
</appender>
<root level="ALL">
<appender-ref ref="consoleAppender"/>
<appender-ref ref="fileAppender"/>
<appender-ref ref="fileHTMLAppender"/>
</root>
<!-- 自定义logger additivity属性是否继承root属性 -->
<logger name="com.wxy" level="ALL" additivity="false">
<appender-ref ref="consoleAppender"/>
<appender-ref ref="APP_ERROR"/>
</logger>
</configuration>
3.测试:
public class test {
private static final Logger LOGGER=LoggerFactory.getLogger(test.class);
public static void main(String[] args) {
LOGGER.error("错误信息");
LOGGER.warn("警告信息");
LOGGER.info("普通信息");
LOGGER.debug("调试信息");
LOGGER.trace("trace信息");
String username="张三";
String password="13579";
LOGGER.info(username+password);
LOGGER.info("zhuijia ");
}
}
五:log4j2的使用:
log4j2既包含了日志门面也包含了日志技术。但现在最主流的还是slf4j+log4j2的日志框架技术。
log4j2的PatternLayout的常用占位符:
- %m:输出日志消息(message)。
- %n:换行符。
- %c{10}:输出Logger的名称,最多显示10个字符。
- %l:输出日志事件的位置信息,包括类名、方法名、行号等。
- %C{1}:输出Logger的类名的最后一个元素(不包括包路径)。
- %L:输出日志事件所在的行号。
- %M:输出调用日志事件的方法名。
- %d:输出日志时间日期。
- %p:输出日志级别。
- %t:输出线程名。
- %r:输出自应用启动到输出该日志信息耗费的时间。
- %x:输出线程上下文信息。
- %X{key}:输出指定key的MDC(Mapped Diagnostic Context)信息。
- %throwable:输出异常信息。
- %highlight{level}:根据日志级别高亮显示日志消息。
1.依赖:
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.17.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.17.1</version>
</dependency>
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>3.4.2</version>
</dependency>
2.配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<!-- status="warn" 日志框架本身的输出日志级别
monitorInterval="5" 自动加载配置文件的间隔时间,不低于5秒
-->
<configuration status="warn" monitorInterval="5">
<properties>
<property name="LOG_HOME">D:/代码/Logs</property>
<property name="consolePattern">%d{HH:mm:ss.SSS} [%t] [%-5level] %c{36}:%l --- %m%n</property>
<property name="filePattern">[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %l %c{36} - %m%n</property>
</properties>
<appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="${consolePattern}"/>
</Console>
<!-- 使用AsyncAppender异步,性能几乎无变化,不推荐使用 -->
<!-- <Async name="Async">
<AppenderRef ref="Console"/>
</Async> -->
<File name="file" filename="${LOG_HOME}/log4j2.log">
<PatternLayout pattern="${filePattern}"/>
</File>
<!-- 使用随机读写流的日志文件输出appender,性能好 -->
<RandomAccessFile name="accessFile" fileName="${LOG_HOME}/log4j2-myAcclog.log">
<PatternLayout pattern="${filePattern}"></PatternLayout>
</RandomAccessFile>
<!-- 按照一定规则拆分日志文件的appender -->
<RollingFile name="rollingFile" fileName="${LOG_HOME}/log4j2-myrollog.log"
filePattern="${LOG_HOME}/$${date:yyyy-MM-dd}/myrollog-%d{yyyy-MM-dd-HH-mm}-%i.log">
<!-- 日志级别过滤器 -->
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
<!-- 日志消息格式 -->
<PatternLayout pattern="${filePattern}"/>
<Policies>
<!-- 在系统启动时,触发拆分规则,生成一个新的日志文件 -->
<!-- <OnStartupTriggeringPolicy /> -->
<!-- 按照文件大小进行拆分 -->
<SizeBasedTriggeringPolicy size="10 MB"/>
<!-- 按照时间节点进行拆分 -->
<TimeBasedTriggeringPolicy />
</Policies>
<!-- 在同一个目录下,文件的个数限定为30个,超过进行覆盖 -->
<DefaultRolloverStrategy max="30" />
</RollingFile>
</appenders>
<loggers>
<Root level="trace">
<AppenderRef ref="Console" />
<AppenderRef ref="file" />
<AppenderRef ref="rollingFile" />
</Root>
<!-- 使用AsyncLogger混合异步日志 includeLocation属性:日志记录的行号信息 -->
<AsyncLogger name="com.wxy" level="all" includeLocation="false" additivity="false">
<AppenderRef ref="Console"/>
</AsyncLogger>
</loggers>
</configuration>
log4j2拥有多种异步日志的处理方式,主要分为AsyncLogger和AsyncApender。
AsyncApender异步日志的方式不建议使用,因为它和logback的性能差不多。
<Async name="Async">
<AppenderRef ref="Console"/>
</Async>
在appenders标签中添加Async作为appender。
AsyncLogger提供了两种异步日志的方法,一种为全局异步,另一种为混合异步。
全局异步:在src/main/resources/下创建属性文件 log4j2.component.properties,在属性文件中添加如下即可,xml文件不做变化:
log4j2.contextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
混合异步:在log4j2.xml文件中的loggers属性中添加AsyncLogger。
<AsyncLogger name="com.wxy" level="all" includeLocation="false" additivity="false">
<AppenderRef ref="Console"/>
</AsyncLogger>
3.测试:
public class test {
private static final Logger LOGGER=LoggerFactory.getLogger(test.class);
public static void main(String[] args) {
//PropertyConfigurator.configure("src/main/resources/log4j.properties");
LOGGER.error("错误信息");
LOGGER.warn("警告信息");
LOGGER.info("普通信息");
LOGGER.debug("调试信息");
LOGGER.trace("trace信息");
String username="张三";
String password="13579";
LOGGER.info(username+password);
LOGGER.info("zhuijia ");
}
}