一. 引言

1.1 日志介绍

  • 用于记录系统中发生的各种事件. 记录的位置常见的有: 控制台, 磁盘文件等

1.2 日志级别

  • 日志级别由低到高

    • TRACE, DEBUG, INFO, WARN, ERROR, FATAL

1.3 日志的作用

  • 通过日志观察, 分析项目的运行情况(项目维护)
  • 通过日志分析用户的使用情况(大数据分析)
  • ...

二. 解决方案1

2.1 Log4j + Commons-Logging

2.1.1 导入依赖
  • 项目中导入Log4j 和 Commons-Logging的依赖
<!--log4j-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!--commons-logging-->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
2.1.2 基本使用
  • Log4j + Commons-Logging基本API
package com.dz.test;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.junit.Test; public class LogTest {
//日志对象
private Log log = LogFactory.getLog(LogTest.class);
@Test
public void test() {
log.trace("hello trace");
log.debug("hello debug");
log.info("hello info");
log.warn("hello warn");
log.error("hello error");
log.fatal("hello fatal");
}
}
2.1.3 配置信息
  • 定义配置文件 log4j.xml
#占位符
%p: 输出优先级, 即 DEBUG, INFO, WARN, ERROR, FATAL
%r: 输出自应用启动到输出该log信息耗费的毫秒数
%c: 输出所在类的全名
%t: 输出产生该日志事件的线程名
%n: 输出一个回车换行符
%d: 输出日志时间点的日期或时间, 默认格式为ISO8601, 也可以在其后指定格式, 比如: %d{yyyy-MM-dd HH:mm:ss,SSS}, 输出类似: 2021-01-01 15:26:37,945
%l: 输出日志事件的发生位置, 包括类名, 发生的线程, 以及在代码中的行数. 举例: Testlo4.main(TestLog4.java:10)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//LOGGER"
"http://org/apache/log4j/xml/log4j.dtd">
<log4j:configuration> <!--输出到控制台-->
<appender name="myConsole" class="org.apache.log4j.ConsoleAppender">
<!--输出格式-->
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n"/>
</layout>
</appender>
<!--输出到文件-->
<appender name="myFile1" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="d:/log/hello1.log"/><!--文件位置-->
<param name="Append" value="true"/><!--是否选择追加-->
<param name="MaxFileSize" value="1kb"/><!--文件最大字节数-->
<param name="MaxBackupIndex" value="2"/><!--新文件数量-->
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n"/>
</layout>
</appender>
<!--输出到文件-->
<appender name="myFile2" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="d:/log/daily.log"/><!--文件位置-->
<param name="Append" value="true"/><!--是否选择追加-->
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n"/>
</layout>
</appender>
<!--根logger的设置-->
<root>
<!--优先级设置 all < trace < debug < info < warn < error < fatal < off-->
<priority value="debug"/>
<appender-ref ref="myConsole"/>
<appender-ref ref="myFile1"/>
<appender-ref ref="myFile2"/>
</root>
</log4j:configuration>

三. 解决方案2

3.1 Logback + SLF4j

3.1.1 导入依赖
  • 项目中导入依赖
<!--logback依赖, 还会传递 slf4j 和 logback-core-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
<scope>test</scope>
</dependency>
3.1.2 基本使用
  • Logback + SLF4j 基本API
package com.dz.test;

import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; public class LogTest {
//需要输出日志的类, 可以创建一个log属性
private Logger log = LoggerFactory.getLogger(LogTest.class);
@Test
public void test() throws InterruptedException { log.trace("hello trace");
log.debug("hello debug 张三");
log.info("hello info 张三");
log.warn("hello warn 张三");
log.error("hello error 张三");
//注意: logback中没有fatal日志
}
}
3.1.3 配置信息
  • 定义 logback.xml
#占位符
%d{yyyy-MM-dd HH:mm:ss,SSS}: 日期
%5p: 日志级别, 5位字符长度显示, 如果内容占不满5位则内容右对齐并在左侧补空格
%-5p: 5位字符长度显示日志级别, 如果内容占不满5位则内容左对齐并在右侧补空格, -代表左对齐
%logger: 日志所在包和类
%M: 日志所在方法名
%L: 日志所在代码行
%m: 日志正文
%n: 换行

<?xml version="1.0" encoding="UTF-8"?>
<!--scan: 当此属性设置为true时, 配置文件如果发生改变, 将会被重新加载, 默认值为true-->
<!--scanPeriod: 设置检测配置文件是否有修改时间的时间间隔, 如果没有给出时间单位, 默认单位是毫秒.
当scan为true时, 此属性生效, 默认的时间间隔为1分钟-->
<!--debug: 当此属性设置为true时, 将打印出logback内部日志信息, 实时查看logback运行状态. 默认值为false-->
<configuration scan="true" scanPeriod="60 seconds" debug="true">
<!--定义变量, 可通过 ${log.path}和${CONSOLE_LOG_PATTERN} 得到变量值-->
<property name="log.path" value="d:/log"/>
<property name="CONSOLE_LOG_PATTERN"
value="%d{yyyy-MM-dd HH:mm:ss.SSS} |-{%-5p} in %logger.%M[line-%L] -%m%n"/> <!--输出到控制台-->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!--Threshold=即是最低日志级别, 此appender输出大于等于对应级别的日志
(当然还要满足root中定义的最低级别)
-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>debug</level>
</filter>
<encoder>
<!--日志格式(引用变量)-->
<Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
<!--设置字符集-->
<charset>UTF-8</charset>
</encoder>
</appender>
<!--追加到文件中-->
<appender name="file1" class="ch.qos.logback.core.FileAppender">
<file>${log.path}/hello.log</file>
<encoder>
<Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
</encoder>
</appender>
<!--滚动追加到文件中-->
<appender name="file2" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--正在记录的日志文件的路径及文件名-->
<file>${log.path}/logback.log</file>
<!--日志文件输出格式-->
<encoder>
<Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
<charset>UTF-8</charset><!--设置字符集-->
</encoder>
<!--日志记录器的滚动策略, 按日期,按大小记录
文件超过最大尺寸后, 会创建文件, 然后新的日志文件中继续写入
如果日期变更, 也会新建文件, 然后在新的日志文件中写入当天日志
-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--新建文件后, 原日志改名为如下: %i=文件序号, 从0开始-->
<fileNamePattern>${log.path}/logback-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!--每个日志文件的最大体量-->
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>1kb</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文件保留天数 1=只保留昨天的归档日志文件, 不设置则保留所有日志-->
<maxHistory>1</maxHistory>
</rollingPolicy>
</appender> <root level="trace">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="file1"/>
<appender-ref ref="file2"/> </root>
</configuration>

7_Log的更多相关文章

  1. 安全基线自动化扫描、生成报告、加固的实现(以Tomcat为例)

    一.背景说明 当前在服务上线前,安全部门都会对服务基线配置进行把关,整个流程可以分为扫描.生成报告.修复三步. 在执行这一流程时当前普遍的做法是半自动化的,扫描和生成报告是自动化的,执行扫描.执行生成 ...

随机推荐

  1. 2022年字节跳动基础架构前端实习生凉经(4轮技术面+hr面)

    技术一面 原文链接:https://juejin.cn/post/7120516854203809829 因为我之前的项目经验有开发小程序的,所以一开始就问了小程序的问题 1.小程序onload和on ...

  2. day01 File类_Lambda

    File类 File类的每一个实例可以表示硬盘(文件系统)中的一个文件或目录(实际上表示的是一个抽象路径) 使用File可以做到: 1:访问其表示的文件或目录的属性信息,例如:名字,大小,修改时间等等 ...

  3. Webpack干货系列 | 怎么运用 Webpack 5 处理css/scss/sass、less、stylus样式资源

    程序员优雅哥简介:十年程序员,呆过央企外企私企,做过前端后端架构.分享vue.Java等前后端技术和架构. 本文摘要:主要讲解webpack 5 如何高效处理CSS 资源.scss/sass 资源.l ...

  4. 2522-Shiro系列--使用缓存对认证session和授权Cache进行存储

    如何进行session的缓存? 原理: Shiro有1个类,AuthorizingRealm AuthenticatingRealm,里面有个获取认证信息的方法, AuthenticatingReal ...

  5. MYSQL(基本篇)——一篇文章带你走进MYSQL的奇妙世界

    MYSQL(基本篇)--一篇文章带你走进MYSQL的奇妙世界 MYSQL算是我们程序员必不可少的一份求职工具了 无论在什么岗位,我们都可以看到应聘要求上所书写的"精通MYSQL等数据库及优化 ...

  6. Axure RP 8 实现 圆角文本框 圆角带筛选的下拉列表框 可自动显示滚动条

    刚开始用Axure 会发现 Axure 元件库并不是很齐全,很多元件需要自己想办法解决 或者去网上去找.其实个人建议网上有现成的元件可以就下载就不必花时间去折腾.除非你也想练练手,原型这种东西除非高保 ...

  7. Java连接数据库从入门到入土

    Java连接数据库 一.最原始的连接数据库 是没有导入任何数据源的:只导入了一个数据库驱动:mysql-connector-java-8.0.27.jar 首先是编写db.proterties文件 d ...

  8. Python 中MATLABspline函数的替代函数

    调用scipy模块,其中有对应的函数UnivariateSpline.与MATLAB中spline函数不同的是,这个函数返回值是一个插值函数,而非插值结果. import scipy spline = ...

  9. java-servlet-EL表达式和java标签

    1      Servlet线程安全问题 1st.              为什么说servlet会有线程安全问题? 容器默认情况下,对于某个servlet,只会创建一个实例. 容器收到一个请求,就 ...

  10. Oracle-DDL,DML理解以及应用

    SQL语句:虽然SQL语句不区分大小写,但是字符串的值时区分大小写的.SQL是结构化查询语句,操作数据库需要向数据库发送SQL语句,数据库会理解SQL语句中含义并执行SQL语句分为:DDL(数据定义语 ...